在 CPLEX 上实施软规则
Implementing Soft rules on CPLEX
我有一个模型需要向其添加新约束,但我希望“仅”在可能的情况下实施此规则。有没有办法用 cplex 或 cplex 来实现这个?
您可以使用休闲裤使约束变得柔软:
from docplex.mp.model import Model
mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
slack=mdl.integer_var(name='slack')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.add_constraint(nbbus40+nbbus30<=7+slack,'softconstraint')
mdl.minimize(nbbus40*500 + nbbus30*400+10000*slack)
mdl.solve()
mdl.export("c:\temp\buses.lp")
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
这给出了
nbBus40 = 6.0
nbBus30 = 2.0
slack = 1.0
为什么不尝试逻辑约束?
https://github.com/AlexFleischerParis/zoodocplex/blob/master/zooifthen.py
from docplex.mp.model import Model
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')
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
print()
print("with if nb buses 40 more than 3 then nbBuses30 more than 7")
#if then constraint
mdl.add(mdl.if_then(nbbus40>=3,nbbus30>=7))
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
'''
which gives
nbBus40 = 6.0
nbBus30 = 2.0
with if nb buses 40 more than 3 then nbBuses30 more than 7
nbBus40 = 0
nbBus30 = 10.0
'''
我有一个模型需要向其添加新约束,但我希望“仅”在可能的情况下实施此规则。有没有办法用 cplex 或 cplex 来实现这个?
您可以使用休闲裤使约束变得柔软:
from docplex.mp.model import Model
mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
slack=mdl.integer_var(name='slack')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.add_constraint(nbbus40+nbbus30<=7+slack,'softconstraint')
mdl.minimize(nbbus40*500 + nbbus30*400+10000*slack)
mdl.solve()
mdl.export("c:\temp\buses.lp")
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
这给出了
nbBus40 = 6.0
nbBus30 = 2.0
slack = 1.0
为什么不尝试逻辑约束?
https://github.com/AlexFleischerParis/zoodocplex/blob/master/zooifthen.py
from docplex.mp.model import Model
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')
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
print()
print("with if nb buses 40 more than 3 then nbBuses30 more than 7")
#if then constraint
mdl.add(mdl.if_then(nbbus40>=3,nbbus30>=7))
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
'''
which gives
nbBus40 = 6.0
nbBus30 = 2.0
with if nb buses 40 more than 3 then nbBuses30 more than 7
nbBus40 = 0
nbBus30 = 10.0
'''