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