问题描述
我有一个具有多个约束的Cplex模型和一个解决方案池。我的限制之一是:
R_alt=[i for i in R if i not in SetAlt]
model.add_constraints((model.sum(x[i,j] for j in R2 ) == 2 for i in R_alt),"6C" )
model.add_constraints((x[i,n1-4] ==x[i,n1-2] for i in R_alt ),"7C" )
SetAlt是2个值的集合,在进行约束之前将从R_alt中删除。我需要这两个值由cplex为每个解决方案随机选择。换句话说,在解决方案池生成过程中,我需要cplex在此约束下更改模型。
例如,如果在一种解决方案中R_alt = [0,1,2,3,6,7,8]上具有6C,则我得到R_alt = [0,4,5,8]在另一个解决方案中。
之前,我使用python random来选择此SetAlt,但问题是我在所有解决方案中都使用相同的SetAlt。
解决方法
在https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoomontecarlooptimization.py
中import random
import math
random.seed(1)
from docplex.mp.model import Model
# original model
nbKids=300
mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
costBus40=500.0;
costBus30=400.0;
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= nbKids,'kids')
mdl.minimize(nbbus40*costBus40 + nbbus30*costBus30)
nbSamples=20
nbMaxKidsAbsent=30;
nbKidsLess=[random.randint(0,nbMaxKidsAbsent) for i in range(0,nbSamples)]
nbKidsOptions=[nbKids-nbKidsLess[i] for i in range(0,nbSamples)]
#Monte Carlo optimization
totalCost=0.0;
for i in range(0,nbSamples):
mdl.get_constraint_by_name("kids").rhs=nbKidsOptions[i]
mdl.solve()
cost=mdl.solution.get_objective_value()
totalCost+=cost
print("if we need to bring ",nbKidsOptions[i]," kids to the zoo");
print("cost = ",cost)
print()
averageCost=1/nbSamples*totalCost
print("------------------------------");
print("average cost = ",math.ceil(averageCost));
您可能会找到一个更改约束并再次求解的示例:
mdl.get_constraint_by_name("kids").rhs=nbKidsOptions[i]