Python二进制约束中的Excel解算器

2024-06-24 18:50:59 发布

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

我正在尝试实现一个Python函数,它可以解决最小化问题。我习惯用Excel解算器的“二元约束”函数和进化求解方法来实现

例如,目标函数可以采用以下形式: 3*x[0]+4*x[1]+5*x[2]+5*x[3]-12 其中12是一个变化常数。其目的是达到最接近0的值。关键是所有x都应该是0或1。所有x都可以是正的或负的,常数也是一样的

我尝试了如下Scipy:

import numpy as np
from scipy.optimize import minimize

def objective(x):
    return 3*x[0]+4*x[1]+5*x[2]+5*x[3]

def cons1(x):
    return 3*x[0]+4*x[1]+5*x[2]+5*x[3]-12


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

# show initial objective
print('Initial Objective: ' + str(objective(x0)))

# optimize
b = (0.0,1.0)
bnds = (b, b, b, b)
con1 = {'type':'eq', 'fun':cons1}
cons= [con1]
solution = minimize(objective,x0,method='SLSQP',\
                    bounds=bnds, constraints=cons)
x = solution.x

# show final objective
print('Final Objective: ' + str(objective(x)))

# print solution
print('Solution')
print('x1 = ' + str(x[0]))
print('x2 = ' + str(x[1]))
print('x3 = ' + str(x[2]))
print('x4 = ' + str(x[3])) 

这将产生:

Initial Objective: 17.0
Final Objective: 11.999999999999996
Solution
x1 = 0.799999999999997
x2 = 0.7333333333333341
x3 = 0.6666666666666663
x4 = 0.6666666666666681

我想我缺少一些参数或配置


Tags: 函数importreturndefnp常数optimizeprint