免疫算法应用在TSP中的代码示例

免疫算法应用于旅行商问题(TSP)的实现相对复杂,涉及到种群初始化、亲和力评价、选择、突变、交叉等步骤。以下是一个基于Python的简化示例,展示如何使用免疫算法解决TSP问题。请注意,这只是一个基础框架,实际应用中需要根据具体需求调整参数和策略。

import numpy as np
from itertools import permutations
from scipy.spatial.distance import pdist, squareform

def calculate_distance_matrix(cities):
    """
    计算城市间距离矩阵。
    :param cities: 城市坐标列表。
    :return: 距离矩阵。
    """
    coords = np.array(cities)
    distances = squareform(pdist(coords))
    return distances

def initial_population(n_cities, pop_size):
    """
    初始化种群。
    :param n_cities: 城市数量。
    :param pop_size: 种群大小。
    :return: 种群列表。
    """
    population = [list(permutations(range(n_cities))) for _ in range(pop_size)]
    return population

def affinity(population, distance_matrix):
    """
    计算路径的总距离(亲和力)。
    :param population: 当前种群。
    :param distance_matrix: 距离矩阵。
    :return: 各路径的亲和力列表。
    """
    fitness = [sum(distance_matrix[path[i]][path[(i+1)%n_cities]] for i in range(n_cities)) for path in population]
    return fitness

def selection(population, fitness, n_select):
    """
    选择操作,选出亲和力较好的个体。
    :param population: 当前种群。
    :param fitness: 亲和力列表。
    :param n_select: 选择的数量。
    :return: 选中的个体。
    """
    indices = np.argsort(fitness)[:n_select]
    return [population[i] for i in indices]

def mutation(population, mutation_rate):
    """
    变异操作。
    :param population: 当前种群。
    :param mutation_rate: 变异概率。
    :return: 经过变异的新种群。
    """
    mutated_pop = []
    for path in population:
        if np.random.rand() < mutation_rate:
            i, j = np.random.choice(range(len(path)), size=2, replace=False)
            path[i], path[j] = path[j], path[i]  # 交换两个城市的顺序
        mutated_pop.append(path)
    return mutated_pop

def ia_tsp(cities, pop_size=100, generations=1000, mutation_rate=0.01):
    """
    使用免疫算法求解TSP问题。
    """
    distance_matrix = calculate_distance_matrix(cities)
    n_cities = len(cities)
    population = initial_population(n_cities, pop_size)
    
    for gen in range(generations):
        fitness = affinity(population, distance_matrix)
        selected = selection(population, fitness, int(pop_size/2))
        mutated = mutation(selected, mutation_rate)
        population = selected + mutated  # 更新种群
    
    # 最后选择最优解
    best_path = population[np.argmin(affinity(population, distance_matrix))]
    best_distance = min(affinity(population, distance_matrix))
    
    return best_path, best_distance

# 示例:使用一些随机生成的城市坐标
np.random.seed(0)
cities = np.random.rand(20, 2)  # 生成20个城市,每个城市有两个坐标值

best_path, best_distance = ia_tsp(cities)
print(f"最优路径: {best_path}, 总距离: {best_distance}")

这段代码定义了TSP问题的免疫算法实现,包括初始化种群、计算亲和力(即路径总距离)、选择和变异等关键步骤。实际应用中,你可能还需要考虑更复杂的操作,如克隆、局部搜索等,以及对算法性能的进一步优化。

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用人工免疫算法解决TSP问题的Python代码: ```python import random import numpy as np # 定义TSP问题的类 class TSP: def __init__(self, city_num, coords): self.city_num = city_num self.coords = coords self.dist_mat = self.get_dist_mat() # 计算两个城市之间的距离 def get_distance(self, coord1, coord2): distance = np.sqrt(np.sum(np.square(coord1 - coord2))) return distance # 获取城市之间的距离矩阵 def get_dist_mat(self): dist_mat = np.zeros((self.city_num, self.city_num)) for i in range(self.city_num): for j in range(i+1, self.city_num): dist = self.get_distance(self.coords[i], self.coords[j]) dist_mat[i][j] = dist dist_mat[j][i] = dist return dist_mat # 定义免疫算法的类 class AIS: def __init__(self, tsp, pop_size=50, num_mutations=2, num_clones=5, clone_factor=0.5): self.tsp = tsp self.pop_size = pop_size self.num_mutations = num_mutations self.num_clones = num_clones self.clone_factor = clone_factor self.antibodies = self.init_antibodies() # 初始化抗体 def init_antibodies(self): antibodies = [] for i in range(self.pop_size): antibody = list(range(self.tsp.city_num)) random.shuffle(antibody) antibodies.append(antibody) return antibodies # 计算路径长度 def calc_path_len(self, path): path_len = 0 for i in range(self.tsp.city_num-1): path_len += self.tsp.dist_mat[path[i]][path[i+1]] path_len += self.tsp.dist_mat[path[-1]][path[0]] return path_len # 选择克隆 def select_clones(self): # 排序 self.antibodies = sorted(self.antibodies, key=lambda x: self.calc_path_len(x)) # 选择克隆 clones = [] for i in range(self.num_clones): for j in range(int(self.clone_factor*(self.pop_size-i))): clones.append(self.antibodies[i]) return clones # 变异 def mutate(self, antibody): for i in range(self.num_mutations): idx1, idx2 = random.sample(range(self.tsp.city_num), 2) antibody[idx1], antibody[idx2] = antibody[idx2], antibody[idx1] return antibody # 免疫算法主函数 def immune_algo(self, max_iter=100): best_path = None best_len = np.inf for i in range(max_iter): # 克隆 clones = self.select_clones() # 变异 for j in range(len(clones)): clones[j] = self.mutate(clones[j]) # 选择 clones = sorted(clones, key=lambda x: self.calc_path_len(x)) self.antibodies = clones[:self.pop_size] # 更新最优解 if self.calc_path_len(self.antibodies[0]) < best_len: best_path = self.antibodies[0] best_len = self.calc_path_len(self.antibodies[0]) return best_path, best_len # 测试 coords = np.array([[60, 200], [180, 200], [80, 180], [140, 180], [20, 160], [100, 160], [200, 160], [140, 140], [40, 120], [100, 120], [180, 100], [60, 80], [120, 80], [180, 60], [20, 40], [100, 40], [200, 40], [20, 20], [60, 20], [160, 20]]) tsp = TSP(city_num=len(coords), coords=coords) ais = AIS(tsp=tsp, pop_size=50, num_mutations=2, num_clones=5, clone_factor=0.5) best_path, best_len = ais.immune_algo(max_iter=100) print("最优路径:", best_path) print("最优路径长度:", best_len) ``` 该代码采用了人工免疫算法求解TSP问题。主要思路是将路径表示为一个城市序列,抗体表示为一个路径序列。在算法的每一次迭代,选择一部分抗体进行克隆操作,然后对克隆体进行变异。通过不断迭代,逐渐优化抗体的适应度,最终得到一个最优的路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值