【发布时间】:2021-06-28 08:50:23
【问题描述】:
对于优化问题,我试图在 PYOMO 中定义一个约束,其中约束表达式包含来自 pandas DataFrame 的一些特定值。
我会尽量简明扼要地解释我的问题。
以下是导入。
from pyomo.environ import *
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pyomo.opt import SolverFactory
model = ConcreteModel()
以下是决策变量。
model.d1 = Var(bounds=(0.8,1.0), initialize = 0.9)
model.t1 = Var(bounds=(0.1,0.3))
目标函数如下:
model.Total_weight = Objective(expr= model.t1*model.d1, sense= minimize )
为了制定约束表达式,我使用了 DataFrame 中的一些值。
DataFrame 如下所示:
r1 = [50.05,60.0,70]
r2 = [100,150,200]
df = pd.DataFrame([r1,r2])
0 1 2
0 50.05 60.0 70
1 100.00 150.0 200
当前想法:
我将 df 中的一些值分配给变量,以便在约束表达式中使用(如下所示)。
v1 = df.iloc[0, 1]
v2 = df.iloc[1,1]
v1 和 v2 的唯一目的是为约束表达式输入值。与优化模型无关。
model.C1 = Constraint(expr = v1 + v2 *model.d1 <= 2.1)
但是我在执行这个idea时遇到了如下错误
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-a9a7f2887bcb> in <module>
----> 1 model.C1 = Constraint(expr = v1 + v2 *model.d1)
TypeError: unsupported operand type(s) for *: 'float' and 'NoneType'
据我了解,python 将 v1 和 v2 视为“float”,而 model.d1 被视为“NoneType”。我尝试通过将initialize 添加到变量model.d1 来运行模型。但它似乎仍然是“NoneType”。
有人可以帮我解决这个问题吗?
非常感谢您。
PS:model.d1.display() 给出以下输出。
d1 : Size=1, Index=None
Key : Lower : Value : Upper : Fixed : Stale : Domain
None : 0.8 : 0.9 : 1.0 : False : False : Reals
【问题讨论】:
-
你能在这里补充一点信息或者更完整的代码sn-p。目前尚不清楚您要做什么,也不清楚
model.disp、model.d1是什么类型的东西以及df中的内容。请编辑您的帖子,定义所有内容并提供df的示例。 -
@AirSquid 感谢您的评论。我已经修改了描述以使其更清晰。如果仍然缺少任何信息,请告诉我。
-
尝试索引以获取不带内括号的 v1 和 v2。像在 pandas 中那样做会得到一个
Series对象。所以,试试这个:v1 = df.iloc[0,1] -
@AirSquid 感谢您的支持。我试过你的建议。不幸的是,它给出了另一种类型的错误。
TypeError: unsupported operand type(s) for *: 'float' and 'NoneType' -
好的。您需要发布更多代码来弄清楚为什么 python 认为您的
model.d1是 NoneType。根据需要发布尽可能多的代码以在对帖子的编辑中重现错误,包括导入等。并包括显示相同错误行的堆栈跟踪。
标签: python pandas numpy typeerror pyomo