【问题标题】:How to change Cplex model during solution generation?如何在解决方案生成期间更改 Cplex 模型?
【发布时间】:2020-12-25 19:20:07
【问题描述】:

我有一个包含多个约束和解决方案池的 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,2,3,4,5,6,8]在另一个解决方案中。

之前,我使用 python random 来选择这个 SetAlt,但问题是我在所有解决方案中都有相同的 SetAlt。

【问题讨论】:

    标签: python python-3.x cplex docplex


    【解决方案1】:

    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]
    

    【讨论】:

    • 谢谢亚历克斯。从最后一部分,我了解到约束的相等值由 mdl.get_constraint_by_name("kids").rhs=nbKidsOptions[i] 改变,但我的情况不同。我需要添加具有不同界限的相同约束。我该如何实现它?
    • 嗨,github.com/AlexFleischerParis/zoodocplex/blob/master/… 中增量更改的其他示例
    • 您可以将模型生成代码包装在一个以 SetAlt 作为参数的函数中。然后从这些集合中生成尽可能多的模型并在它们上运行填充。
    • 使用这种方法,我有一个问题。我的解决方案变得非常相似,我不希望这种情况发生。如何确保来自不同模型的解决方案彼此之间存在很大差异?
    • 你可以看看这个问题的答案,stackoverflow.com/questions/63781282/…,它解释了如何使用多样性过滤器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多