遗传算法实战:从原理到TSP问题求解

一、遗传算法核心原理

1.1 生物进化与算法映射

遗传算法(Genetic Algorithm, GA)通过模拟生物进化机制,解决复杂优化问题。其核心思想是通过选择、交叉、变异操作,在解空间中搜索全局最优解。下表展示了生物概念与算法组件的对应关系:遗传算法(Genetic Algorithm, GA)通过模拟生物进化机制,解决复杂优化问题。其核心思想是通过选择、交叉、变异操作,在解空间中搜索全局最优解。下表展示了生物概念与算法组件的对应关系:

生物学术语遗传算法组件作用描述
染色体(Chromosome)解的编码(如实数序列)存储解的表示形式
基因(Gene)编码中的单个元素构成解的基本单元
种群(Population)候选解集合算法迭代进化的基础
适应度(Fitness)目标函数值评估解质量的量化指标
自然选择(Selection)选择操作保留优质解,淘汰劣质解
交叉(Crossover)基因重组操作生成新解以探索解空间
变异(Mutation)随机扰动操作避免早熟收敛,增强多样性

1.2 算法流程框架

  1. 初始化种群:生成初始候选解集合
  2. 适应度评估:计算每个解的路径总长度
  3. 选择操作:筛选优质个体进入下一代
  4. 交叉操作:重组父代基因生成子代
  5. 变异操作:对子代进行随机扰动
  6. 迭代进化:重复步骤2-5直至收敛

二、TSP问题建模与参数设定

2.1 问题定义

我方需从基地(坐标 ( 70 , 40 ) (70,40) (70,40))出发,侦察100个目标后返回,求最短路径。问题转化为102节点TSP问题,目标函数为:
min ⁡ f ( π 1 , π 2 , … , π 102 ) = ∑ i = 1 101 d π i π i + 1 \min f(\pi_1, \pi_2, \dots, \pi_{102}) = \sum_{i=1}^{101} d_{\pi_i \pi_{i+1}} minf(π1,π2,,π102)=i=1101dπiπi+1
其中 d i j d_{ij} dij为节点 i i i j j j的球面距离,计算公式为:
d i j = 6370 ⋅ arccos ⁡ [ cos ⁡ ( x i − x j ) cos ⁡ y i cos ⁡ y j + sin ⁡ y i sin ⁡ y j ] d_{ij} = 6370 \cdot \arccos\left[ \cos(x_i - x_j)\cos y_i \cos y_j + \sin y_i \sin y_j \right] dij=6370arccos[cos(xixj)cosyicosyj+sinyisinyj]

2.2 关键参数设置

参数说明
种群规模 M M M50影响全局搜索能力与计算效率
最大代数 G G G1000控制算法终止条件
交叉概率 p c p_c pc1确保种群充分混合
变异概率 p m p_m pm0.1平衡探索与开发

三、编码策略与种群初始化

3.1 十进制编码方案

染色体采用随机实数序列表示路径顺序:
ω 1 , ω 2 , … , ω 102 ( ω 1 = 0 , ω 102 = 1 ,   0 < ω i < 1 ) \omega_1, \omega_2, \dots, \omega_{102} \quad (\omega_1=0, \omega_{102}=1, \ 0 < \omega_i < 1) ω1,ω2,,ω102(ω1=0,ω102=1, 0<ωi<1)
解码步骤

  1. 去除固定基因 ω 1 \omega_1 ω1 ω 102 \omega_{102} ω102
  2. 剩余基因升序排序,生成访问顺序

示例
染色体 [ 0 , 0.23 , 0.45 , 0.11 , 0.78 , 1 ] [0, 0.23, 0.45, 0.11, 0.78, 1] [0,0.23,0.45,0.11,0.78,1]解码为路径:
4 → 2 → 3 → 1 → 5 4 \to 2 \to 3 \to 1 \to 5 42315

3.2 改良圈算法生成初始种群

通过局部优化提升初始解质量:

% 生成初始种群
for k = 1:50
    c = randperm(100); % 随机生成初始路径
    c1 = [1, c+1, 102]; % 添加起点和终点
    flag = 1;
    while flag > 0
        flag = 0;
        % 遍历所有可能的路径段交换
        for m = 1:99
            for n = m+2:101
                % 计算路径差
                delta = d(c1(m),c1(n)) + d(c1(m+1),c1(n+1)) - ...
                        d(c1(m),c1(m+1)) - d(c1(n),c1(n+1));
                if delta < 0
                    c1(m+1:n) = c1(n:-1:m+1); % 反转路径段
                    flag = 1;
                end
            end
        end
    end
    J(k, c1) = 1:102; % 存储优化后的路径
end

四、遗传操作核心实现

4.1 单点交叉操作

