使用背景
- 求解未知数的值的时候可以使用 docplex 进行求解 == 用来求 y = f(X) 中 X 的取值。(可以有约束,可以没有约束)
- 求解优化问题时候使用
- 优化目标 === 目标函数
- 含有约束条件
- 最大化/最小化 目标函数
- 输出自变量的取值
总结:含有自变量,不知道具体取值,但可以知道自变量满足的限定条件。
场景举例
有一个工厂,生产两种产品:A 和 B。生产每种产品需要一定的原材料和工人,并且生产这两种产品都有一定的利润。工厂有限的原材料和工人,所以我们需要计算出生产多少 A 产品和 B 产品,使得利润最大。
自定义生产情况和限制情况:
1. 设 A 产品 生产了 X1 ; B 产品 生产了 X2 ; 》》》 未知数
2. 生产A可以赚5块钱,生产B可以赚10块; 那么利润函数 Z = 5X1 + 10X2 》》》 优化目标
3. A 产品 和 B 产品一共最多可以生产 200件。 X1 + X2 <= 200 》》》 约束条件 1
4. 生产 A 需要两个工人,生产 B 需要三个工人,一共有 500个工人。 2X1 + 3X2 <= 500 》》》 约束条件 2
=====》》 函数表达整理:
利润最大化
Z = 5X1 + 10X2
约束条件:
X1 + X2 <= 200 (原材料限制)
2X1 + 3X2 <= 500 (工人限制)
X1 >= 0, X2 >= 0 (非负限制)
1. 定义优化模型
# 导入必要的库
from docplex.mp.model import Model
# 创建模型
mdl = Model(name='factory_production')
2. 创建决策变量
# 定义变量
x1 = mdl.integer_var(lb=0, name='x1')
x2 = mdl.integer_var(lb=0, name='x2')
3. 定义优化函数
# 定义目标函数
obj = 5 * x1 + 10 * x2
4. 定义约束条件
# 定义约束条件 (直接添加)
mdl.add_constraint(x1 + x2 <= 200)
mdl.add_constraint(2 * x1 + 3 * x2 <= 500)
5. 最大化/最小化 目标函数,并求解
# 最大化目标函数
mdl.maximize(obj)
# 优化器求解
solution = mdl.solve()
6. 获取求解数据
# 输出结果
print("生产 A 产品的数量:", x1.solution_value)
print("生产 B 产品的数量:", x2.solution_value)
print("最大利润:", mdl.objective_value)
7. 代码内容总结
from docplex.mp.model import Model
# 创建模型
mdl = Model(name='factory_production')
# 定义变量
x1 = mdl.integer_var(lb=0, name='x1')
x2 = mdl.integer_var(lb=0, name='x2')
# 定义目标函数
mdl.maximize(5 * x1 + 10 * x2)
# 定义约束条件
mdl.add_constraint(x1 + x2 <= 200)
mdl.add_constraint(2 * x1 + 3 * x2 <= 500)
# 求解
solution = mdl.solve()
# 输出结果
print("生产 A 产品的数量:", x1.solution_value)
print("生产 B 产品的数量:", x2.solution_value)
print("最大利润:", mdl.objective_value)