目录
- 一、采用AIS求解 TSP
- 二、 旅行商问题
- 2.1 实际例子:求解 6 个城市的 TSP
- 2.2 ==**求解该问题的代码**==
- 2.3 代码运行过程截屏
- 2.4 代码运行结果截屏(后续和其他算法进行对比)
- 三、 ==如何修改代码?==
- 3.1 减少城市坐标,如下:
- 3.2 增加城市坐标,如下:
- 四、人工免疫算法(Artificial Immune System, AIS)原理
- 4.1 AIS算法的核心概念
- 4.2 AIS算法的工作流程
- 4.3 AIS算法的优缺点
- 4.3.1 优点
- 4.3.2 缺点
- 4.4 AIS算法的应用
一、采用AIS求解 TSP
求解代码在文中,后续会出其他算法求解TSP问题,你们参加数学建模竞赛只需要会改代码即可。
用来对比此专栏的
遗传算法(GA算法)求解实例—旅行商问题 (TSP)
粒子群算法(PSO算法)求解实例—旅行商问题 (TSP)
模拟退火算法(SA算法)求解实例—旅行商问题 (TSP)
蚁群算法(ACO算法)求解实例—旅行商问题 (TSP)
禁忌搜索算法(TS算法)求解实例—旅行商问题 (TSP)
差分进化算法(DE算法)求解实例—旅行商问题 (TSP)
注意每次运行算法得到的结果可能不太一样。
我知道大家对原理性的东西不感兴趣,我把原理性的东西放在后面,大家如果需要写数模论文可以拿去,但是记得需要改一改,要不然查重过不去。
二、 旅行商问题
2.1 实际例子:求解 6 个城市的 TSP
假设有 6 个城市,其坐标如下:
城市 | X 坐标 | Y 坐标 |
---|---|---|
0 | 10 | 20 |
1 | 30 | 40 |
2 | 20 | 10 |
3 | 40 | 30 |
4 | 10 | 10 |
5 | 50 | 20 |
目标是找到一个经过所有城市且总距离最短的路径。
2.2 求解该问题的代码
import numpy as np
import random
# 定义城市坐标
cities = np.array([
[10, 20],
[30, 40],
[20, 10],
[40, 30],
[10, 10],
[50, 20]
])
# 计算两城市之间的欧几里得距离
def calculate_distance(city1, city2):
return np.sqrt(np.sum((city1 - city2) ** 2))
# 计算总旅行距离
def total_distance(path):
distance = 0
for i in range(len(path) - 1):
distance += calculate_distance(cities[path[i]], cities[path[i + 1]])
distance += calculate_distance(cities[path[-1]], cities[path[0]]) # 回到起点
return distance
# 克隆与变异操作
def clone_and_mutate(antibody, clone_rate, mutate_rate):
clones = []
num_clones = max(int(clone_rate * len(antibody)), 1) # 确保至少有一个克隆
for _ in range(num_clones):
clone = antibody[:]
if random.random() < mutate_rate:
# 随机交换路径中的两个城市
i, j = random.sample(range(len(clone)), 2)
clone[i], clone[j] = clone[j], clone[i]
clones.append(clone)
return clones
# 人工免疫算法求解 TSP
def ais_tsp(cities, population_size=50, clone_rate=0.1, mutate_rate=0.2, max_iter=100):
# 初始化种群
population = [random.sample(range(len(cities)), len(cities)) for _ in range(population_size)]
best_solution = population[0]
best_distance = total_distance(best_solution)
for iteration in range(max_iter):
# 计算适应度(亲和度)
affinities = [1 / total_distance(antibody) for antibody in population]
# 克隆与变异
new_population = []
for i in range(population_size):
clones = clone_and_mutate(population[i], clone_rate, mutate_rate)
new_population.extend(clones)
# 检查新种群是否为空,若为空则使用原始种群
if not new_population:
new_population = population[:]
# 选择新的候选解
new_population.sort(key=total_distance) # 根据总距离排序
population = new_population[:population_size] # 保留最好的候选解
# 更新最佳解
current_best_distance = total_distance(population[0])
if current_best_distance < best_distance:
best_solution = population[0]
best_distance = current_best_distance
print(f"Iteration {iteration + 1}: Best distance = {best_distance:.2f}")
return best_solution, best_distance
# 运行人工免疫算法
best_path, best_distance = ais_tsp(cities)
print("Best path:", best_path)
print("Best distance:", best_distance)
2.3 代码运行过程截屏
2.4 代码运行结果截屏(后续和其他算法进行对比)
三、 如何修改代码?
这一部分是重中之重,大家参加数学建模肯定是想跑出自己的结果,所以大家只需要把自己遇到的数学问题,抽象成TSP问题,然后修改代码的城市坐标,然后运行即可。
# 定义城市坐标
cities = np.array([
[10, 20],
[30, 40],
[20, 10],
[40, 30],
[10, 10],
[50, 20]
])
3.1 减少城市坐标,如下:
# 定义城市坐标
cities = np.array([
[10, 20],
[30, 40],
[20, 10],
[40, 30]
])
3.2 增加城市坐标,如下:
# 定义城市坐标
cities = np.array([
[10, 20],
[30, 40],
[20, 10],
[40, 30],
[30, 40],
[20, 10],
[10, 10],
[50, 20]
])
四、人工免疫算法(Artificial Immune System, AIS)原理
人工免疫算法(AIS)是一种受到生物免疫系统启发而发展的智能优化算法。生物免疫系统具有识别和消灭外部病原体(如病毒、细菌等)的能力,通过学习和记忆机制,能够快速识别并应对新入侵的病原体。AIS 模拟了这种免疫系统的特性和机制,用于解决复杂的优化和分类问题。
4.1 AIS算法的核心概念
-
抗体(Antibody):在 AIS 中,抗体通常表示一个候选解。例如,在旅行商问题(TSP)中,一个抗体可以表示城市访问顺序(路径)。
-
抗原(Antigen):抗原是需要被识别和优化的问题或目标。在优化问题中,抗原表示需要求解的目标(例如,TSP 中的最短路径)。
-
亲和力(Affinity):亲和力表示抗体与抗原之间的匹配程度。在优化问题中,亲和力通常由目标函数值表示,亲和力越高(或越低,取决于优化目标),表示解的质量越好。
-
克隆选择(Clonal Selection):克隆选择是 AIS 的核心机制之一,表示根据亲和力对抗体进行选择、克隆和变异。质量越高的抗体会被选择生成更多的克隆体,并通过变异产生新的候选解。
-
亲和力成熟(Affinity Maturation):在克隆选择之后,通过对克隆体进行变异和选择,使抗体的亲和力进一步提高,从而产生更好的解。这类似于遗传算法中的“变异”操作。
-
记忆集(Memory Set):记忆集存储当前找到的最优解,以防止算法丢失已找到的优秀解。
4.2 AIS算法的工作流程
-
初始化:随机生成一组抗体(候选解),形成初始种群。
-
计算亲和力:对每个抗体计算其亲和力(即适应度函数),用以衡量抗体的质量。
-
克隆选择:根据亲和力对抗体进行选择,选择质量较高的抗体进行克隆。克隆率通常与亲和力成正比,即亲和力越高的抗体被克隆的数量越多。
-
变异操作:对克隆体进行变异操作,产生新的候选解。变异的目的是引入多样性,以探索解空间中的更多区域。
-
亲和力成熟:对变异后的克隆体重新计算亲和力,选择质量更高的解更新种群。
-
记忆更新:将当前找到的最优解存入记忆集中,以防止丢失优秀解。
-
终止条件:重复步骤 2-6,直到满足终止条件(如达到最大迭代次数或找到满意的解)。
4.3 AIS算法的优缺点
4.3.1 优点
-
全局优化能力强
通过克隆选择和亲和力成熟机制,AIS 能有效地进行全局搜索,避免陷入局部最优解。 -
自适应性好
AIS 能自动调整种群结构,通过亲和力评价和选择机制,提高算法的搜索效率。 -
具有记忆能力
AIS 可以记住并保存最优解,通过记忆集的机制防止解的退化,保持解的质量。 -
解决多样性问题
通过变异操作引入多样性,保持种群多样性,避免早熟收敛,提高算法的搜索空间覆盖率。 -
适用于多种优化问题
AIS 广泛应用于优化问题(如 TSP、背包问题)、模式识别与分类、数据挖掘与特征选择、网络安全等领域。
4.3.2 缺点
-
收敛速度较慢
在大规模或复杂问题中,由于需要进行大量的克隆、变异和亲和力计算,收敛速度可能较慢。 -
参数设置敏感
算法性能对参数的选择(如克隆率、变异率、种群大小等)敏感,参数不恰当可能导致局部最优或过早收敛,需要大量调参。 -
容易陷入局部最优解
尽管变异操作引入了多样性,但在解空间复杂或具有大量局部最优解的情况下,算法仍有可能陷入局部最优。 -
计算复杂度高
克隆、变异和亲和力计算的操作对计算资源要求较高,对于大规模问题或多维问题,计算复杂度显著增加。 -
对问题特征依赖较强
AIS 的有效性在很大程度上取决于问题的特征,在某些问题上可能无法比其他优化算法取得更好效果。 -
缺乏理论分析
相较于其他经典优化算法,AIS 算法的理论基础和收敛性分析较少,理论研究不够完善。 -
实现复杂度较高
AIS 涉及多个复杂的过程(如克隆选择、亲和力成熟等),实现和调试较为复杂,需要更多的时间和精力。
4.4 AIS算法的应用
- 优化问题(如 TSP、背包问题)
- 模式识别与分类
- 数据挖掘与特征选择
- 网络安全(如入侵检测)