如何在Pyomo AbstractModel中迭代创建多个目标?

时间:2019-07-02 08:36:21

标签: python scripting mathematical-optimization pyomo

我正在尝试实现一个startComeDate: moment().add(1, 'M'), endComeDate: moment().add(1, 'M').add(5, "days"), startResiDate: moment().add(1, 'M'), endResiDate: moment().add(1, 'M').add(5, "days") ,它看起来可以在同一可行集上迭代地优化多个目标函数。 由于我希望在周围的脚本中具有最大的透明度,更确切地说,是要反复激活不同目标函数的脚本,因此我希望将所有目标函数包含在模型的单个AbstractModel属性中。我应该怎么做?

由于有两种类型的目标索引在不同的集合上,因此我尝试分别创建两种类型的目标,然后将两者合并到obj中。

这将导致以下结果:

ObjectiveList

这不起作用,因为在import pyomo.environ as pyo model=pyo.AbstractModel() model.i=pyo.Set(initialize=[1,2]) model.a=pyo.Set(initialize=[(1,2),(2,1)]) model.x=pyo.Var() model.obj=pyo.ObjectiveList() def obj_type1(model,i): return x**2 obj_type1=pyo.Objective(model.i,rule=obj_type1) for key, new_obj in obj_type1.items(): model.obj.add(new_obj) def obj_type2(model,a): return x+1 obj_type2=pyo.Objective(model.a,rule=obj_type2) for key, new_obj in obj_type2.items(): model.obj.add(new_obj) 中,我无法遍历各个目标容器。

1 个答案:

答案 0 :(得分:0)

您可以按规则执行此操作:

def _obj(m, j):
    if j < 3:
        return m.x**2
    else:
        return m.x+1
m.obj = Objective([1,2,3,4], rule=_obj)

在将模型发送到求解器之前,只需确保停用一个目标即可。