【问题标题】:'or' within a constraint :docplex约束中的“或”:docplex
【发布时间】:2020-05-13 22:16:46
【问题描述】:

使用 OPL 我可以在约束下进行写入。主要是我在约束中使用了 or(||) 并成功获得了结果。na_supply_component 是 2d 决策变量

// MOQ (Minimum Order Quantity) 
con2: forall(i in 1..12,j in 1..5)
na_supply_component[j,i]>=na_moq_supplier[j] || na_supply_component[j,i]==0;

现在我正在尝试使用 docplex 包将我的 OPL 代码转换为 python。 示例代码如下。这里我使用了一维决策变量来检查(purch_val)

Supplier=['q','w','e','r','t'];
n_Supplier=len(Supplier);
r_Supplier=range(n_Supplier);
na_moq_supplier=[10,20,30,40,0]
from docplex.mp.model import Model

x=Model("mymod");
purch_val=x.integer_var_list(n_Supplier,lb=0,ub=10000);
for i in r_Supplier:x.add_constraint(purch_val[i]>=na_moq_supplier[i] or purch_val[i]==0);

运行时出现错误TypeError: Cannot convert a linear constraint to boolean: x1 >= 10 它不允许我使用or。你能解释一下我能做些什么来克服这个错误。

【问题讨论】:

    标签: python cplex docplex


    【解决方案1】:
    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*460 + nbbus30*360)
    
    mdl.solve()
    
    for v in mdl.iter_integer_vars():
        print(v," = ",v.solution_value)
    
    print()
    print("with the logical constraint")
    
    mdl.add((nbbus40>=7) + (nbbus30>=7)>=1)
    
    
    
    mdl.solve()
    
    for v in mdl.iter_integer_vars():
        print(v," = ",v.solution_value)
    

    工作正常

    并给予

    nbBus40  =  6.0
    nbBus30  =  2.0
    
    with the logical constraint
    nbBus40  =  7.0
    nbBus30  =  1.0
    

    来自logical constraints

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多