使用python scipy.optimize linprog和lingo线性规划求解最大值,最小值(运筹学学习笔记)
1.线性规划模型:
2.使用python scipy.optimize linprog求解模型最优解:
在这里我们用到scipy中的linprog进行求解,linprog的用法见https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linprog.html
scipy.optimize.
linprog
(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simplex', callback=None, options=None)
method = 'simplex'(单纯形法),bounds确定边界,x≥0为(0,None)。
要使用linprog,目标函数要变成求最小值,如果原题目要求求max(最大值),只需对目标函数取负,但要注意求解的最终值是取负后的目标函数的最小值,取负即为最大值。
下面为具体python代码:
import numpy as np from scipy.optimize import linprog c = np.array([1,2,3]) A_ub = np.array([[-2,1,1],[3,-1,-2]]) b_ub = np.array([9,-4]) A_eq = np.array([[3,-2,-3]]) b_eq = np.array([-6]) r = linprog(c,A_ub,b_ub,A_eq,b_eq,bounds=((None,0),(0,None),(None,None))) print(r)
程序的输出结果为:
fun: -22.0
message: 'Optimization terminated successfully.'
nit: 3
slack: array([ 0., 7., 0.])
status: 0
success: True
x: array([-7., 0., -5.])
fun为目标函数的最优值,slack为松弛变量,status表示优化结果状态,在这里不用过于追究,x为最优解。
最优解为-22
3.使用lingo进行线性规划:
当模型不是很大是可以用lingo求解,下面为lingo求解过程:
-----------------------------------------------------------------------------------------------------------------------
min=x1+2*x2+3*x3;
-2*x1+x2+x3<=9;
-3*x1+x2+2*x3>=4;
3*x1-2*x2-3*x3=-6;
x1<=0;
@free(x1);@free(x3);
-----------------------------------------------------------------------------------------------------------------------
目标函数使用max=或者min=表示,注意不是max z=。在lingo中变量默认为非负,使用@free可以解除限制。注意每一行结束要是用“;”,这点跟c类似。
求解结果为:
Objective value: -22.00000
Variable Value
X1 -7.000000
X2 0.000000
X3 -5.000000
结果跟python相同。