一、引力搜索算法简介

引力搜索算法(Gravitational Search Algorithm,GSA)是一种基于万有引力定律和物体运动定律的启发式优化算法。它模拟了宇宙中物体之间的引力相互作用,通过引力的吸引和物体的运动来寻找最优解,在解决复杂的优化问题中表现出了良好的性能。

import numpy as np

# 目标函数(Rosenbrock 函数)
def objective_function(x, y):
    return (1 - x)**2 + 100 * (y - x**2)**2

# 计算两个粒子之间的欧几里得距离
def euclidean_distance(x1, y1, x2, y2):
    return np.sqrt((x1 - x2)**2 + (y1 - y2)**2)

# 引力搜索算法
def gravitational_search_algorithm():
    N = 50  # 粒子数量
    G0 = 100  # 初始引力常数
    T_max = 200  # 最大迭代次数
    lb_x, lb_y = -2, -2  # x和y的下限
    ub_x, ub_y = 2, 2  # x和y的上限

    # 初始化粒子位置
    positions = np.random.uniform(low=[lb_x, lb_y], high=[ub_x, ub_y], size=(N, 2))
    velocities = np.zeros((N, 2))

    for t in range(T_max):
        G = G0 * ((T_max - t) / T_max)  # 引力常数随时间变化

        # 计算适应度值
        fitness_values = np.array([objective_function(pos[0], pos[1]) for pos in positions])

        # 计算质量(这里简单地根据适应度值线性映射)
        best_fitness = np.min(fitness_values)
        worst_fitness = np.max(fitness_values)
        masses = (fitness_values - worst_fitness) / (best_fitness - worst_fitness + 1e-8)

        forces = np.zeros((N, 2))
        for i in range(N):
            for j in range(N):
                if i!= j:
                    distance = euclidean_distance(positions[i][0], positions[i][1], positions[j][0], positions[j][1])
                    force_x = G * masses[i] * masses[j] / (distance + 1e-8) * (positions[j][0] - positions[i][0])
                    force_y = G * masses[i] * masses[j] / (distance + 1e-8) * (positions[j][1] - positions[i][1])
                    forces[i] += np.array([force_x, force_y])

        accelerations = forces / np.array([masses]).reshape(-1, 1)

        velocities = np.random.rand(N, 2) * velocities + accelerations
        positions = positions + velocities

    best_index = np.argmin(fitness_values)
    return positions[best_index]

# 运行引力搜索算法并输出结果
result = gravitational_search_algorithm()
print("最优解:", result)
print("最优值:", objective_function(result[0], result[1]))

在上述代码中,我们首先定义了目标函数 objective_function 和计算欧几里得距离的函数 euclidean_distancegravitational_search_algorithm 函数实现了引力搜索算法的主要逻辑,包括粒子位置和速度的初始化、迭代过程中的质量计算、引力和加速度计算以及位置和速度更新。最后,我们运行算法并输出最优解和最优值。这个案例展示了引力搜索算法在简单函数优化问题中的应用,对于更复杂的优化问题,可根据实际情况对算法进行适当调整。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