Сципи Оптимизация ограничений - PullRequest
0 голосов
/ 15 марта 2019

Может кто-нибудь поделиться, как правильно установить ограничения для Scipy Optimize?

Это для установки суммы на >=100:

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

Как бы вы ее установили=100 или <=100 Я просто не видел этих случаев в документах или других примерах.

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

def constraint2(x):
    return (x[0]%=0)

Это полный пример:

import numpy as np
from scipy.optimize import minimize
profit_0=50
profit_1=25

# initial guesses
n = 2
x0 = np.zeros(n)
x[0]=0
x[1]=0

def objective(x):
    return -1*(x[0]*profit_0 + x[1]*profit_1)

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

def constraint2(x):
    return (x[0]%=0)

def constraint3(x):
    return (x[1]%=0)

b = (0,100)
bnds = (b, b)

con1 = {'type': 'ineq', 'fun': constraint1} 
con2 = {'type': 'eq', 'fun': constraint2} 
con3 = {'type': 'eq', 'fun': constraint3} 
cons = ([con1,con2,con3])

solution = minimize(objective,x0,method='SLSQP',bounds=bnds,constraints=cons)#constraints=cons
x=solution.x
print (solution)

1 Ответ

1 голос
/ 18 марта 2019

Я объясню более подробно комментарий @ sascha. Во-первых, давайте посмотрим на разницу между неравенством и ограничениями равенства. документация гласит:

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

Таким образом, для ограничения, что x [0] + x [1] <= 100, вы можете использовать ограничение неравенства и определить функцию ограничения следующим образом: </p>

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

, который является неотрицательным, если условие выполнено.

Для условия, что x [0] + x [1] == 100, у вас есть две возможности:

  1. Вы можете использовать два ограничения неравенства:
def constraint1(x):
  return 100 - x[0] - x[1]
def constraint2(x):
  return x[0] + x[1] - 100
con1 = {'type': 'ineq', 'fun': constraint1}
con2 = {'type': 'ineq', 'fun': constraint2}
  1. Вы можете использовать ограничение равенства:
def constraint(x):
    return x[0] + x[1] - 100
con = {'type': 'eq', 'fun': constraint}

Вы также можете рассмотреть возможность использования операторов if в своей функции ограничения, если это кажется вам более интуитивным:

def constraint(x):
    return 1 if x[0] + x[1] <= 100 else 0
con = {'type': 'ineq', 'fun':constraint}

Относительно ваших ограничений 2 и 3, обратите внимание, что x[0]%=0 - это сокращение от x[0] = x[0]%0. Это означает, что это задание. Попытка вернуть назначение приводит к синтаксической ошибке. Кроме того, вы должны быть осторожны: модуль по нулю не определен. Например, 5%0 выдаст вам ошибку. (Хотя кажется, что для массива NumPy x x[0]%0 только выдает предупреждение и возвращает 0.)

Можете ли вы объяснить, чего вы хотите достичь с помощью этого ограничения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...