Scipy 差分进化:如何将矩阵作为参数传递给优化?

2 投票
1 回答
34 浏览
提问于 2025-04-14 15:53

早上好,

我正在使用scipy的差分进化算法来优化一个复杂的问题,这个问题除了有很多其他参数外,还涉及到一个矩阵。

有没有什么有效的方法可以把这个矩阵作为数组或者类似的形式直接传递给需要优化的函数呢?

目前我的解决方案是把表示这个矩阵的数组压平,变成一个列表,然后把它当作一堆标量参数来处理。但这样每次调用需要优化的函数时,都得重新调整形状。

from scipy.optimize import differential_evolution


#Bounds for a 3x3-Matrix
bounds_a=[[-1,1],[-1,1],[-1,1],[-1,1],[-1,1],[-1,1],[-1,1],[-1,1],[-1,1]]


#vector to simulate a system to be optimized 
vec1=([1,1,1])

#function to be optimized

def obj(x, *data): 
    # reshape the flattened matrix
    x=x.reshape(3,3)
        
    # do the calculations
    z=(sum(x.dot(data)))**2    
    return z  

#call the solver 
result = differential_evolution(obj, bounds_a, args=vec1)

有没有办法可以直接传递需要优化的系统参数中矩阵的部分呢?

我其实不太喜欢用列表,主要有两个原因:一是这样会让保持参数顺序变得更困难,因为实际的系统会有很多参数;二是每次进化步骤都得进行列表和数组之间的转换。

1 个回答

1

differential_evolution 是用来最小化一个或多个变量的标量函数的工具。传给 objx 数组总是一个一维数组,形状是 (N,)。如果你按照行优先的顺序设置和使用参数,调整数组的形状通常是一个很简单的操作,这个调整通常会返回一个视图。

如果你的代码想要把参数(和边界)保持在二维的形式,那么在调用最小化函数之前,最后一刻再把它们压平就可以了。也就是说,你可以这样写:differential_evolution(obj, bounds_a.flatten(), args=(vec1,))

撰写回答