Scipy оптимизирует сведение к минимуму - ограничивает границы переменных либо 0, либо 1 - PullRequest
1 голос
/ 07 февраля 2020

Я пытаюсь минимизировать уравнение x [0] + x [1] + x [2] + x [3] .

скажем, A = [5, 3,8,6]

Уравнение ограничения: A1 x [0] + A2 x [1] + A3 x [2] + A4 x [3] = 11 , где 0 <= x <= 1 и x должно быть целым числом (0 или 1). </p>

Ожидаемый результат для x равен [0,1,1,0]

Пожалуйста, помогите мне добиться этого.

Пожалуйста, найдите ниже код, что я пробовал.

код :

from scipy.optimize import minimize

#objective function definition
def objective(x):
    return x[0]+x[1]+x[2]+x[3]

#constraint definition
def constraint1(x):
    sum_eq = 11
    a = [5,3,8,6]
    for i in range(len(a)):
        sum_eq = sum_eq - (a[i]*x[i])
    return sum_eq

#set the bounds
b = (0,1)
bnds = (b,b,b,b)
cons1 = {'type':'eq','fun':constraint1}

#initialisation
x0 = [0,0,0,1]

sol = minimize(objective,x0,method='SLSQP',bounds=bnds, constraints=cons1)
print(sol.x)

выход :

[3.53445929e-16 3.83487389e-17 1.00000000e+00 5.00000000e-01]

1 Ответ

0 голосов
/ 07 февраля 2020

Для решения этой проблемы вы можете использовать fmin_slsqp. Сначала вам нужно определить функцию, которая будет возвращать 0 из вашего уравнения. Затем оцените функцию с параметрами, чтобы найти решение с объявленными границами.

from scipy.optimize import fmin_slsqp
import numpy as np


def zero_equation(x):
    return (x*np.array([5,3,8,6])).sum()-11


def function(x):
    return x[0]+x[1]+x[2]+x[3]


b = (0,1)
bounds = (b,b,b,b)
starting_parameters = np.array([0,0,0,1])
result = fmin_slsqp(function, x0=starting_parameters , bounds=bounds ,eqcons=[zero_equation])

Вывод:

[0.  0.  1.  0.5]
...