使用背景
通过 numpy 定义存储自变量系数,或者参与自变量的四则运算;
通过 docplex 定义决策变量(自变量) ,添加约束,求解函数
使用方式:
# 导入库
import numpy as np
from docplex.mp.model import Model
# 定义优化模型
mdl = Model(name='example_dot')
# 定义系数数组、定义决策变量
x = np.array([1, 2, 3])
y = mdl.continuous_var_list(3, lb=-1.0, ub=1.0, name='y')
# 定义约束条件
cst = [y[i] >= 0 for i in range(3)] + [mdl.sum(y) <=4] + [mdl.sum([y[i] for i in range(1,3)]) == 2]
for c in cst:
mdl.add_constraint(c)
# 定义优化函数
dot_product = np.dot(x, y)
# 最大化优化函数,并求解
mdl.maximize(dot_product)
solution = mdl.solve()
# 输出决策变量的结果
if solution: # 使用 if 判断是否有结果
print("y = {0}".format([y[i].solution_value for i in range(3)]))
print("点积 = {0}".format(dot_product.solution_value))
else:
print("无解")
注意:
# 定义约束条件
cst = [y[i] >= 0 for i in range(3)] + [mdl.sum(y) <=4] + + [mdl.sum([y[i] for i in range(1,3)]) == 2]
[y[i] >= 0 for i in range(3)]
- 在定义约束条件的时候,这里是用列表的形式存储约束条件的。
- 决策变量是通过 mdl.continuous_var_list() 定义的,因此要遍历每一个变量,然后对其施加约束。
[mdl.sum(y) <=4]
- 这是针对所有的决策变量定义的约束条件,让它们的和小于某个数值。
[mdl.sum([y[i] for i in range(1,3)]) == 2]
- 针对 y1 和 y2 单独添加约束
cst 的输出形式如下图;其中 GE是 大于等于的约束;LE 是 小于等于的约束;EQ是 等于约束条件。
整个程序的运行结果: