微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

cplex中的多个模型-python

如何解决cplex中的多个模型-python

我想实现 epsilon 约束方法在这里我需要有多个具有相似变量和几乎相同约束的模型。我想知道如何定义可以在所有模型中使用的变量(或约束)。例如,请假设我想向两个模型(“mdl1”和“mdl2”)添加一个二进制变量“x”和“con1”。我已将这个问题编码如下,但它不起作用。你能帮我吗?

from docplex.mp.model import Model

# Model names
mdl1 = Model("OBJ1")
mdl2 = Model("OBJ2")

# set_idx1 is defined here.

# Variables
x = mdl1.binary_var_dict(set_idx1,name="x")
x = mdl2.binary_var_dict(set_idx1,name="x")

此外,我应该如何定义约束以防止重复工作?谢谢!

解决方法

Optimization easy with python

让我分享一下例子clone a linear model

struct x {
    vector<int> D;
    x() : D(100) {}
};

给出

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*500 + nbbus30*400)

mdl.solve(log_output=False,)

mdlclone=mdl.clone()
mdlequal=mdl;


# set upper bound for nbbus40 to 0
nbbus40.ub=0

mdlclone.solve(log_output=False,)
mdlequal.solve(log_output=False,)


print("clone")
for v in mdlclone.iter_integer_vars():
    print(v," = ",v.solution_value)

print("= operator")
for v in mdlequal.iter_integer_vars():
    print(v,v.solution_value)
,

关于在不同模型中使用建模人工制品:这是不可能的,每个人工制品都属于一个父模型。为什么要这样做?

关于第二个问题,为了避免编写复杂约束时的代码重复(你是对的),我建议编写一个函数,它(至少)将模型作为参数,加上其他输入参数。

一个非常简单的例子:

def new_ct_sum1(mdl,x,y):
    # returns a constraint stating x+y ==1
    # assumes x,y are in model mdl,otherwise an error is raised.
    return mdl.add(x + y == 1)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。