例题:
靠近河流有两个化工厂(见图1-1),流经第一化工厂的河流流量为每天500万立方米,在两个工厂之间有一条流量为每天200万立方米的支流。
(图1-1)
①化工厂每天排放含有某种有害物质的工业污水2万立方米,第二化工厂每天排放这种工业污水1.4万立方米。从第一化工厂排出的工业污水流到第二化工厂以前,有20%可自然净化。根据环保要求,河流中工业污水的含量应不大于0.2%。这两个工厂都需各自处理一部分工业污水。第一化工厂处理工业污水的成本是1000元/万立方米。
②化工厂处理工业污水的成本是800元/万立方米。现在要问在满足环保要求的条件下,每厂各应处理多少工业污水,使这两个工厂总的处理工业污水费用最小。
题解:
设为第一工厂处理污水量,
为第二工厂处理污水量
列出目标函数和约束条件:
目标函数:
约束条件:
python实现:
第一种方法
import numpy as np
from scipy.optimize import linprog
# 定义目标函数的系数(取负值,因为我们需要求解的是最大化问题)
c = np.array([1000, 800])
# 定义约束条件矩阵 A 和向量 b
A = np.array([[-0.8, -1]])
b = np.array([-1.6])
# 定义变量的边界
x_bounds = (1, 2)
y_bounds = (0, 1.4)
# 求解线性规划问题
res = linprog(c, A_ub=A, b_ub=b, bounds=(x_bounds, y_bounds))
print("Optimal value:", res.fun)
print("Optimal solution:", res.x)
输出结果为:
Optimal value: 1640.0
Optimal solution: [1. 0.8]
第二种方法:
# import package
import pulp as pl
# initialize model
model = pl.LpProblem(name='wushui', sense=pl.LpMinimize)
# define variables
x = pl.LpVariable(name='x', cat='Continuous')
y = pl.LpVariable(name='y', cat='Continuous')
# add constrains
model += (0.8 * x + y - 1.6 >= 0)
model += (x - 2 <= 0)
model += (y - 1.4 <= 0)
model += (x - 1 >= 0)
model += (y >= 0)
# add formular
model += 1000 * x + 800 * y
# run solver
status=model.solve()
# output
print(f"status: {model.status}, {pl.LpStatus[model.status]}")
print(f"objective: {model.objective.value()}")
for var in model.variables():
print(f"{var.name}: {var.value()}")
for name, constraint in model.constraints.items():
print(f"{name}: {constraint.value()}")
输出结果为:
status: 1, Optimal
objective: 1640.0
x: 1.0
y: 0.8
_C1: 0.0
_C2: -1.0
_C3: -0.5999999999999999
_C4: 0.0
_C5: 0.8