具有非线性目标的优化问题矩阵

时间:2019-02-04 14:34:52

标签: python optimization scipy

我有一个具有非线性目标和线性约束的优化问题。

要优化的变量是矩阵 A ,代表每个投资组合( m )将在每种产品( n )(因此,每一行代表一个产品组合,每一列代表一个可用产品):

matrix

  • 有一个向量 a p0 告诉我们每个 n (投资组合)已经投入的金额。
  • 有一个向量 y p0 告诉我们每个 n (投资组合)的平均兴趣为已经投资的金额。
  • 有一个向量 a p 告诉我们每个 n (投资组合)可用的总量。
  • 有一个向量 y L 告诉我们每个 m (产品)的利率。
  • 有一个向量 a L 告诉我们每个 m (产品)可用的总量。

vectors

  • 我们有一个 y target ,我们希望投资组合尽可能地接近。

我们要填充 A (金额矩阵),以便所有投资组合尽可能接近 y target

因此,我们的目标是使投资组合预计收益率的加权平均值与 y target 之间的差之和尽可能小。

objective

我们有三个约束:

每位投资者的所有投资之和必须小于该投资者可用的总金额。

constraint1

每种产品的所有投资总和必须等于该产品的价值。

constraint2

每个投资组合对每种产品的投资必须小于X。

constraint3

到目前为止,为了解决此问题,我尝试了:  -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')


此刻我被阻止了,我遇到了内存错误,不确定是否在正确的路径上工作。

有人可以帮我评估一下吗?

  1. 如果此优化问题可以解决
  2. 如果我采用的方法是正确的

谢谢。

0 个答案:

没有答案