问题描述
我在 python 中通过 docplex 编写二次约束时遇到问题
这是我的约束:
A[i,j,k]=Z[i,k] *h[i,k]+Q[i,k]*d[i,k] ∀i,k
我写的约束如下:
mdl.add_quadratic_constraints(z_qsd[i,k]*h_qsd[i,k]+Q_qsd[i,k]*d_qsd[i,k]==A_qsd[i,k] i in q_ualification for j in s_hift for k in d_ay)
当我解决模型时,我收到以下消息:
模型非凸
解决方法
乘法运算符“*”已在 DOcplex 中重载以编写二次表达式。换句话说,您可以将两个变量相乘。 忘记索引,并假设您只有四个变量 A,z,h,Q 约束可以写成:
mdl.add(A == Z *h + Q *d)
现在,对于三维变量,您应该使用 Model.continuous_var_cube 的变体(更改类型),例如:
As = mdl.continous_var_cube(3,5,7,"A")
它构建了一个 Python 变量字典,由变量的笛卡尔积中的索引元组索引 三个范围 (1..3)x(1..5)x(1..7),即 3x5x7 = 85 个变量。 每个变量都可以通过索引集合访问, 如
a123 = As[1,2,3]
,
这是一个小的二次目标 问题示例,灵感来自 Alex Fleischer 著名的“动物园”示例 (有关更多信息,请参阅 https://www.linkedin.com/pulse/making-optimization-simple-python-alex-fleischer/)
mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300,'kids')
# X**2 is the square of variable X
mdl.minimize(500 * nbbus40**2 + 400 * nbbus30**2)
mdl.solve()
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)