Ограничение со сципионом - PullRequest
0 голосов
/ 03 мая 2020

У меня есть проблема многоцелевой оптимизации в условиях ограничения (максимизация), фактически я преобразовал ее в монообъективную задачу с помощью метода взвешивания и добавил 2 переменные x1, x2 (для оптимизации) с ограничением 0 <x1 + x2 <1 поэтому их сумма должна быть строго меньше 1, чтобы вызвать 3-ю целевую функцию, как описано в приведенном ниже коде.

Когда я выполняю, сумма всегда больше 1.

    for i in range(len(f1)):
        def f(x):
            x1= x[0]
            x2= x[1]
            return -(x1*f1[i]+ x2*f2[i]+ (1-x1-x2)*f3[i])

        def constraint(x):
            return x[0]+x[1]-1

        b= (0.2, 0.8)
        bnds= (b, b)
        x0=[0.5,0.4]

        cons= ({'type': 'ineq','fun':constraint})

        res = minimize(f,x0, method= 'SLSQP', bounds=bnds, constraints=cons)

        print('Vect_ponderation : ', res.x)

Выход:

Vect_ponderation :  [0.8 0.8]
Vect_ponderation :  [0.8 0.8]
Vect_ponderation :  [0.8 0.8]
Vect_ponderation :  [0.8 0.8]

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Как я понимаю, ваша проблема в том, что на выходе есть x1+x2>1. Я проверил оптимизацию документации и там написано: «неравенство означает, что оно должно быть неотрицательным». Таким образом, вы запросили что-то противоположное тому, что, по вашему мнению, вы запросили.

Предложения:

  • У вас очень простая функция, поэтому попробуйте указать Jacobian в качестве дополнительного параметра. Подгонка гораздо эффективнее, чем.

  • Попробуйте представить минимальный воспроизводимый пример . Это делает ответ намного проще. В вашем вопросе отсутствуют определения f1, f2 и f3.

  • Попробуйте задать вопрос. Я нашел что-то, что может быть проблемой, которую вы пытаетесь решить, но я не уверен, потому что в вашем вопросе нет вопроса (то есть предложения с вопросительным знаком).

0 голосов
/ 03 мая 2020

Документация гласит:

Ограничение равенства означает, что результат функции ограничения должен быть равен нулю , тогда как неравенство означает, что он должен быть неотрицательным . Обратите внимание, что COBYLA поддерживает только ограничения неравенства.

def constraint(x):
    return x[0] + x[1] -1

означает:

x0 + x1 - 1 >= 0  # non-negative
<-> 
x0 + x1 >= 1

, что учитывается в вашем решении.

Возможно, вы хотите:

def constraint(x):
    return - x[0] - x[1] + 1

Также имейте в виду, что не существует понятия строгого неравенства . Вам нужно будет ввести некоторые epsilon константы априори, например: eps = 1e-6:

def constraint(x):
    return - x[0] - x[1] + 1 - EPS
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...