[英]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 ...
.
.
.
我試着:
我當前的方法如下(這進入一個循環以評估每對列,然后僅為最高值存儲優化,但為了簡單起見,我在這里忽略它):
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.