在网上看了一些蚁群算法原理,其中最为广泛的应用还是那个旅行家问题(TSP)。诸如粒子群优化算法,蚁群算法都可以求一个目标函数的最小值问题的。
下面代码记录下跑的代码。蚁群算法中最为重要的就是目标函数和信息素矩阵的设计。其他的参数则为信息素重要程度,信息素挥发速度,适应度的重要程度。
import numpy as np from scipy import spatial import pandas as pd import matplotlib.pyplot as plt ''' test Ant Aolony Algorithm ''' num_points = 25 points_coordinate = np.random.rand(num_points, 2) # generate coordinate of points distance_matrix = spatial.distance.cdist(points_coordinate, points_coordinate, metric='euclidean') # routine 中应该为一个列表,其中存放的是遍历过程中的位置编号 def cal_total_distance(routine): num_points, = routine.shape return sum([distance_matrix[routine[i % num_points], routine[(i + 1) % num_points]] for i in range(num_points)]) # %% Do ACA from sko.ACA import ACA_TSP ''' 需要设置的参数包含以下部分: (1): 目标函数: 用于衡量之前走过的的路径的目标值(累计路程值), 需要有一个参数routine, 用于记录遍历的路径位置索引 (2): 维度数目: 此数字将被用于程序进行构建遍历路径位置索引 (3): 蚁群数目: size_pop (4): 最大迭代次数: 作为一项中值条件 (5): 距离(隶属度/信息素)矩阵: 蚁群算法中一般称其为信息素矩阵,需要预先进行计算,旨在记录两个路径点之间的距离长度 [注意]: 距离矩阵在输入之前需要进行计算 缺点: 速度太慢 ''' aca = ACA_TSP(func=cal_total_distance, n_dim=num_points, size_pop=500, max_iter=200, distance_matrix=distance_matrix) best_x, best_y = aca.run() # %% Plot fig, ax = plt.subplots(1, 2) best_points_ = np.concatenate([best_x, [best_x[0]]]) best_points_coordinate = points_coordinate[best_points_, :] ax[0].plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1], 'o-r') pd.DataFrame(aca.y_best_history).cummin().plot(ax=ax[1]) plt.show()