我正在努力寻找一种有效的方法来检索优化问题的解决方案。该解决方案由大约 200K 个变量组成,我希望将这些变量放在 pandas DataFrame 中。在网上搜索后,我发现访问变量的唯一方法是通过 for 循环,如下所示:
instance = M.create_instance('input.dat') # reading in a datafile
results = opt.solve(instance, tee=True)
results.write()
instance.solutions.load_from(results)
for v in instance.component_objects(Var, active=True):
print ("Variable",v)
varobject = getattr(instance, str(v))
for index in varobject:
print (" ",index, varobject[index].value)
我知道我可以使用这个 for 循环将它们存储在数据框中,但这效率很低。
我发现如何使用访问索引
import pandas as pd
index = pd.DataFrame(instance.component_objects(Var, active=True))
但我不知道如何获得解决方案
实际上有一个非常简单而优雅的解决方案,使用方法pandas.DataFrame.from_dict
结合Var.extract_values()
method.
from pyomo.environ import *
import pandas as pd
m = ConcreteModel()
m.N = RangeSet(5)
m.x = Var(m.N, rule=lambda _, el: el**2) # x = [1,4,9,16,25]
df = pd.DataFrame.from_dict(m.x.extract_values(), orient='index', columns=[str(m.x)])
print(df)
yields
x
1 1
2 4
3 9
4 16
5 25
请注意,对于Var
我们可以同时使用get_values()
and extract_values()
,他们似乎也在做同样的事情。为了Param
只有extract_values()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)