В настоящее время я пытаюсь решить проблему оптимизации 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]