在 docplex 中添加二次约束

问题描述

我在 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)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...