Pyomo 中元组集的表示形式



我正在尝试解决Pyomo中的一个问题。我需要为约束 1 的节点(I 和 II(之间的某些弧写下对子集 A 的限制。我写了一个模型:

from pyomo.environ import *
model = AbstractModel()
model.I  = Set()
model.II = SetOf(model.I) 
model.J  = Set() 
model.A  = Set(model.I,model.II)
model.c  = Param(model.I, model.J, default=0)
model.b  = Param(model.I, default=0)
model.x  = Var(model.I, model.J, within=NonNegativeReals)
model.y  = Var(model.I, model.II, within=NonNegativeReals)
data = DataPortal()
data.load(filename='Data.yaml')
data.load(filename='Table.tab')
def objective_rule(model):
return (sum(model.c[i,j]*model.x[i,j] for i in model.I for j in model.J))
model.OBJ = Objective(rule=objective_rule, sense = minimize)
def B_rule(model,i):
Bb = sum(model.x[i,j] for j in model.J)-sum(model.y[i,ii] for ii in model.II if ii != i)+0.01*sum(model.y[ii,i] for ii in model.II if ii != i)
return model.b[i] == Bb
model.B1 = Constraint(model.I, rule=B_rule)
def constraint1_rule(model,i,ii):
if (i,ii) in model.A:
return model.y[i,ii] <= 10000
return Constraint.Skip
model.constraint1 = Constraint(model.I, model.II, rule = constraint1_rule) 
instance = model.create_instance(data)
opt = SolverFactory('cplex')
opt.solve(instance)
instance.OBJ.display()
instance.x.display()
instance.y.display()

数据显示在文件Data.yaml中:

I: [1, 2, 3, 4]
J: [1, 2]
b : {1: 10000, 2: 20000, 3: 25000, 4: 22000}
c: 
- index: [1, 1] 
value: 550
- index: [2, 2] 
value: 120
- index: [3, 1]
value: 650
- index: [4, 2] 
value: 550
- index: [1, 1] 
value: 120
- index: [2, 2]
value: 650
- index: [3, 1]
value: 650
- index: [4, 2] 
value: 550

二维集合 A 显示在文件 Table.tab 中:

set A : 1  2  3  4  :=
1   -  -  +  +
2   -  -  +  +
3   +  +  -  +
4   +  +  +  -  ;

解决方案后,我收到错误:

Unspecified format and data option

如何正确表示集合 A?

首先,你的数据和集合太小了,我真的会考虑把它们放到基本文件中并制作一个具体的模型。 更容易排除故障。 你甚至可以使用基本的python从csv文件等中读取。

无论如何。 您可以在此处找到有关使用 .tab 文件的良好示例:

https://pyomo.readthedocs.io/en/stable/working_abstractmodels/data/dataportals.html?highlight=.tab#loading-structured-data

您需要做的两件事:

  1. 更改模型的语句。A 只是表明它在集合
<小时 />
model.A  = Set(within = model.I*model.I)

  1. 清理选项卡文件以在左上角显示设置索引并清除标点符号:
<小时 />
I   1  2  3  4  
1   -  -  +  +
2   -  -  +  +
3   +  +  -  +
4   +  +  +  - 

  1. 更新您的 read 语句:
<小时 />
data.load(filename='table.tab', set=model.A, format='set_array')

最新更新