利用 python 和 matlab 求解简单的线性规划问题

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

#导入包
from scipy import optimize
import numpy as np
#确定 c,A,b,Aeq,beq
c = np.array ([-1,-2,-1]) #由于求 max, 所以价值向量取符号
A_ub = np.array([[1,3,-1],[-1,2,-1]])
b_ub= np.array ([8,-5])  # 由于第二个约束条件为 '>=', 两边同乘符号
A_eq = np.array([[1,1,1]])
b_eq = np.array([6])
x1_bounds = (0, None)
x2_bounds = (0, None)
x3_bounds = (0, None)
#求解
res = optimize.linprog(c,A_ub,b_ub,A_eq,b_eq,bounds=[x1_bounds,x2_bounds,x3_bounds])
print(res)

#输出结果
con: array([1.67785785e-11])
fun: -6.333333333299136
message: 'Optimization terminated successfully.'
nit: 5
slack: array([3.78165540e+00, 3.54765106e-11])
status: 0
success: True
x: array([4.44250564, 0.33333333, 1.22416103])

结果中我们主要看 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
2
3
4
5
6
7
8
9
10
11

clc;
clear all;
f=[-1 -2 -1];
A = [1 3 -1;-1 2 -1];
b = [8 -5];
Aeq=[1 1 1];
beq=6;
lb=zeros (3,1);  %3 行 1 列,表示 x 的下界
[x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq,lb,[]);
disp(x);
disp (-fval);  % 最大值需要加上符号

输出结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

exitflag =
     1
     
output =
         iterations: 6
          algorithm: 'large-scale: interior point'
       cgiterations: 0
            message: 'Optimization terminated.'
    constrviolation: 1.7764e-14
      firstorderopt: 2.9417e-10
     
lambda =
    ineqlin: [2x1 double]
      eqlin: 1.3333
      upper: [3x1 double]
      lower: [3x1 double]
     
Optimization terminated.
    1.9752
    0.3333
    3.6914
   
    6.3333

可见,两种方法的结果一致,但 x 的值却不相等,说明该问题解不唯一。还有,matlab 中的 linprog 函数中的 x 默认是一列向量,而 python 中的 x 是一个一维数组。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值