一、遗传算法核心原理
1.1 生物进化与算法映射
遗传算法(Genetic Algorithm, GA)通过模拟生物进化机制,解决复杂优化问题。其核心思想是通过选择、交叉、变异操作,在解空间中搜索全局最优解。下表展示了生物概念与算法组件的对应关系:遗传算法(Genetic Algorithm, GA)通过模拟生物进化机制,解决复杂优化问题。其核心思想是通过选择、交叉、变异操作,在解空间中搜索全局最优解。下表展示了生物概念与算法组件的对应关系:
生物学术语 | 遗传算法组件 | 作用描述 |
---|---|---|
染色体(Chromosome) | 解的编码(如实数序列) | 存储解的表示形式 |
基因(Gene) | 编码中的单个元素 | 构成解的基本单元 |
种群(Population) | 候选解集合 | 算法迭代进化的基础 |
适应度(Fitness) | 目标函数值 | 评估解质量的量化指标 |
自然选择(Selection) | 选择操作 | 保留优质解,淘汰劣质解 |
交叉(Crossover) | 基因重组操作 | 生成新解以探索解空间 |
变异(Mutation) | 随机扰动操作 | 避免早熟收敛,增强多样性 |
1.2 算法流程框架
- 初始化种群:生成初始候选解集合
- 适应度评估:计算每个解的路径总长度
- 选择操作:筛选优质个体进入下一代
- 交叉操作:重组父代基因生成子代
- 变异操作:对子代进行随机扰动
- 迭代进化:重复步骤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=1∑101dπ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=6370⋅arccos[cos(xi−xj)cosyicosyj+sinyisinyj]
2.2 关键参数设置
参数 | 值 | 说明 |
---|---|---|
种群规模 M M M | 50 | 影响全局搜索能力与计算效率 |
最大代数 G G G | 1000 | 控制算法终止条件 |
交叉概率 p c p_c pc | 1 | 确保种群充分混合 |
变异概率 p m p_m pm | 0.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 \omega_1 ω1和 ω 102 \omega_{102} ω102
- 剩余基因升序排序,生成访问顺序
示例:
染色体
[
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
4→2→3→1→5
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 单点交叉操作
步骤:
- 选择两个父代个体 f 1 f_1 f1和 f 2 f_2 f2
- 随机选择交叉点 t t t(如 t = 33 t=33 t=33)
- 交换 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}
f1f2↓s1s2=[ω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 多位置变异操作
步骤:
- 按概率 p m = 0.1 p_m=0.1 pm=0.1选择变异个体
- 随机选取三个位置 u , v , w u, v, w u,v,w( 1 < u < v < w < 102 1 < u < v < w < 102 1<u<v<w<102)
- 将 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
1→A→B→C→D→E→F→102
变异后路径:
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
1→D→E→F→A→B→C→102
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,572 | 800 | 5.9 |
改进遗传算法 | 39,648 | 600 | 3.0 |
模拟退火算法 | 44,100 | 20,000 | 18.9 |