线性规划求解清晰两部分
- 目标函数(max,min)
- 约束条件(s.t.)
- 求解前应转化为标准形式:
s.t.
Matlab求解代码
[x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS)
1.1 scipy库求解
from scipy import optimize import numpy as np #直接用np代替numpy #求解函数 res=optimize.linprog(c,A,b,Aeq,beq,LB,UB,XO,OPTIONS) #目标函数最小值 print(res.fun) #最优解 print(res.x)
res对象
res.fun表示最小值
res.x表示最优解
例一
第一行表示最大值,但是标准的是最小值,所以输出的c取负值
注意上方的第三行,不等号方向相反则
c=np.array([2,3,-5]) A=np.array([[-2,5,-1],[1,3,1]]) b=np.array([-10,12]) Aeq=np.array([[1,1,1]]) beq=np.array([7]) #注意数组的表示[为列][[为行]] res=optimize.linprog(-c,A,b,Aeq,beq) print(res)
1.2 pulp库求解
对于pulp库
value() – Finds the value of a variable or expression
lpSum() – given a list of the form [a1*x1, a2x2, …, anxn] will construct a linear expression to be used as a constraint or variable
lpDot() --given two lists of the form [a1, a2, …, an] and [ x1, x2, …, xn] will construct a linear expression to be used as a constraint or variable
# pulp库求解
import panda
import numpy
import pulp
# 目标函数的系数
z = [2,3,1]
#约束
a = [[1,4,2],[3,2,0]]
b = [8, 6]
#x=pulp.LpVariable("x",0,3)
#prob=pulp.LpProblem("ss",pulp.LpMinmize)
#确定最大化最小化问题,最大化只要把Min改成Max即可
m = pulp.LpProblem(sense=pulp.LpMinimize)
#定义三个变量放到列表中
for i in range(1,4):
x = [pulp.LpVariable(f'x{i}', lowBound=0)]
#定义目标函数,lpDot可以将两个列表的对应位相乘再加和
#相当于z[0]*x[0]+z[1]*x[1]+z[2]*x[2]
m += pulp.lpDot(z, x)
#设置约束条件
for i in range(len(a)):
m += (pulp.lpDot(a[i], x) >= b[i])
#求解
m.solve()
#输出结果
print(f'优化结果:{pulp.value(m.objective)}')
print(f'参数取值:{[pulp.value(var) for var in x]}')



