我正在尝试编写一个脚本来分析pyomo模型的lp文件。我想首先列出lp文件中出现的所有约束。这是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文件与上面的文件类似,那么我的脚本应在以下几行中打印或写入文本文件:
res_vertex(1_Mid_Biomass_Stock)
res_vertex(1_Mid_Coal_Stock)
我发现每个约束都以'c_e_'
开头并以')_'
结束,因此我写了以下字符串来获取第一个约束res_vertex(1_Mid_Biomass_Stock)
:
with open('lp_file.lp', 'r') as lp:
lp = lp.read().replace('\n', ' ')
lp = str(lp[lp.find('c_e_')+4:
lp.find(')_')+1])
print(lp)
以上代码段实际上会打印出第一个约束,但是我可能需要使用for循环对连续的约束(第2,第3,第4等)进行打印。
我不能强迫.find()
在某些索引之后进行搜索。那我该怎么解决呢?
PS:约束名称的长度不同
答案 0 :(得分:0)
您可以将'c_e_'
与用于提取')_'
和output_file
之间的内容的模式一起使用(假设import re
with open('lp_file.lp', 'r') as lp:
for line in lp:
match = re.match(r'c_e_(.*\))_', line)
if match:
print(match.group(1), file=output_file)
是将输出写入的文件对象):
encoder = preprocessing.LabelEncoder()
encoded_y_train = encoder.fit_transform(y_train)
dummy_y_train = np_utils.to_categorical(encoded_y_train)