早上好,

我使用scipy的差分进化算法来优化一个复杂的问题,除了很多其他参数外,还包括一个矩阵.

有没有一种有效的方法将其作为数组传递给优化过的函数?

我目前的解决方案是将表示该矩阵的数组展平为一个列表,并将其视为一堆标量参数.但这需要在每次调用要优化的函数时进行reshape .

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)

有没有一种方法可以直接传递需要优化的系统参数的矩阵值部分?

我真的不喜欢这个列表,原因有两个:它使得更难保持参数列表的顺序,因为实际系统将有很多参数,列表到数组的操作必须在进化的每一步都完成.

推荐答案

differential_evolution最小化一个或多个变量的标量函数.传递到objx数组将始终是形状(N,)的一维array.整形应该是一个非常便宜的调用,如果你设置+使用参数以行为主的顺序,整形通常会返回一个视图.

如果您的调用代码希望以2-D方式保留参数列表(和边界),那么只需在调用最小化程序之前的最后一分钟将其展平即可. 即 differential_evolution(obj, bounds_a.flatten(), args=(vec1,))

Python相关问答推荐

如何在msgraph.GraphServiceClient上进行身份验证?

韦尔福德方差与Numpy方差不同

管道冻结和管道卸载

如何在Python中并行化以下搜索?

用NumPy优化a[i] = a[i-1]*b[i] + c[i]的迭代计算

实现自定义QWidgets作为QTimeEdit的弹出窗口

在vscode上使用Python虚拟环境时((env))

迭代嵌套字典的值

用砂箱开发Web统计分析

无法连接到Keycloat服务器

在matplotlib中删除子图之间的间隙_mosaic

在单次扫描中创建列表

如何在PySide/Qt QColumbnView中删除列

搜索按钮不工作,Python tkinter

使用Python TCP套接字发送整数并使用C#接收—接收正确数据时出错

为什么我的scipy.optimize.minimize(method=";newton-cg";)函数停留在局部最大值上?

在一个数据帧中,我如何才能发现每个行号是否出现在一列列表中?

try 使用RegEx解析由标识多行文本数据的3行头组成的日志(log)文件

Python:使用asyncio.StreamReader.readline()读取长行

为什么内置的sorted()对于一个包含降序数字的列表来说,如果每个数字连续出现两次,会变慢?