python对线性规划简单求解

前言

线性规划问题,像这样的

python对线性规划简单求解_第1张图片

可以选择用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

可以称为约束矩阵

约束方程,如上图的一段

"""
21+42+33⩽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等来解一解

再来道题

python对线性规划简单求解_第2张图片

代码

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
"""

总结

可以运行,有待修改,需要检验,比较麻烦。

你可能感兴趣的:(数学建模,python)