在解决方案生成过程中如何更改Cplex模型?

2024-06-26 09:57:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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为每个解决方案随机选取这2个值。换句话说,我需要cplex在解决方案池生成期间更改此约束的模型

例如,如果在一个解中R_alt=[0,1,2,3,6,7,8]上有6C,那么在另一个解中得到R_alt=[0,2,3,4,5,6,8]

以前,我使用PythonRandom选择这个SetAlt,但问题是我在所有解决方案中都使用相同的SetAlt


Tags: in模型addformodelif解决方案alt
1条回答
网友
1楼 · 发布于 2024-06-26 09:57:15

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]

相关问题 更多 >