Scipy optimize minimize将变量边界限制为0或1

2024-09-26 18:08:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图最小化方程x[0]+x[1]+x[2]+x[3]

假设A=[5,3,8,6]

约束方程为a1x[0]+a2x[1]+a3x[2]+a4x[3]=11式中0<;=x<;=1和x应为整数(0或1)

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]

Tags: 代码ltreturndefeqsumboundsobjective
1条回答
网友
1楼 · 发布于 2024-09-26 18:08:12

要解决这个问题,可以使用^{}。首先,您需要定义一个函数,该函数将从您的等式返回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]

相关问题 更多 >

    热门问题