在 PYOMO 中的多个解决方案中编辑 RHS 值

问题描述 投票:0回答:1

我正在尝试将 Gams 切换到 pyomo,所以我对 pyomo 没有经验。我有一个基本模型来演示我的问题。我想更改重复求解之间某些约束的右侧值。我不想添加新的约束,因为在这种情况下我需要在循环中激活和停用约束。我尝试通过分配新值来更改 model.A1,但在constraint4 中它保持 0。

import pyomo.environ as pyo
from pyomo.environ import *
from pyomo.environ import SolverFactory
import pandas as pd

obj_func_coef=pd.read_excel('veriler.xlsx',sheet_name='Goals')
cons_coef=pd.read_excel('veriler.xlsx',sheet_name='Cons')

model = pyo.ConcreteModel()
model.x = pyo.Var(range(len(obj_func_coef)),bounds=(0,None), domain=Integers)
x=model.x
model.A1=pyo.Param(mutable=True, initialize=0)
model.A2=pyo.Param(mutable=True, initialize=0)  

def constraint1(model):
    return sum([cons_coef.C1[i]*x[i] for i in cons_coef.ID]) >= 15
def constraint2(model):
    return sum([cons_coef.C2[i]*x[i] for i in cons_coef.ID]) <= 14
def constraint3(model):
    return sum([cons_coef.C3[i]*x[i] for i in cons_coef.ID]) <= 20  
def constraint4(model):
     return sum([x[i]*obj_func_coef.Goal3[i] for i in obj_func_coef.ID])>=model.A1  
def constraint5(model):
    return sum([x[i]*obj_func_coef.Goal2[i] for i in obj_func_coef.ID])>=model.A2

def objective1(model):
    G1=sum([x[i]*obj_func_coef.Goal1[i] for i in obj_func_coef.ID])
    return G1

def objective2(model):
    G2=sum([x[i]*obj_func_coef.Goal2[i] for i in obj_func_coef.ID])
    return G2

opt=SolverFactory('gurobi')
opt.options['MIPgap']=0.0000000
G1=sum([x[i]*obj_func_coef.Goal1[i] for i in obj_func_coef.ID])
G2=sum([x[i]*obj_func_coef.Goal2[i] for i in obj_func_coef.ID])

#------------------------------------------------------------
model.con1 = Constraint(rule=constraint1)
model.con2 = Constraint(rule=constraint2)
model.con3 = Constraint(rule=constraint3)
model.con4 = Constraint(expr=constraint4)
model.con5 = Constraint(rule=constraint5)

#---------------------------------------------------------------
model.obj1=pyo.Objective(rule=objective1, sense= pyo.maximize)
opt.solve(model)
print('---1---', pyo.value(G1), pyo.value(G2))
model.A1=pyo.value(G1)
model.obj1.deactivate()
model.obj2=pyo.Objective(rule=objective2, sense= pyo.maximize)  
opt.solve(model)     
print('----1-2----',pyo.value(G1),pyo.value(G2))
model.A2=pyo.value(G2)

跑步给予

>>>---1--- 20.0 8.0
>>>----1-2---- 15.0 11.0

但它应该给

>>>---1--- 20.0 8.0
>>>----1-2---- 20.0 10.0

提前致谢

python optimization pyomo
1个回答
0
投票

您的示例有点令人困惑,并且缺少一些值以使其可重现。

您只需更改可变参数的值并重新求解,或激活/停用目标,就像您尝试做的那样。

而且,在 99% 的情况下,对于简单模型,您所需要做的就是导入 pyomo 环境。几年前,它被重构为包含基本模型所需的几乎所有内容。

以下是更改索引约束的 RHS 的示例:

代码:

import pyomo.environ as pyo

m =  pyo.ConcreteModel()

m.S = pyo.Set(initialize=[1, 2])

m.x = pyo.Var(m.S)

m.limit = pyo.Param(m.S, default=5, mutable=True)

# constrain x
def limit_x(m, s):
    return m.x[s] <= m.limit[s]
m.C1 = pyo.Constraint(m.S, rule=limit_x)

# OBJ
m.obj = pyo.Objective(expr=sum(m.x[s] for s in m.S), sense=pyo.maximize)


# solve
solver = pyo.SolverFactory('cbc')
res = solver.solve(m)

print(res)  # obj value = 10

# change the RHS of the constraint
m.limit[1] = 2
m.limit[2] = 4

res = solver.solve(m)

print(res)  # obj value = 6
© www.soinside.com 2019 - 2024. All rights reserved.