线性规划问题,像这样的
可以选择用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=[70,50,60]
可以称为约束矩阵
约束方程,如上图的一段
"""
21+42+33⩽150
"""
对于这部分
# 部分
const_matrix=[2,4,3,150]
# 如果写全
const_matrix=[[2,4,3,150],[3,1,5,160],[7,3,5,200]]
,确定的意思,是用来决定
>=,
<=,
=
这三个的,有可能不是所有的约束都是<=,还有其他。如何不写默认会生成<=的选择,即0
定义范围,正数,也可以写其他。
目标,默认求最大max,也可以写最小min
求解器
[:, -1] --取最后一列
[:, :-1]--取除去最后一列的其他列
这里是python语言,python310 之后就可以直接用,用是match...case,实际上就是switch
一个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
"""
可以运行,有待修改,需要检验,比较麻烦。