【问题标题】:Can I transform string to pyomo variable?我可以将字符串转换为 pyomo 变量吗?
【发布时间】:2020-01-29 14:09:53
【问题描述】:

我有一个 .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 文件来定义变量,而不是必须手动复制它的内容?

【问题讨论】:

    标签: python variables text readline pyomo


    【解决方案1】:

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

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

    所以,现在,如果您首先可以访问谁或什么正在编写您的 .txt 文件,请考虑将其序列化为 json(或您最熟悉的任何数据存储格式;如果您对此不满意,请尝试json)。然后你现在将如何在你的代码中反序列化它。

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

    【讨论】:

    • 提供 txt 文件的是一个数学程序,它读作 Export["savedWindX.txt", savedX] savedXPython = Import["savedWindX.txt"] // StringReplace[#, {"[" -> "(", "]" -> ")", "t" -> "m.lammda[i]*180/np.pi", "u" -> "m.phi[i]*180/ np.pi"}] &。导出["savedWindXPython.txt", savedXPython];我将尝试导出为 json,然后使用 pyomo 读取它。你能确认这是我必须做的吗?谢谢
    • 好吧。 Pyomo 在这里无法为您做任何事情。您必须将来自这个mathematica 程序的内容序列化为可以使用python 读取的数据结构。我将在回答中添加一个示例,涵盖您提到的案例。
    • 在阅读更多主题时,我想起了mathML 并找到了MathJSON。如果您可以将其中一种格式序列化到您的mathematica 程序中,您应该能够使用库在python 中对它们进行反序列化。另外,我可能无法提供更多帮助,因为我对数学知识不够了解,抱歉:(
    猜你喜欢
    • 1970-01-01
    • 2021-02-05
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多