Python解运筹学问题

PuLP

一般线性规划问题

例题:无最优解问题

from pulp import *

#构建问题
my_LpProblem = pulp.LpProblem("myProblem", LpMaximize)
# 设置变量
x1 = pulp.LpVariable("x1", 0, None)
x2 = pulp.LpVariable("x2", 0, None)
x3 = pulp.LpVariable("x3", 0, None)
# 最有函数
my_LpProblem += -x1+x2+x3
# 约束条件
my_LpProblem += x1 - x2 +2*x3 <= 10
my_LpProblem +=-x1 + x2 +  x3 >= 4
my_LpProblem +=-x1      +  x3 == 2
# 求解
status = my_LpProblem.solve()
print("Status:", LpStatus[my_LpProblem.status])
# 打印出最优解
for v in my_LpProblem.variables():
    print(v.name, "=", v.varValue)
# 打印最优目标函数值
print("objective=", value(my_LpProblem.objective))

构造并求解混合0-1整数规划问题

例题:在这里插入图片描述

from pulp import *

my_MipProblem = LpProblem("myproblem", LpMinimize)

solution = []

x1 = LpVariable("x1", lowBound=0, cat=LpInteger)# LpInteger:整数型
x2 = LpVariable("x2", cat=LpBinary)# LpBinary:0—1型


x3 = LpVariable("x3", lowBound=0)

my_MipProblem += 2 * x1 + 3 * x2 + x3, "obj"
my_MipProblem += 2 * x1 -     x2 + 3 * x3 >= 6, "c1"
my_MipProblem += 4 * x1 +     x2 + 5 * x3 == 24, "c2"

my_MipProblem.solve()
# 打印出已经求解问题的状态

print("Status:", LpStatus[my_MipProblem.status])

# 打印出最优解

for v in my_MipProblem.variables():
    print(v.name, "=", v.varValue)

    solution.append(v.varValue)

# 打印最优目标函数值
print("objective=", value(my_MipProblem.objective))

numpy和scipy

用scipy的linprog求解以下线性规划问题

标准问题(最小值,约束为<=)

例题:在这里插入图片描述

import numpy as np
from scipy.optimize import linprog

c = np.array([-6, -1, -2])
A_ub = np.array([[1, 3, 1], [2, 0, 1], [1, 1, 0]])
b_ub = np.array([12, 6, 2])
x1_bounds = [0, None]
x2_bounds = [0, None]
x3_bounds = [0, None]

my_linprog_result = linprog(c, A_ub, b_ub, A_eq=None, b_eq=None, bounds=(x1_bounds, x2_bounds, x3_bounds), callback=None)
my_solution = my_linprog_result.x
my_optimum_value = my_linprog_result.fun
print(my_solution)
print(my_optimum_value)


非标准形式

用linprog求解时,只能求解最小值且为小于约束的问题,如果要求解其他问题,则需先变换成规定的标准形式。

例题:在这里插入图片描述

import numpy as np
from scipy.optimize import linprog

c = np.array([-1,-1,2]) # 最大值变为最小值,取相反数
A_ub = np.array([[1
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值