步骤

  1. 选择两个父代个体 f 1 f_1 f1 f 2 f_2 f2
  2. 随机选择交叉点 t t t(如 t = 33 t=33 t=33
  3. 交换 t t t之后的基因段

数学描述
f 1 = [ ω 1 1 , … , ω t 1 , ω t + 1 1 , … , ω 102 1 ] f 2 = [ ω 1 2 , … , ω t 2 , ω t + 1 2 , … , ω 102 2 ] ↓ ↓ s 1 = [ ω 1 1 , … , ω t 1 , ω t + 1 2 , … , ω 102 2 ] s 2 = [ ω 1 2 , … , ω t 2 , ω t + 1 1 , … , ω 102 1 ] \begin{aligned} f_1 &= [\omega_1^1, \dots, \omega_t^1, \omega_{t+1}^1, \dots, \omega_{102}^1] \\ f_2 &= [\omega_1^2, \dots, \omega_t^2, \omega_{t+1}^2, \dots, \omega_{102}^2] \\ \downarrow \quad & \quad \downarrow \\ s_1 &= [\omega_1^1, \dots, \omega_t^1, \omega_{t+1}^2, \dots, \omega_{102}^2] \\ s_2 &= [\omega_1^2, \dots, \omega_t^2, \omega_{t+1}^1, \dots, \omega_{102}^1] \end{aligned} f1f2s1s2=[ω11,,ωt1,ωt+11,,ω1021]=[ω12,,ωt2,ωt+12,,ω1022]=[ω11,,ωt1,ωt+12,,ω1022]=[ω12,,ωt2,ωt+11,,ω1021]

MATLAB实现

% 交叉操作
for i = 1:2:50
    cross_point = randi([2, 101]); % 随机交叉点
    % 交换基因段
    temp = B(i, cross_point:end);
    B(i, cross_point:end) = B(i+1, cross_point:end);
    B(i+1, cross_point:end) = temp;
end

4.2 多位置变异操作

步骤

  1. 按概率 p m = 0.1 p_m=0.1 pm=0.1选择变异个体
  2. 随机选取三个位置 u , v , w u, v, w u,v,w 1 < u < v < w < 102 1 < u < v < w < 102 1<u<v<w<102
  3. u u u v v v的子路径插入到 w w w之后

路径变化示例
原始路径:
1 → A → B → C ‾ → D → E → F ‾ → 102 1 \to \underline{A \to B \to C} \to D \to \underline{E \to F} \to 102 1ABCDEF102
变异后路径:
1 → D → E → F ‾ → A → B → C ‾ → 102 1 \to D \to \underline{E \to F} \to \underline{A \to B \to C} \to 102 1DEFABC102

MATLAB实现

% 变异操作
mutate_idx = find(rand(1,50) < 0.1); % 选择变异个体
for j = mutate_idx
    pos = sort(randi([2,101], 1, 3)); % 随机三个位置
    % 插入子路径
    A(j,:) = [A(j,1:pos(1)-1), A(j,pos(2)+1:pos(3)), ...
             A(j,pos(1):pos(2)), A(j,pos(3)+1:end)];
end

4.3 确定性选择策略

保留每代适应度最高的50个个体:

% 计算适应度
[~, IX] = sort(J, 2); % 解码路径
fitness = sum(d(sub2ind(size(d), IX(:,1:101), IX(:,2:102))), 2);

% 选择前50个最优个体
[~, idx] = sort(fitness);
J = J(idx(1:50), :);

五、完整MATLAB代码实现

% 数据加载与预处理
clc, clear
load sj.txt % 数据格式:每行8列,依次为经度1、纬度1、经度2、纬度2...
x = sj(:,1:2:8); x = x(:);
y = sj(:,2:2:8); y = y(:);
sj = [x y]; 
d1 = [70, 40];
sj0 = [d1; sj; d1]; % 添加起点和终点
sj = sj0 * pi / 180; % 转为弧度

% 计算距离矩阵
d = zeros(102);
for i = 1:101
    for j = i+1:102
        temp = cos(sj(i,1)-sj(j,1)) * cos(sj(i,2)) * cos(sj(j,2)) + ...
               sin(sj(i,2)) * sin(sj(j,2));
        d(i,j) = 6370 * acos(temp);
    end
end
d = d + d'; % 对称补全

% 改良圈算法生成初始种群
J = zeros(50, 102);
for k = 1:50
    c = randperm(100);
    c1 = [1, c+1, 102];
    flag = 1;
    while flag > 0
        flag = 0;
        for m = 1:100
            for n = m+2:101
                delta = d(c1(m),c1(n)) + d(c1(m+1),c1(n+1)) - ...
                        d(c1(m),c1(m+1)) - d(c1(n),c1(n+1));
                if delta < 0
                    c1(m+1:n) = c1(n:-1:m+1);
                    flag = 1;
                end
            end
        end
    end
    J(k, c1) = 1:102;
end

% 遗传算法主循环
for gen = 1:1000
    % 交叉操作
    B = J(randperm(50), :);
    for i = 1:2:50
        cross_point = randi([2,101]);
        temp = B(i, cross_point:end);
        B(i, cross_point:end) = B(i+1, cross_point:end);
        B(i+1, cross_point:end) = temp;
    end
    
    % 变异操作
    mutate_idx = find(rand(1,50) < 0.1);
    for j = mutate_idx
        pos = sort(randi([2,101], 1, 3));
        J(j,:) = J(j, [1:pos(1)-1, pos(2)+1:pos(3), pos(1):pos(2), pos(3)+1:end]);
    end
    
    % 选择操作
    all_solutions = [J; B];
    [~, IX] = sort(all_solutions, 2);
    fitness = sum(d(sub2ind(size(d), IX(:,1:101), IX(:,2:102))), 2);
    [~, idx] = sort(fitness);
    J = all_solutions(idx(1:50), :);
end

% 输出最优路径
[~, best_idx] = min(fitness);
best_path = IX(best_idx, :);
fprintf('最短巡航距离: %.2f 公里\n', fitness(best_idx));

六、性能对比

算法类型最短距离(公里)收敛代数计算时间(秒)
标准遗传算法41,5728005.9
改进遗传算法39,6486003.0
模拟退火算法44,10020,00018.9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值