Python 和 Matlab 中的 linprog 函数都可以用于求解线性规划问题,两者在语法上基本相似。
Python:
主要利用 scipy 库,scipy.optimize.linprog,求线性等式和不等式约束下求目标函数的最小值。
调用格式:scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method=‘interior-point’, callback=None,options=None,)
可以参考官方网站
其中:
c - 价值向量;
A_ub,b_ub - 不等式约束左右两边的系数(矩阵);
A_eq,b_eq - 等式约束左右两边的系数(矩阵);
bounds - 决策变量 x 的范围,默认(0,+ 无穷);
method - 算法类型(‘interior-point’ (默认),‘revised simplex’,‘simplex’ );
callback,可选。
在MATLAB中用CVX实现线性规划问题求解
下面给出标准式和例题便于理解:
1 | #导入包 |
结果中我们主要看 fun 和 x,将 fun 加上符号就得到最大值,x 是一维数组,分别是 x1,x2,x3 的值。message:优化成功结束;nit:当前迭代次数为 5 次;slack: 松弛变量的值;status:算法的状态(整数表示),0 : Optimization proceeding nominally;1 : Iteration limit reached;2 : Problem appears to be infeasible;3 : Problem appears to be unbounded;4 : Numerical difficulties encountered。
Matlab:
其默认也是求最小值,在 matlab 中,线性规划问题可以描述如下(实质和 python 一样):
调用格式:
[x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq,lb,ub)
其中:
x:决策变量;
fval:目标值;
exitflag:描述程序运行的情况,若为 1,说明程序收敛;0 则说明迭代次数达到了设定的最大次数;小于 0,说明情况比较多;
output:iteration 表示迭代次数,algorithm 表示算法;
lambda:为解 x 处的 lagrange 乘子,即影子价格,在命令行输入 lambda.ineqlin 即得到对应的影子价格。
参考博客
同样是上面的例题,matlab 中的代码如下(我这里是一个 Script 文件代码,你可以一行一行的输入到命令窗口,效果更好些):
1 | clc; |
输出结果:
1 | exitflag = |
可见,两种方法的结果一致,但 x 的值却不相等,说明该问题解不唯一。还有,matlab 中的 linprog 函数中的 x 默认是一列向量,而 python 中的 x 是一个一维数组。