【问题标题】:How do I switch the max function from CPLEX OPL to Docplex?如何将 max 函数从 CPLEX OPL 切换到 Docplex?
【发布时间】:2021-07-18 04:23:47
【问题描述】:

我在 CPLEX OPL 上实施了以下限制。

forall (i in N)
        forall (j in M)
            forall (k in 1..i)
                sum(z in 1 ..i)(p[z]*(x[z][j][k]+y[z][j][k])) + (t[k]*max(z in 1 ..i)(x[z][j][k]+y[z][j][k]))<= d[i];
    

我已经尝试在 Docplex (python) 中实现它,但我不知道它是否真的有效,有谁知道如何将 max 函数从 CPLEX OPL 切换到 Docplex,或者我所做的是否可以?

for i in N:
    for j in M:
        for k in range(i):
            mdl.sum((x[(i,j,k)]+y[(i,j,k)])*p[z] for z in range(i))+(t[k]*mdl.max(x[(z,j,k)]+y[(z,j,k)] for z in range(i)) <= d[i]
    

【问题讨论】:

    标签: python modeling cplex opl docplex


    【解决方案1】:

    mdl.max 就是这样。

    在 OPL 中 https://github.com/AlexFleischerParis/zooopl/blob/master/zoomax.mod

    int nbKids=300;
    
    {int} buses={30,40,50};
    
    
    dvar int+ nbBus[buses];
    dvar int maxNbOfBusesGivenSize;
    
        
    minimize maxNbOfBusesGivenSize;
         
    subject to
    {
     // logical constraint
     // maxNbOfBusesGivenSize is the max of all nbBus
     maxNbOfBusesGivenSize==max(i in buses) nbBus[i];
     sum(i in buses) i*nbBus[i]>=nbKids;
    }
    
    execute DISPLAY_After_SOLVE
    {
      writeln("The max number of buses is ",maxNbOfBusesGivenSize);
      writeln("nbBus = ",nbBus);
    }
    

    而在 python 中https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoomax.py

    from docplex.mp.model import Model
    
    mdl = Model(name='buses')
    
    nbKids=300;
    buses=[30,40,50]
    
    #decision variables
    mdl.nbBus = {b: mdl.integer_var(name="nbBus"+str(b)) for b in buses}
    
    # Constraint
    mdl.add_constraint(sum(mdl.nbBus[b]*b for b in buses) >= nbKids, 'kids')
    
    # Objective
    # logical constraint is the max of all nbBus
    mdl.minimize(mdl.max(mdl.nbBus[b] for b in buses)) 
    
    mdl.solve(log_output=True,)
    
    mdl.export("c:\\temp\\buses.lp")
    
    for v in mdl.iter_integer_vars():
        print(v," = ",v.solution_value)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      • 2020-08-20
      相关资源
      最近更新 更多