Как установить ограничение, которое зависит от промежуточной свернутой функции?
Я пытаюсь установить ограничение, которое зависит от минимизированного значения функции.
Проблема, которую я имею, имеет следующую природу:
fmin = минимизировать (d1x1 +d2x2 ... +d5x5)
Где я хочу optmize со следующими ограничениями:
x1+X2+x3+x4+x5 = 1
0.003 <x1 .. X5 < 0.05
d1x1/fmin = y1
(d2x2+d3x4)/fmin = y2
(d4x4+d5x5)/fmin = y3
Здесь в этом случае y1.. yn - скалярные константы.
The problem I am having is that I dont know how to setup the A_ub or A_eq
In linprog so that B_ub = y1*fmin for d1x1 for example.
Так что как-то мне нужно определить:
x1d1 / fmin = y1 как одно из ограничений.
Здесь оптимальный вектор значений будет (d1 .. dn). Однако это также должно удовлетворять ограничению d1/minimized(d1.. dn) = y1 в качестве примера здесь.
Как мне это настроить? Какой оптимизатор я использую?
Я могу сделать это очень легко с помощью Excel Solver - но теперь я хочу написать это на Python. Я пытаюсь использовать scipy.linprog, но я не уверен, является ли это проблемой линейного программирования или мне нужно использовать другой подход. Я не могу придумать способ установить ограничения в linprog для этой проблемы. Может кто-нибудь мне помочь?
1 ответ
При условии, что d1, ..., dn
скалярные константы тоже, то, например, ограничение
d1*x1/fmin==y1
может быть переписан как
d1*x1==y1*d1*x1+y1*d2*x2+...+y1*dn*xn
Это можно нормализовать до
(d1-y1*d1)*x1 - y1*d2*x2 - y1*d3*x3 - ... - y1*dn*xn == 0
который может быть использован в качестве входных данных для линейного решателя.