scipy.optimize.linprog ограничение равенства не выполняется - PullRequest
0 голосов
/ 06 августа 2020

В настоящее время я пытаюсь решить проблему оптимизации LP с помощью scipy.optimize.linprog.

Я трижды проверил весь код, но не могу понять, почему единственное ограничение равенства проблемы не выполняется .

import numpy as np
import scipy.optimize as opt
import scipy.stats as sts
import pandas as pd
    
def problems(a, t, alpha):
    #
    y = []
    
    for i in a.columns:
        loc, scale = sts.gumbel_l.fit(a[i])
        y.append(sts.gumbel_l.rvs(loc, scale, t))
    
    obj = [1] + [0 for x in range(len(a.columns))] + [(1 / (1 - alpha) * t) for x in range(t)]
    
    ttt = np.zeros((t, t))
    np.fill_diagonal(ttt, 1.)
    
    aub = np.concatenate((np.asmatrix([1 for x in range(t)]).T, np.asmatrix(y).T, ttt), axis = 1)
    aeq = np.asmatrix(([0] + [1 for x in range(len(a.columns))] + [0 for x in range(t)]))
    
    bub = [0. for x in range(t)]
    beq = [1.]
    
    res = opt.linprog(
        c = obj, 
        A_ub = aub,
        b_ub = bub,
        A_eq = aeq,
        b_eq = beq,
    )

    return res['x']
    
if __name__ == "__main__":
    np.random.seed(2)
    a = pd.DataFrame(np.random.rand(400, 3))
    res = problems(a, t = 100, alpha = 0.95)
    print(res.round(3))

Обратите внимание, что это задача оптимизации с тремя переменными:

obj = [1] + [0 for x in range(len(a.columns))] + [(1 / (1 - alpha) * t) for x in range(t)]

В частности, мне нужно, чтобы после оптимизации сумма элементов второй переменной, которая должна быть определено (что представляет собой массив len(a.columns)) is equale to 1. Hence the equality constraint defined by aeq and bee`.

К сожалению, результат следующий (2,013 + 1,573 + 2,413 не равно 1.):

[0.661 2.013 1.573 2.413 1.995 2.038 0.695 1.975 1.056 2.202 1.728 1.494
 1.214 1.419 1.382 1.632 1.36  1.004 1.283 2.314 2.286 1.651 0.929 1.834
 1.663 1.346 2.34  2.09  1.831 1.886 1.845 2.222 2.318 2.064 1.242 1.632
 0.33  1.77  0.687 0.618 0.07  1.148 1.939 2.08  2.18  1.143 2.051 0.616
 1.396 1.027 0.978 1.014 1.038 1.62  0.999 2.103 1.639 2.198 2.445 2.171
 0.862 1.556 0.608 1.465 1.372 2.143 0.738 1.99  1.525 1.344 1.798 2.111
 1.168 2.331 2.082 1.248 2.27  1.738 1.936 1.957 0.661 1.783 1.509 0.522
 1.785 2.095 1.537 2.229 1.065 1.973 2.193 0.132 1.997 0.984 1.359 1.761
 1.809 0.247 1.893 2.04  1.873 2.019 2.124 2.107]

1 Ответ

1 голос
/ 06 августа 2020

Документация запрашивает:

A_ub: двумерный массив, необязательный

A_eq: двумерный массив, необязательный

Вы используете np.matrix -> прочтите примечание!

Основывайте свой код на numpy s array-type

(что больше, чем просто копирование и вставка -> это также несколько указывает на то, что, возможно, могло go ошибаться внутри linprog).

...