线性规划(Linear Programming 简记LP)是运筹学的一个重要分支,它起源于工业生产组织管理的决策问题,数学上它用来确定多变量线性函数在变量满足线性约束条件下的最优值。线性规划模型通常由三个要素—决策变量、目标函数和约束条件构成。一般来讲,决策变量是决策者为了达到预定目标而要控制的那些量,问题的求解就是找出决策变量的最终取值;
线性规划的基本点就是:在满足一定约束条件下使预定目标达到最优。
(1)可行解:满足全部约束条件的决策向量 x\in R^n 称为可行解;
(2)可行域:全部可行解构成的集合;
(3)最优解:使目标函数达到最优值(最大或最小值,并且有界)的可行解
定理:当线性规划问题有最优解时,一定可以在可行域的某个顶点上取到。当有唯一解时,最优解就是可行域的某个顶点。当有无穷多个最优解时,其中至少有一个解是可行域的一个顶点。
很多看起来不是线性规划的问题也可以通过变换转化为线性规划问题来求解,如问题
要把上面的问题转化成线性规划问题,主要注意到事实:对任意的xi,存在ui,vi>=0 满足
就可把上面的问题变成
函数:linprog
注意:scipy中线性规划的标准型:
注意目标函数转化为求最小值(如果求最大值则等号两面加负号)
约束条件全部改成小于
from scipy.optimize import linprog
c = [-1, 4]
A = [[-3, 1], [1, 2]]#类似系数矩阵
b = [6, 4]#类似结果矩阵
bound=((None,None),(-3,None))#x,y取值范围
res=linprog(c,A,b,None,None,bound)
print("目标函数的最小值:",res.fun)
print("最优解为:",res.x)
目标函数的最小值: -21.999999840824927
最优解为: [ 9.99999989 -2.99999999]
所以所求问题的最优解为:x1=10,x2=-3,目标函数最优值为-22
from scipy.optimize import linprog
c=[-1, 2, 3]; A = [[-2, 1, 1], [3, -1, -2]]
b=[[9], [-4]]; Aeq=[[4, -2, -1]]; beq=[-6]
LB=[-10, 0, None];
UB=[None]*len(c) #生成3个None的列表
bound=tuple(zip(LB, UB)) #生成决策向量界限的元组
res=linprog(c,A,b,Aeq,beq,bound)
print("目标函数的最小值:",res.fun)
print("最优解为:",res.x)
from scipy.optimize import linprog
c=[110, 120, 130, 110, 115,-150] #目标向量
A =[[1,1,0,0,0, 0],[0,0,1,1,1,0],[8.8,6.1,2.0,4.2,5.0,-6],[-8.8,-6.1,-2.0,-4.2,-5.0,3]]
b=[[200],[250],[0],[0]]; Aeq=[[1,1,1,1,1,-1]]; beq=[0]
res=linprog(c,A,b,Aeq,beq)
print("目标函数的最小值:",res.fun)
print("最优解为:",res.x)
cvxopt.solvers模块求解线性规划模型的标准型如下:
import numpy as np
from cvxopt import matrix, solvers
c=matrix([-4.,-5]); A=matrix([[2.,1],[1,2],[-1,0],[0,-1]]).T
b=matrix([3.,3,0,0]); sol=solvers.lp(c,A,b)
print("最优解为:\n",sol['x'])
print("最优值为:",sol['primal objective'])
import numpy
from cvxopt import matrix, solvers
c=matrix([2.,1]); A=matrix([[-1.,1],[-1,-1],[1,-2],[0,-1]]).T
b=matrix([1.,-2,4,0]); Aeq=matrix([1.,2],(1,2)) #Aeq为行向量
beq=matrix(3.5); sol=solvers.lp(c,A,b,Aeq,beq)
print("最优解为:\n",sol['x'])
print("最优值为:",sol['primal objective'])
已知某种商品6个仓库的存货量,8个客户对该商品的需求量,单位商品运价如表5.4所示,试确定6个仓库到8个客户的商品调运数量,使总的运输费用最小。
import cvxpy as cp
import numpy as np
import pandas as pd
d1=pd.read_excel("Pdata5_6.xlsx",header=None)
d2=d1.values; c=d2[:-1,:-1]
d=d2[-1,:-1].reshape(1,-1); e=d2[:-1,-1].reshape(-1,1)
x=cp.Variable((6,8))
obj=cp.Minimize(cp.sum(cp.multiply(c,x))) #构造目标函数
con=[cp.sum(x,axis=1,keepdims=True)<=e,
cp.sum(x,axis=0,keepdims=True)==d,x>=0] #构造约束条件
prob=cp.Problem(obj,con) #构造模型
prob.solve(solver='GLPK_MI',verbose=True) #求解模型
print("最优值为:",prob.value)
print("最优解为:\n",x.value)
灵敏度分析是指对系统因周围条件变化显示出来的敏感程度的分析。
在前面讨论的线性规划问题中,我们都设定 是常数,但在许多实际问题中,这些系数往往是估计值或预测值,经常有少许的变动。
例如在模型(5.1)和(5.2)中,如果市场条件发生变化, 值就会随之变化;生产工艺条件发生改变,会引起 变化; 也会由于种种原因产生改变。
因此提出这样两个问题:
(1)如果参数 中的一个或者几个发生了变化,现行最优方案会有什么变化?
(2)将这些参数的变化限制在什么范围内,原最优解仍是最优的?
要么自己改变条件一点点试,lingo软件可以直接求得当目标函数系数变化在什么范围内时,最优解不变,和约束条件右边在什么范围变化时,最优解不变