簡體   English   中英

使用 GEKKO 的兩個 pandas 數據幀的優化問題

[英]Optimisation problem with two pandas dataframes using GEKKO

我有兩個格式相同的數據框,如下所示:

df1

            Value_0  Value_1  Value_2 ...
Date                                        
2020-11-07  7.830    19.630   30.584  ...
2020-11-08  11.100   34.693   40.589  ...
2020-11-09  12.455   34.693   41.236  ...
.
.
.

df2

            Value_0  Value_1  Value_2 ...
Date                                        
2020-11-07  153.601  61.014   55.367  ...
2020-11-08  119.011  70.560   49.052  ...
2020-11-09  133.925  103.417  61.651  ...
.
.
.

我試着:

  1. 在每個連續匹配點之間進行線性插值(因此 y1 = df1.Value_0,y2 = df1.Value_1,x1 = df2.Value_0,x2 = df2.Value_1)。
  2. 考慮插值的所有可能值,最大化每個日期和列對的 df1 和 df2 的乘積。

我當前的方法如下(這進入一個循環以評估每對列,然后僅為最高值存儲優化,但為了簡單起見,我在這里忽略它):

i = 0 # Example for only one use case

# Initial model
m = gekko()

# Variables         
y1 = np.array(df1['Value_'+str(i)])
y2 = np.array(df1['Value_'+str(i+1)])
x1 = np.array(df2['Value_'+str(i)])
x2 = np.array(df2['Value_'+str(i+1)])

s = [None]*len(y1)
c = [None]*len(y1)
ex = [None]*len(y1)

for j in range(len(y1)):
    s[j] = (y1[j]-y2[j])/(x1[j]-x2[j]) # slope
    c[j] = (x1[j]*y2[j] - x2[j]*y1[j])/(x1[j]-x2[j]) # y intersect
    ex[j] = -c[j]/s[j] # x intersect
    
p = m.Var(lb=0, ub=y2) # specific boundaries for case when i=0
n = m.Var(lb=x2, ub=ex) # specific boundaries for case when i=0

# Constraint
m.Equation((s[j]*n)+c[j]==p for j in range(len(y1))) # equation of a line

# Objective function
m.Maximize(n*p)

m.solve(disp=False)

#print('p:'+str(p.value))
#print('n:'+str(n.value))

這是我第一次使用 Gekko,我收到“@error:不等式定義無效的不等式:z > x < y”。 如果能提供有關代碼/變量定義有何問題的任何線索,我將不勝感激。

下限和上限需要是單個值,除非您為每個數據行定義一個單獨的變量。 這是合適的替代品嗎?

p = m.Var(lb=0, ub=max(y2))
n = m.Var(lb=min(x2), ub=max(ex))

嘗試使用IMODE=2定義方程一次並將其應用於每個數據行。 下面是對以模式 2 運行的腳本的修改。

from gekko import gekko
import numpy as np

# Initial model
m = gekko()

# Variables
ns = 10
y1 = np.random.rand(ns)
y2 = np.random.rand(ns)+1
x1 = np.random.rand(ns)
x2 = np.random.rand(ns)+1

s = [None]*len(y1)
c = [None]*len(y1)
ex = [None]*len(y1)

for j in range(len(y1)):
    # slope
    s[j] = (y1[j]-y2[j])/(x1[j]-x2[j])
    # y-intercept
    c[j] = (x1[j]*y2[j] - x2[j]*y1[j])/(x1[j]-x2[j])
    # x-intercept
    ex[j] = -c[j]/s[j]

s = m.Param(s); c = m.Param(c)
p = m.Var(lb=0, ub=max(y2))
n = m.Var(lb=min(x2), ub=max(ex))

# Constraint
m.Equation(s*n+c==p)

m.options.IMODE=2

# Objective function
m.Maximize(n*p)

m.solve(disp=True)

如果每個插值都需要單獨的上限和下限,則創建一個變量數組,例如:

p = m.Array(m.Var,ns,lb=0)
n = m.Array(m.Var,ns)

文檔中顯示了有關計算模式的更多信息

每個數據行的唯一不等式約束

如果每個數據行都需要唯一的不等式約束,請使用不等式約束作為方程定義。

p = m.Var(lb=0)
n = m.Var()

# implement constraints
x2 = m.Param(x2)
y2 = m.Param(y2)
ex = m.Param(ex)

m.Equation(p<y2)
m.Equations([n>x2,n<ex])

下面是帶有不等式約束的完整腳本。 如果不能同時滿足所有不等式約束,則該問題可能不可行。

from gekko import gekko
import numpy as np

# Initial model
m = gekko()

# Variables
ns = 10
y1 = np.random.rand(ns)
y2 = np.random.rand(ns)+1
x1 = np.random.rand(ns)
x2 = np.random.rand(ns)+1

s = [None]*len(y1)
c = [None]*len(y1)
ex = [None]*len(y1)

for j in range(len(y1)):
    # slope
    s[j] = (y1[j]-y2[j])/(x1[j]-x2[j])
    # y-intercept
    c[j] = (x1[j]*y2[j] - x2[j]*y1[j])/(x1[j]-x2[j])
    # x-intercept
    ex[j] = -c[j]/s[j]

s = m.Param(s); c = m.Param(c)
p = m.Var(lb=0)
n = m.Var()

# implement constraints
x2 = m.Param(x2)
y2 = m.Param(y2)
ex = m.Param(ex)

m.Equation(p<y2)
m.Equations([n>x2,n<ex])

# Constraint
m.Equation(s*n+c==p)

m.options.IMODE=2

# Objective function
m.Maximize(n*p)

m.solve(disp=True)

暫無
暫無

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

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