python - 如何用scipy优化n个点的位置?

标签 python algorithm scipy mathematical-optimization

<分区>

假设我有一个接受 n 个点(其中 n 是大于或等于 2 的正整数)并输出某个任意值的适应度函数。我的目标是最大化(或最小化)输出。

现在,我需要找到这些点的最优或半最优配置。我认为这可能是一个有趣的问题,如果您将 n 个点的集合视为动物,那么将其视为遗传算法,其中每个点都是一个“特征”。

我一直在研究如何实现遗传算法,我发现关于这些点配置中的哪些应该死掉的部分特别令人困惑。我应该只删除所有不适合原始配置的配置吗?我应该给它们称重,使它们比原来的配置更不合身吗?或者只是增加死亡的可能性。任何示例代码都会有很大帮助,因为这是我第一次实现遗传算法,因此我们将不胜感激。

顺便说一句,我正在为这个项目使用 python。

最佳答案

在我看来,这就像是 scipy.optimize 的直接案例.

如果您的函数是可微分的(即,如果您可以定义雅可比矩阵和/或海森矩阵),我建议使用基于梯度的方法,因为它们收敛得更快。听起来你也有一个 unconstrained最小化问题,除非您对每个点的有效值有约束(或其他一些约束)。

所以基本上如果你有你的目标函数

def fitness(points):
    # calculates fitness value

然后你可以做类似的事情

from scipy.optimize import minimize

x0 = [] # fill with your initial guesses
new_points = minimize(fitness, x0, method='Nelder-Mead')  # or whatever algorithm

那么 new_points 将是优化点的列表

为了完整起见,minimize 的完整签名是

scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)

您可以看到 method 后面的两个参数是 jachess,您可以在其中传递可以计算 Jacobian 和您的目标函数的 Hessian 分别。正如我在评论中提到的,如果您无法计算这些(由于没有描述您的目标函数的方程式或目标函数在数学上不可微分),您可以使用无梯度算法来执行优化。

关于python - 如何用scipy优化n个点的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31347715/

相关文章:

python - Matplotlib:如何指定 x-label 边界框的宽度

python - 面向初学者的关于 OSX 上的 Python 包管理的常识性建议

在计算机之间复制数据的算法

Python- 在对象列表上使用集合 <class 'xyz.models.abc' >

algorithm - 2-CNF SAT 如何在 P 中,而 3-CNF SAT 在 NPC 中?

python - Numpy 第 n 个奇数根,包括负值

python - 使用 python 捕获并解释 XI2 RawKeyPress 事件

python - 如何使用 Angular 客户端和 Django 服务器处理读取、提取和保存极大的 csv 或 excel 数据

python - 带有 mask 和 RGB 图像的 Numpy/Scipy

python - scipy.stats 上的导入错误