gpt4 book ai didi

python - 异常 : @error: Max Equation Length in Gekko

转载 作者:行者123 更新时间:2023-12-04 17:24:22 26 4
gpt4 key购买 nike

我正在使用 Gekko 进行投资组合优化。我使用每项 Assets 的返回及其协方差矩阵作为输入。我正在尝试的代码是

# Initialize Model
m = GEKKO(remote=True)

#initialize variables
w=m.Array(m.Var,23)

for i in range(23):
w[i].value = 0.04347826
w[i].lower = 0.0
w[i].upper = 1.0


#Equations
m.Equation(0.18 >= (np.dot(w.T,np.dot(covariance_ar, w)))**0.5)
m.Equation(np.sum(w[0:23]) == 1.0)
m.Equation(w[7]+w[9]+w[11] >= (np.sum(w[7:13])*0.3))
m.Equation(w[7]+w[9]+w[11] <= (np.sum(w[7:13])*0.7))
m.Equation(w[11]+w[12] >= 0.0)
m.Equation(w[11]+w[12] <= (np.sum(w[7:13])*0.15))


#Objective
m.Obj(-(np.sum(return_ar.T @ w)))

#Solve simulation
m.solve() # solve on public server

#Results
for i in range(23):
print('w['+str(i)+']='+str(w[i].value))

return_ar 是形状为 (23,1) 的单个 Assets 的返回数组,而 covariance_ar 是形状为 (23,23) 的返回的协方差数组

虽然代码在少量权重下成功运行,但使用 23 个权重参数时会抛出错误异常:@error:最大方程长度......APM 模型错误:字符串 > 15000 个字符考虑将直线分解为多个方程

你能帮我制定代码约束以使其有效吗。

最佳答案

我无法运行您的代码,因为它缺少值,因此我不得不使用示例值对其进行修改。

# Initialize Model
from gekko import GEKKO
import numpy as np
m = GEKKO(remote=True)

#initialize variables
w=m.Array(m.Var,23)

for i in range(23):
w[i].value = 0.04347826
w[i].lower = 0.0
w[i].upper = 1.0

#Equations
covariance_ar = np.random.rand(23,23)
m.Equation(0.18 >= (np.dot(w.T,np.dot(covariance_ar, w)))**0.5)
m.Equation(m.sum(w[0:23]) == 1.0)
m.Equation(w[7]+w[9]+w[11] >= (m.sum(w[7:13])*0.3))
m.Equation(w[7]+w[9]+w[11] <= (m.sum(w[7:13])*0.7))
m.Equation(w[11]+w[12] >= 0.0)
m.Equation(w[11]+w[12] <= (m.sum(w[7:13])*0.15))

#Objective
m.Obj(-(m.sum(w)))

#Solve simulation
m.solve() # solve on public server

#Results
for i in range(23):
print('w['+str(i)+']='+str(w[i].value))

这会重现您观察到的相同错误。您可以通过使用列表理解重新定义 np.dot 函数来克服方程长度限制。此外,您需要使用 m.sum() gekko 函数而不是 numpy 函数进行求和。

# Initialize Model
from gekko import GEKKO
import numpy as np
m = GEKKO(remote=True)

#initialize variables
w=m.Array(m.Var,23)

for i in range(23):
w[i].value = 0.04347826
w[i].lower = 0.0
w[i].upper = 1.0

#Equations
C = np.random.rand(23,23)
Cw = [m.sum([m.Intermediate(C[i,j]*w[j]) \
for j in range(23)]) \
for i in range(23)]
wCw = m.sum([Cw[i]*w[i] for i in range(23)])
m.Equation(0.18 >= (wCw)**0.5)
m.Equation(m.sum(w[0:23]) == 1.0)
m.Equation(w[7]+w[9]+w[11] >= (m.sum(w[7:13])*0.3))
m.Equation(w[7]+w[9]+w[11] <= (m.sum(w[7:13])*0.7))
m.Equation(w[11]+w[12] >= 0.0)
m.Equation(w[11]+w[12] <= (m.sum(w[7:13])*0.15))

#Objective
return_ar = np.ones(23)
for i in range(23):
m.Maximize(w[i]*return_ar[i])

#Solve optimization
m.solve() # solve on public server

#Results
for i in range(23):
print('w['+str(i)+']='+str(w[i].value))

您现在可以将您的值用于 covariance_arreturn_ar。这种方法起作用的原因是 Gekko 可以将方程式分解成更小的部分,然后单独求解。每个方程 15,000 个字符的长度限制不仅是一个处理限制,而且还鼓励更好的模型制定策略,这些策略可以很好地与稀疏非线性规划求解器配合使用。

关于python - 异常 : @error: Max Equation Length in Gekko,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64373044/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com