最小化带有元组列表作为参数的函数

0 投票
2 回答
38 浏览
提问于 2025-04-13 01:04

我需要最小化一个函数 objective(),这个函数的参数是一个元组的列表 x

但是有个限制:这些元组只能从一个预先定义好的元组集合中选择。

一个简单的例子是:

import numpy as np
from scipy.optimize import minimize

initial_guess = [(2.,0.6), (0.9,8.1)]
possible_values = [(0.,0.), (1.7,2.2), (10.,1.2), (0.,0.15), (4.1,6.2)]

def objective(x:list):
    return np.sum([item[0]**2 + item[1]**2 for item in x])

# Need to add a constraint to select elements of x in elements of possible_values

# Minimize objective function
result = minimize(fun = objective,
                  x0 = initial_guess)

print(result.x)

这段代码会产生以下错误:

ValueError: 'x0' must only have one dimension.

谢谢

2 个回答

-2

你可以只保留在 possible_values 中出现的那些元组,放在 x 里:

def objective(x: list):
    x = [t for t in x if t in possible_values]
    return np.sum([item[0]**2 + item[1]**2 for item in x])

0

如果你想找到一个元组,使得它的向量范数最小,使用scipy.optimize.minimize这个工具可能不是最合适的选择。要有效解决这种问题,关键是要使用二进制决策变量。这会把你的任务转变成一个混合整数规划问题,这时候选择 milp 就是正确的做法:

import numpy as np
from scipy.optimize import milp, LinearConstraint, Bounds

possible_values = [(0.,0.), (1.7,2.2), (10.,1.2), (0.,0.15), (4.1,6.2)]

c = np.array([v[0]**2 + v[1]**2 for v in possible_values])

A_eq = np.ones((1, len(possible_values)))
b_eq = np.array([1])
constraints = LinearConstraint(A=A_eq, lb=b_eq, ub=b_eq)
bounds = Bounds(lb=np.zeros(len(possible_values)), ub=np.ones(len(possible_values)))
integrality = np.ones(len(possible_values))

res = milp(c, integrality=integrality, constraints=constraints, bounds=bounds)

撰写回答