前言
线性规划问题,像这样的

可以选择用lindo,lingo,matlab等,python这类问题的简单求解,当然还有其他复杂的线性规划,先不管。简单点,就只对这类问题的求解
库的使用
用的是cvxpy和numpy
正文
直接给出代码(其实感觉还是有点虚的,不知道会不会有错,自己比较菜)
def line_progra(
expr: list,
cons_matrix: list[list],
determine: list = None,
pos=True,
aim='max',
solver='GLPK_MI'
):
"""
:param expr:方程的
:param cons_matrix:约束方程
:param determine:判断大小,只有的0,1列表
:param pos:正数,True
:param aim:目标
:param solver:求解器
:return:
"""
"""求解线性规划模型"""
expr_vec = np.array(expr)
constraint_matrix = np.array(cons_matrix)
right_vec = constraint_matrix[:, -1]
constraint_matrix = constraint_matrix[:, :-1]
num = len(constraint_matrix)
x_num=len(expr)
if determine is None:
determine=a=np.zeros(num,dtype=int)
x = cp.Variable(x_num, pos=pos)
constraint = []
if aim == 'max':
target = cp.Maximize(expr_vec @ x)
if aim=='min':
target=cp.Minimize(expr_vec@x)
for i, t in zip(range(num), determine):
match t:
case 0:
constraint.append(constraint_matrix[i] @ x <= right_vec[i])
case 1:
constraint.append(constraint_matrix[i] @ x >= right_vec[i])
case 2:
constraint.append(constraint_matrix[i] @ x == right_vec[i])
pass
solution = cp.Problem(target, constraint)
solution.solve(solver=solver)
return x.value, solution.value解释代码
参数
expr
可以称为目标向量,就是需要求的方程的系数,怎么叫都行
对于图来说,就是指
expr=[70,50,60]cons_matrix
可以称为约束矩阵
约束方程,如上图的一段
"""
2?1+4?2+3?3⩽150
"""对于这部分
# 部分
const_matrix=[2,4,3,150]
# 如果写全
const_matrix=[[2,4,3,150],[3,1,5,160],[7,3,5,200]]determine
,确定的意思,是用来决定
>=,
<=,
=
这三个的,有可能不是所有的约束都是<=,还有其他。如何不写默认会生成<=的选择,即0
pos=True
定义范围,正数,也可以写其他。
aim
目标,默认求最大max,也可以写最小min
solver
求解器
过程
运用numpy的切片
[:, -1] --取最后一列
[:, :-1]--取除去最后一列的其他列
运用了switch
这里是python语言,python310 之后就可以直接用,用是match...case,实际上就是switch
运用了zip函数
返回值
一个x的值,是个列表
另外就是目标的解
操作
比如上面那个图,
运行
a,b=line_progra(
[70,50,60],
[[2,4,3,150],[3,1,5,160],[7,3,5,200]],
)
# 因为全是<=,determine不需要写,aim默认为'max',也不需要写
print(a,b)结果
"""
[15.90909091 29.54545455 0. ] 2590.909090909091
"""
# 不放心可以用其他方法lindo等来解一解再来道题

代码
a,b=line_progra(
[360,220,240,360,220,240],
[[1,1,1,0,0,0,300],[0,0,0,1,1,1,1200],[1,0,0,1,0,0,6000],[0,1,0,0,1,0,500],[0,0,1,0,0,1,1000],[1,0,0,-4,0,0,0],[0,9,0,0,-1,0,0]],
[0,0,0,0,0,1,1],
)
# 也约束矩阵写都太麻烦,应该想办法写个填充,就不用写0了
# 下面[0,0,0,0,0,1,1],是指4个<= (0),2个>= (1),
print(a,b)结果
:"""
[ 285.71428571 14.28571429 0. 71.42857143 128.57142857
1000. ] 400000.0
"""总结
可以运行,有待修改,需要检验,比较麻烦。
?????
版权声明:本文为qq_63401240原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。