Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有可变值的Pyomo模型LP文件_Python_Solver_Pyomo - Fatal编程技术网

Python 具有可变值的Pyomo模型LP文件

Python 具有可变值的Pyomo模型LP文件,python,solver,pyomo,Python,Solver,Pyomo,我已经构建了一个pyomo模型,并通过以下方式编写了该模型的lp文件: # write LP file filename = os.path.join(os.path.dirname(__file__), 'model.lp') model.write(filename, io_options={'symbolic_solver_labels': True}) 我正在文件夹中获取model.lp文件。它看起来如下所示: \* Source Pyomo model name=urbs *\ m

我已经构建了一个pyomo模型,并通过以下方式编写了该模型的lp文件:

# write LP file
filename = os.path.join(os.path.dirname(__file__), 'model.lp')
model.write(filename, io_options={'symbolic_solver_labels': True})
我正在文件夹中获取
model.lp
文件。它看起来如下所示:

\* Source Pyomo model name=urbs *\

min 
obj:
+1 costs(Environmental)
+1 costs(Fixed)
+1 costs(Fuel)
+1 costs(Invest)
+1 costs(Variable)

s.t.

c_e_res_vertex(1_Mid_Biomass_Stock)_:
+1 e_co_stock(1_Mid_Biomass_Stock)
-1 e_pro_in(1_Mid_Biomass_plant_Biomass)
= 0

c_e_res_vertex(1_Mid_Coal_Stock)_:
+1 e_co_stock(1_Mid_Coal_Stock)
-1 e_pro_in(1_Mid_Coal_plant_Coal)
= 0
我的问题是,我还想保存模型的变量值

有没有办法强制解算器将模型变量的值写入lp文件


或者是以不同的方式做同一件事的东西?

我想到了两种方式

好旧的搜索和替换 使用LP文件,执行搜索和替换。例如,索引为
2
'productA'
(在Pyomo中:
model.x[2,'productA']
)的变量
x
作为
x(2_productA)
写入LP文件。知道这一点后,对于每个变量及其索引,以LP格式生成它们的名称,并在LP文件中搜索所有出现的变量,以将它们替换为它们的值

如果
lpFileContent
是LP文件中包含的字符串,则如下所示:

for v in model.component_objects(Var, active=True):
    varName = str(v)
    varObject = getattr(model, varName)
    for index in varObject:
        indexStr = str(index)
        # Convert your index string:
        indexStr.replace(",","_")
        indexStr.replace(" ","_")
        indexStr.replace("'","") # Add more as you need.  
        #Replace by value:
        lpFileContent.replace(varName + "(" + indexStr + ")", varObject[index].value)
with open("output.txt", "w") as outputFile
    outputFile.write(lpFileContent)
使用表达式 定义约束时,可以这样做(从Pyomo文档):

model.A=范围集(1,10)
model.a=Param(model.a,in=positiveerals)
model.ToBuy=Var(model.A)
def bud_规则(型号i):

return model.a[i]*model.ToBuy[i]向LP文件添加值将使其不再是LP文件,解算器无法使用它。好吧,我们将其称为notLP文件,但称为其他文件。我只是想知道这样的事情可能吗?嗯,也许这不是你想要的答案对不起,但是要做到这一点还有很多很长的路要走。你能提供一个你想要获得的输出的例子吗?您希望它写得清楚(易于阅读),还是必须严格遵循LP文件格式(但使用变量值而不是变量名)?@V.Brunelle“您希望它写得清楚吗”,因为您可以始终做到
variable\u name.pprint()
,最好是“但使用变量值而不是变量名”请看这里。它可能会工作,我不确定代码是否工作。然而,既然你花了时间在这上面,我就接受这个回答:)泰!谢谢你让我知道这个答案是否需要改进,如果你有时间在你的代码中添加这个的话。
model.A = RangeSet(1,10)
model.a = Param(model.A, within=PositiveReals)
model.ToBuy = Var(model.A)
def bud_rule(model, i):
    return model.a[i]*model.ToBuy[i] <= i
aBudget = Constraint(model.A, rule=bud_rule)
model.A = RangeSet(1,10)
model.a = Param(model.A, within=PositiveReals)
model.ToBuy = Var(model.A)
def bud_rule(model, i):
    print(str(model.a[i]*model.ToBuy[i]) + " <= " + str(i))
    return model.a[i]*model.ToBuy[i] <= i
aBudget = Constraint(model.A, rule=bud_rule)
1 * model.ToBuy[1] <= 1
2 * model.ToBuy[2] <= 2
3 * model.ToBuy[3] <= 3
4 * model.ToBuy[4] <= 4
... #It goes on
10 * model.ToBuy[10] <= 10