Как установить ограничение, которое зависит от промежуточной свернутой функции?

Я пытаюсь установить ограничение, которое зависит от минимизированного значения функции.

Проблема, которую я имею, имеет следующую природу:

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

который может быть использован в качестве входных данных для линейного решателя.

Другие вопросы по тегам