假设我有一个接受 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
后面的两个参数是 jac
和 hess
,您可以在其中传递可以计算 Jacobian 和您的目标函数的 Hessian 分别。正如我在评论中提到的,如果您无法计算这些(由于没有描述您的目标函数的方程式或目标函数在数学上不可微分),您可以使用无梯度算法来执行优化。