Как запустить MOSEK Солвер в CVXOPT - PullRequest
0 голосов
/ 01 марта 2020

Я написал небольшой код для простой оптимизации минимальной дисперсии с помощью CVXOPT, вы можете увидеть весь код ниже

Используя solvers.qp (P, q, G, h, A, b) в CVXOPT код работает нормально, и он находит решение

solvers.qp(P, q, G, h, A, b)

Я тоже хотел попробовать другой решатель, поэтому я использовал MOSEK, решая ту же проблему со следующими параметрами

solvers.qp(P, q, G, h, A, b, solver='mosek') 

При использовании solver = 'mosek' код не может быть запущен и выдает следующую ошибку

Ошибка MOSEK 1295: квадратичная матрица коэффициентов c в задаче не является положительной полуопределенной, как и ожидалось для задачи минимизации

Может кто-нибудь объяснить, почему я получил эту ошибку (я что-то неправильно кодировал?) И есть ли обходной путь для решения проблемы, с которой я сталкиваюсь с MOSEK

import numpy as np
import cvxopt as opt
import mosek
from cvxopt import matrix, solvers

def optimize_portfolio(n, Var_Cov):
        P = opt.matrix (Var_Cov)
        q = opt.matrix(np.matrix(np.zeros((n, 1))))
        G = opt.matrix(np.array(-np.identity(n)))
        h = opt.matrix(np.zeros((n,1)))             
        A = opt.matrix(1.0, (1,n))
        b = opt.matrix(1.0)

        # Finding a solution

        sol = solvers.qp(P, q, G, h, A, b, solver='mosek')
        return sol

### Parameters setup

Var_Cov = np.loadtxt('C:\VAR_COV.txt')
n = len (Var_Cov)

### solve
solution = optimize_portfolio(n, Var_Cov)

# Save Results
Port_Opt = np.matrix(solution['x'])
...