python - 如何将 max 函数从 CPLEX OPL 切换到 Docplex?
问题描述
我在 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]
解决方案
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)
推荐阅读
- c# - 如何使用身份 2.0 使用授权属性添加多个策略?
- deployment - 如何在 Kubernetes 中相同部署的两个 Pod 中使环境变量不同?
- javascript - 正则表达式在函数中是如何工作的?
- javascript - 时刻是 2 次之间的时间,无论日期如何
- python-3.x - 更改 keras 模型输入名称
- unity3d - 为什么在 Unity 中只有 Mono 显示为 PC、Mac 和独立平台的脚本后端?
- unity3d - Unity 着色器将具有相同材质的对象渲染到后续的 GrabPass
- java - 在 Spring web 4.x 中的序列化和反序列化期间覆盖 Jackson-databind.ObjectMapper 以接受 BigDecimal 作为字符串
- firebase - 在 componentWillMount() 完成之前调用 render()
- excel - VBA - 在字符串中搜索数组中的值并删除该值