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

How to use scipy to optimize the position of n points?

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

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

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

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

在我看来,这似乎是 scipy.optimize 的直接案例。

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

所以基本上如果你有 objective 功能

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,您可以在其中传递可以计算 [=36= 的 Jacobian 和 Hessian 矩阵的函数] 函数,分别。正如我在评论中提到的,如果您无法计算这些(由于没有描述您的 objective 函数的方程式或 objective 函数在数学上不可微),您可以使用无梯度算法执行优化。