我有一个具有非线性目标和线性约束的优化问题。
要优化的变量是矩阵 A ,代表每个投资组合( m )将在每种产品( n )(因此,每一行代表一个产品组合,每一列代表一个可用产品):
我们要填充 A (金额矩阵),以便所有投资组合尽可能接近 y target 。
因此,我们的目标是使投资组合预计收益率的加权平均值与 y target 之间的差之和尽可能小。
我们有三个约束:
每位投资者的所有投资之和必须小于该投资者可用的总金额。
每种产品的所有投资总和必须等于该产品的价值。
每个投资组合对每种产品的投资必须小于X。
到目前为止,为了解决此问题,我尝试了: -PuLP python库-无效,因为目标函数具有非线性关系) -scipy.optimize这是我现在正在尝试的方法。但是,我不知道是否有挑战能够克服。
演示版本,代码:
import pandas as pd
import scipy
from scipy import optimize
import numpy as np
import random
n = 100
m = 5000
a_p0 = np.random.rand(1,m)*100000
y_p0 = np.random.rand(1,m)*4
a_p = np.random.rand(1,m)*10000
y_l = np.random.rand(1,n)*4
a_l = np.random.rand(1,n)*2000
y_target = random.random()*4
A = scipy.rand(n, m)*10
y_target = random
row = n
col = m
#optimize doesn't accept matrices so I transform it to a vector
def toVector(w):
return np.hstack(w)
def toMat(vec, row, col):
return vec[:row*col].reshape(row,col)
def cons_loans_amt(v):
A = toMat(v,row, col)
return A.sum(axis=1) - a_l
def constrain_invst_amt(v):
A = toMat(v,row, col)
return a_p - A.sum(axis=0)
cons = [{'type':'eq', 'fun': cons_loans_amt},
{'type':'ineq', 'fun': constrain_invst_amt}]
def objective(v):
A = toMat(v,row, col)
diff = 0
for m in range(A.shape[1]):
opt_up = (y_p0[0][m] * a_p0[0][m]) + np.dot(y_l, A[m])
opt_down = a_p0[0][m] + A[m].sum()
diff += ((opt_up/opt_down) - y_target)**2
return diff.sum()
#This is the code I am running at the moment with a memory error.
x0 = scipy.rand(row, col)
x0 = toVector(x0)
optimize.minimize(objective, x0, constraints=cons, method='SLSQP')
此刻我被阻止了,我遇到了内存错误,不确定是否在正确的路径上工作。
有人可以帮我评估一下吗?
谢谢。