2016-12-23 4 views
-1

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

Проблемы у меня есть следующий характер:

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 для этой проблемы. Может кто-нибудь мне помочь ?

+0

Я попытался использовать scipy.linprog, где я могу настроить первые два ограничения, но в то же время поставил под сомнение настройку последних. Я даже не уверен, что мне нужно использовать linprog для этого или нет. Больше, чем основанный на коде - его подход, который я действительно переживаю. – DrBug

+1

@DrBug Что такое 'y1',' y2' и 'y3'? Переменные или константы? ** Если ** они являются константами, тогда вы можете переписать ограничение как 'd4x4 + d5x5 = y3 * sumof (...)', которое является линейным, если 'yi' являются переменными, ограничение которых ** не ** линейно, и, следовательно, вы должны использовать что-то более мощное, как квадратичный решатель. – Bakuriu

+0

Спасибо Bakuriu. y1 .. y3 - постоянные. Однако термин sumof также включает переменные, которые я пытаюсь свести к минимуму (d1 .. dn). В этом случае первое ограничение, с которым я борюсь, на самом деле (d1x1 + d2x2)/(минимизированная функция). – DrBug

ответ

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 

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

+0

Да, я согласен. Я как-то думал, что A_eq и A_ub должны быть двоичной матрицей. Я попробую, и если это сработает, я приму свой ответ. – DrBug

Смежные вопросы