我可以将字符串转换为 pyomo 变量吗?

Can I transform string to pyomo variable?

我有一个 .txt 文件,其中包含我的模型的一个变量。如果我将文件内容复制并粘贴到我的程序中

def Wind_phi_definition(model, i):
         return m.Wind_phi[i] ==-19.995904426195736*Sinc(0.04188790204786391*(0. + m.lammda[i]*180/np.pi))*Sinc(0.08975979010256552*(-65. + m.phi[i]*180/np.pi))
m.Wind_phi_const = Constraint(m.N, rule = Wind_phi_definition)

代码执行无问题。我想通过直接从 .txt 文件中读取程序来加快速度。

我尝试将变量读取为

f = open("savedWindXPython.txt", "r")
a=f.readline()
f.close

def Wind_lammda_definition(model, i):
    return m.Wind_phi[i] == a
m.Wind_phi_const = Constraint(m.N, rule = Wind_lammda_definition)

但是返回错误 AttributeError: 'str' 对象没有属性 'is_relational'

我知道发生这种情况是因为 python 将其作为字符串而不是 pyomo 变量读取。我试图在 m.Wind_phi 的定义中使用 exec(a) 而不是 a 来解决这个问题。但是,我仍然得到一个错误,这次它说

'NoneType'对象没有属性'is_relational'

有没有办法通过读取 .txt 文件来完成我想做的事情并定义变量,而不必手动复制它的内容?

您要实现的目标称为 unmarshalling(或反序列化)

如果您的变量是一个简单的数字,反序列化它就像 int(my_string_var) 一样简单。如果它看起来像您链接的那个(您需要在其中调用函数),则还有更多工作要做。您使用的库还可以提供一些 serialization/deserialization 功能。对你来说不幸的是,它看起来像 pyomo doesn't provide this feature at the moment.

所以,现在,如果您首先有权访问谁或什么在编写您的 .txt 文件,请考虑将其序列化为 json(或您正在使用的任何数据存储格式)最舒服的;如果你觉得不舒服,试试 json)。然后您现在将了解如何在您的代码中反序列化它。

否则,您将不得不编写一个字符串解析器来从您的字符串中提取数据并将其序列化为 python 个对象。如果你只是想解析这个特定的变量,这可能是微不足道的,但如果你试图反序列化很多这些变量,这最终也会变得相当具有挑战性。