TypeError PYOMO:基于 pandas 数据帧定义约束
TypeError PYOMO: Defining constraints based on pandas dataframe
对于优化问题,我试图在 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))
objective函数如下:
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
所以您可能偶然发现了一个小错误,即当 pyomo
变量是单例时 pyomo
如何与 numpy
值交互......我不认为这是经常出现,因为在处理索引 pyomo
变量时问题不会暴露出来,这是迄今为止大多数情况。你的是非索引单例。
首先,让我们让您的模型正常工作。将来自 df
的值转换为浮点数,这很好用。
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), domain=NonNegativeReals)
model.t1 = Var(bounds=(0.1,0.3), domain=NonNegativeReals)
r1 = [50.05,60.0,70]
r2 = [100,150,200]
df = pd.DataFrame([r1,r2])
v1 = float(df.iloc[0, 1]) # NOTE the float() conversion
v2 = float(df.iloc[1, 1]) # NOTE the float() conversion
model.C1 = Constraint(expr=v1 + v2 * model.d1 <= 2.1)
model.pprint()
疑似bug...
根据我的理解,这两个应该执行。我几乎从不处理单例变量(没有索引),所以这里可能还有其他事情要做。我会尝试将其作为错误提交给 pyomo 的人,看看会发生什么。
from pyomo.environ import *
import numpy as np
c = np.float64(1.5) # a numpy float like what comes out of a pd dataframe...
model_1 = ConcreteModel()
model_1.x = Var()
# a simple expression
e = c * model_1.x # FAILS! TypeError: unsupported operand type(s) for *: 'float' and 'NoneType'
model_2 = ConcreteModel()
model_2.S = Set(initialize = [1,]) # indexing set with 1 member
model_2.x = Var(model_2.S)
# same expression
e2 = c * model_2.x[1] # Works fine...
对于优化问题,我试图在 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))
objective函数如下:
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
所以您可能偶然发现了一个小错误,即当 pyomo
变量是单例时 pyomo
如何与 numpy
值交互......我不认为这是经常出现,因为在处理索引 pyomo
变量时问题不会暴露出来,这是迄今为止大多数情况。你的是非索引单例。
首先,让我们让您的模型正常工作。将来自 df
的值转换为浮点数,这很好用。
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), domain=NonNegativeReals)
model.t1 = Var(bounds=(0.1,0.3), domain=NonNegativeReals)
r1 = [50.05,60.0,70]
r2 = [100,150,200]
df = pd.DataFrame([r1,r2])
v1 = float(df.iloc[0, 1]) # NOTE the float() conversion
v2 = float(df.iloc[1, 1]) # NOTE the float() conversion
model.C1 = Constraint(expr=v1 + v2 * model.d1 <= 2.1)
model.pprint()
疑似bug...
根据我的理解,这两个应该执行。我几乎从不处理单例变量(没有索引),所以这里可能还有其他事情要做。我会尝试将其作为错误提交给 pyomo 的人,看看会发生什么。
from pyomo.environ import *
import numpy as np
c = np.float64(1.5) # a numpy float like what comes out of a pd dataframe...
model_1 = ConcreteModel()
model_1.x = Var()
# a simple expression
e = c * model_1.x # FAILS! TypeError: unsupported operand type(s) for *: 'float' and 'NoneType'
model_2 = ConcreteModel()
model_2.S = Set(initialize = [1,]) # indexing set with 1 member
model_2.x = Var(model_2.S)
# same expression
e2 = c * model_2.x[1] # Works fine...