0

我正在使用docplex(docplex.md.model)来解决最小化问题,并且我的目标函数具有三个变量(一个连续变量和两个二进制变量)的乘积,在运行代码时出现此错误:

DOcplexException: Cannot multiply -x1*x21 by x2, some terms would have degree >= 3. Maximum polynomial degree is 2.

我该如何解决这个问题?

谢谢你。

4

1 回答 1

1

CPLEX 的 2 个选项:

  1. 您使用 CPOptimizer,然后您可以编写您需要的任何约束。

Easy optimization python 中,请参阅非线性函数

from docplex.cp.model import CpoModel

mdl = CpoModel(name='buses')
nbbus40 = mdl.integer_var(0,1000,name='nbBus40')
nbbus30 = mdl.integer_var(0,1000,name='nbBus30')
mdl.add(nbbus40*40 + nbbus30*30 >= 300)

#non linear objective
mdl.minimize(mdl.exponent(nbbus40)*500 + mdl.exponent(nbbus30)*400)

msol=mdl.solve()

print(msol[nbbus40]," buses 40 seats")
print(msol[nbbus30]," buses 30 seats") 

但是你需要把你的浮动决策变量变成一个表达式

https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoodecimalcpo.py

from docplex.cp.model import CpoModel

mdl = CpoModel(name='buses')

#now suppose we can book a % of buses not only complete buses

scale=100
scalenbbus40 = mdl.integer_var(0,1000,name='scalenbBus40')
scalenbbus30 = mdl.integer_var(0,1000,name='scalenbBus30')

nbbus40= scalenbbus40 / scale
nbbus30= scalenbbus30 / scale

 

mdl.add(nbbus40*40 + nbbus30*30 >= 310)
mdl.minimize(nbbus40*500 + nbbus30*400)

msol=mdl.solve()

print(msol[scalenbbus40]/scale," buses 40 seats")
print(msol[scalenbbus30]/scale," buses 30 seats")
  1. 你继续使用 MIP,但你改变了你的约束。

请参阅乘以 2 个二进制变量

#suppose we want z=x*y

from docplex.mp.model import Model
mdl = Model(name='mutiply binary decision variables')

x = mdl.binary_var(name='x')
y = mdl.binary_var(name='y')

z= mdl.binary_var(name='z')

mdl.add(x+y<=1+z)
mdl.add(z<=x)
mdl.add(z<=y)

mdl.add(z==1)

# We could also write
#mdl.add(z==mdl.min(x,y))
# or
#mdl.add(z==(mdl.logical_and((x==1),(y==1))))


mdl.solve()

decisionVars=[x,y,z]

for v in decisionVars:
    print(v.name," = ",v.solution_value)

乘以二进制和其他变量

from docplex.mp.model import Model
mdl = Model(name='mutiply binary by decision variable')

b = mdl.binary_var(name='b')
x = mdl.integer_var(name='x',lb=0,ub=10)

bx= mdl.integer_var(name='bx')

mdl.maximize(x)

mdl.add(bx<=7)

mdl.add(mdl.if_then((b==0),(bx==0)))
mdl.add(mdl.if_then((b==1),(bx==x)))

mdl.solve()

decisionVars=[b,x]

for v in decisionVars:
    print(v.name," = ",v.solution_value)
于 2022-01-28T07:11:38.253 回答