如何在 CPLEX 上基于另外两个约束实现新约束?

我对 CPLEX 很陌生。我有这两个约束(R 是 20 范围内的数字集):

        model.add_constraints((model.sum(x[i, j] for j in R2 ) == 2 for i in R),"C1" )
        model.add_constraints((x[i, n1-4] ==x[i, n1-2]  for i in R ),"C2" )

我需要计算有多少i同时满足 C1 和 C2,然后定义一个新约束,表示“至少有 10 个 i 同时满足 C1 和 C2”

我怎样才能用 cplex 做到这一点?


一只名叫tom的猫
浏览 143回答 3
3回答

郎朗坤

在 Docplex 中,每个线性约束都可以用作一个表达式,其作用类似于布尔变量,如果满足约束则等于 1,如果不满足则等于 0。请注意,当添加到模型时(通过 Mode.add、Model.add_constraint(s)),约束将始终得到满足。但是,您可以写:m.add(&nbsp;(x<=3)&nbsp;+&nbsp;(y>=5)&nbsp;>=&nbsp;1)这意味着至少满足一个(可能是两个)约束 (x<=3) 和 (y>=5)。在您的情况下,假设有一个包含 N 个约束 cts[i] 的数组,则编写:m.add(&nbsp;m.sum(cts)&nbsp;>=&nbsp;10)您还可以在目标中使用这样的表达式:m.maximize(m.sum(cts))将最大化满足约束的数量将确保其中至少 10 人满意注意:始终使用Model.sum,而不是 Pythonsum以避免性能问题。

互换的青春

让我举一个动物园里的例子from docplex.mp.model import Model# DataBuses=[    (40,500),    (30,400),    (35,450),    (20,300)    ]nbKids=300# IndexesbusSize=0;busCost=1;for b in Buses:    print("buses with ",b[busSize]," seats cost ",b[busCost])mdl = Model(name='buses')#decision variablesmdl.nbBus=mdl.integer_var_dict(Buses,name="nbBus")# Constraintmdl.add_constraint(sum(mdl.nbBus[b]*b[busSize] for b in Buses) >= nbKids, 'kids')# Objectivemdl.minimize(sum(mdl.nbBus[b]*b[busCost] for b in Buses))mdl.solve()# Display solutionfor b in Buses:    print(mdl.nbBus[b].solution_value," buses with ",b[busSize]," seats");#Add a constraint# Number of sizes where we have 1 or 2 buses should be at least 3mdl.add(mdl.sum(mdl.logical_and(1<=mdl.nbBus[b],mdl.nbBus[b]<=2) for b in Buses) >=3)mdl.solve()# Display solutionfor b in Buses:    print(mdl.nbBus[b].solution_value," buses with ",b[busSize]," seats");这使buses with  40  seats cost  500buses with  30  seats cost  400buses with  35  seats cost  450buses with  20  seats cost  3005.0  buses with  40  seats1.0  buses with  30  seats2.0  buses with  35  seats0  buses with  20  seats4.0  buses with  40  seats1.0  buses with  30  seats2.0  buses with  35  seats2.0  buses with  20  seats

慕虎7371278

在以下代码中,我创建了两个包含 100 个整数变量的列表 xi 和 xj。然后,我定义一个逻辑和约束列表ctands,当 xi[k]>=3 且 yi[k]>=5 时为 true。然后我发布这些逻辑约束的总和恰好等于 10,这意味着必须满足其中的 10 个,因为任何约束都可以用作二进制变量,满足时等于 1。目标是最小化 xi 和 xj 的总和,因此结果如预期为 10 * 3 + 10*5 = 80m = Model()xi = m.integer_var_list(100, ub=10, name='xi')xj = m.integer_var_list(100, ub=11, name='xj')ctands = [((xi[k]>=3) + (xj[k]>=5)==2) for k in range(100)]# version with logical_and# ctands = [mdl.logical_and((xi[k]>=3), (xj[k]>=5)==2)) for k in range(100)]#state that exactly 10 ands are true: the value of an and is 1 when true, 0 when falsem.add(m.sum(ctands) == 10)# this minimize pulls xs and ys variables to 0m.minimize(m.sum(xi) + m.sum(xj))m.solve()m.print_solution()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python