簡體   English   中英

TypeError PYOMO:基於 pandas dataframe 定義約束

[英]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))

物鏡 function 如下:

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無關。

model.C1 = Constraint(expr =  v1 +  v2 *model.d1 <= 2.1)

但是我在執行這個想法時遇到了以下錯誤

---------------------------------------------------------------------------
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 來運行 model。 但它似乎仍然是“NoneType”。

有人可以幫我解決這個問題嗎?

非常感謝您提前。

PS: model.d1.display()給出以下 output。

d1 : Size=1, Index=None
    Key  : Lower : Value : Upper : Fixed : Stale : Domain
    None :   0.8 :   0.9 :   1.0 : False : False :  Reals

因此,當pyomo變量為numpy pyomo交互的一個小錯誤……我認為這不會經常出現,因為在處理索引pyomo變量時問題不會暴露出來,這是目前大多數情況。 你的是非索引單例。

首先,讓您的 model 工作。 將來自您的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...

這兩個都應該按照我的理解來執行。 我幾乎從不處理 singleton 變量(未編入索引),所以這里可能還有其他事情要做。 我會嘗試將此作為錯誤提交給 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...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM