在无人机多区域配送问题中,任务点的区域划分与路径规划是关键问题。我们可以通过两种不同的优化模型来解决该问题,这两种模型对应不同的需求场景。
模型1:区域划分待优化
在该模型中,任务点的区域划分作为优化问题的一部分。我们使用差分进化算法(DE)同时优化每个任务点的分配区域以及每个区域内的路径顺序。差分进化算法通过生成初始种群、变异、交叉和选择等步骤不断优化任务点的划分和路径顺序,目标是最小化两个区域的路径总长度。该模型适用于需要灵活确定任务点划分并且希望找到最优分配方案的场景。它的优势在于区域划分是动态调整的,能够适应复杂的任务需求。
模型2:确保两半任务点
在该模型中,任务点的区域划分是固定的,并且我们强制任务点在两个区域内均衡分配,保证每个区域的任务点数量相等或接近相等。优化的重点是最小化每个区域内的路径总长度。此模型仍然采用差分进化算法优化路径规划,但区域划分保持不变。这种模型适用于任务点分配策略已经确定,只需要对路径进行优化的情况,其优点是算法简化,并确保了任务点的平衡分配。
区域划分待优化
问题描述:
在这个版本中,任务点的区域划分是优化的一部分。需要同时优化任务点的分配和每个区域内无人机的路径规划,目标是最小化两个区域的总路径长度。
参数定义:
- n n n:任务点总数
- k = 2 k = 2 k=2:区域数量,划分为两个区域
- T = { t 1 , t 2 , … , t n } T = \{t_1, t_2, \dots, t_n\} T={t1,t2,…,tn}:所有任务点的集合,每个任务点的坐标 t i = ( x i , y i , z i ) t_i = (x_i, y_i, z_i) ti=(xi,yi,zi)
- D ( t i , t j ) D(t_i, t_j) D(ti,tj):任务点 $ t_i $ 和 $ t_j $ 之间的距离函数(欧氏距离)
-
A
∈
{
0
,
1
}
n
×
k
A \in \{0, 1\}^{n \times k}
A∈{0,1}n×k:任务点的区域划分矩阵,表示每个任务点属于哪个区域
- A i j = 1 A_{ij} = 1 Aij=1 表示任务点 t i t_i ti 分配到区域 j j j,其中 j = 1 j =1 j=1 或 j = 2 j = 2 j=2
- A i j = 0 A_{ij} = 0 Aij=0 表示任务点不分配到该区域
- P 1 , P 2 P_1, P_2 P1,P2:分别为区域 1 和区域 2 的路径顺序变量,表示任务点访问顺序
目标函数:
-
路径长度计算:
对于区域1,路径总长度为:
L 1 = ∑ i = 1 m 1 − 1 D ( t P 1 ( i ) , t P 1 ( i + 1 ) ) + D ( t P 1 ( m 1 ) , t P 1 ( 1 ) ) L_1 = \sum_{i=1}^{m_1-1} D(t_{P_1(i)}, t_{P_1(i+1)}) + D(t_{P_1(m_1)}, t_{P_1(1)}) L1=i=1∑m1−1D(tP1(i),tP1(i+1))+D(tP1(m1),tP1(1))
其中, m 1 m_1 m1 是分配到区域1的任务点数量。对于区域2的路径总长度为:
L 2 = ∑ i = 1 m 2 − 1 D ( t P 2 ( i ) , t P 2 ( i + 1 ) ) + D ( t P 2 ( m 2 ) , t P 2 ( 1 ) ) L_2 = \sum_{i=1}^{m_2-1} D(t_{P_2(i)}, t_{P_2(i+1)}) + D(t_{P_2(m_2)}, t_{P_2(1)}) L2=i=1∑m2−1D(tP2(i),tP2(i+1))+D(tP2(m2),tP2(1))
其中, m 2 m_2 m2 是分配到区域2的任务点数量。 -
总目标函数:
Fitness ( P 1 , P 2 , A ) = L 1 + L 2 \text{Fitness}(P_1, P_2, A) = L_1 + L_2 Fitness(P1,P2,A)=L1+L2
该目标函数同时优化任务点的区域划分和路径顺序,以最小化总路径长度。
约束条件:
这个模型中没有强制任务点数量均衡的约束,两个区域任务点数量可以不相等。所有任务点必须分配到一个区域:
∑
j
=
1
k
A
i
j
=
1
,
∀
i
=
1
,
2
,
…
,
n
\sum_{j=1}^{k} A_{ij} = 1, \forall i = 1, 2, \dots, n
j=1∑kAij=1,∀i=1,2,…,n
优化算法:
- 差分进化算法(DE):
- 初始化:生成随机的区域划分矩阵 $ A $ 和路径顺序 P 1 , P 2 P_1, P_2 P1,P2。
- 变异:选择种群中的三个不同个体,生成新的变异解:
v = A 1 + F × ( A 2 − A 3 ) v = A_1 + F \times (A_2 - A_3) v=A1+F×(A2−A3)
其中 A 1 , A 2 , A 3 A_1, A_2, A_3 A1,A2,A3 是三个随机选择的区域划分解,$ F $ 是缩放因子。 - 交叉:将变异解
v
v
v 和当前解
A
i
A_i
Ai 进行交叉,生成新的候选解
u
u
u:
u i j = { v i j if rand ( ) < C r A i j otherwise u_{ij} = \begin{cases} v_{ij} & \text{if } \text{rand}() < Cr \\ A_{ij} & \text{otherwise} \end{cases} uij={vijAijif rand()<Crotherwise
其中 C r Cr Cr 是交叉概率。 - 选择:根据目标函数值选择是否替换当前解,保存适应度更优的解。
- 迭代:重复执行上述步骤直到达到最大迭代次数或适应度收敛。
问题描述:
在这个版本中,任务点的区域划分是固定的,保证两个区域的任务点数量相等或接近相等。优化的目标是仅最小化每个区域内的路径长度。
2参数定义:
- n n n:任务点总数
- k = 2 k = 2 k=2:区域数量
- T = { t 1 , t 2 , … , t n } T = \{t_1, t_2, \dots, t_n\} T={t1,t2,…,tn}:所有任务点的集合,每个任务点的坐标 t i = ( x i , y i , z i ) t_i = (x_i, y_i, z_i) ti=(xi,yi,zi)
- D ( t i , t j ) D(t_i, t_j) D(ti,tj):任务点 t i t_i ti 和 t j t_j tj 之间的距离函数(欧氏距离)
- 固定划分矩阵
A
A
A:区域划分固定,强制任务点在两个区域内均衡分配:
- A i j = 1 A_{ij} = 1 Aij=1 表示任务点 t i t_i ti 分配到区域 j j j,其中 j = 1 j = 1 j=1 或 $j =2 $
- m 1 = m 2 m_1 = m_2 m1=m2 表示两个区域的任务点数量相等或接近相等。
- P 1 , P 2 P_1, P_2 P1,P2:分别为区域 1 和区域 2 的路径顺序变量
目标函数:
-
路径长度计算:
对于区域1的路径,路径总长度为:
L 1 = ∑ i = 1 m 1 − 1 D ( t P 1 ( i ) , t P 1 ( i + 1 ) ) + D ( t P 1 ( m 1 ) , t P 1 ( 1 ) ) L_1 = \sum_{i=1}^{m_1-1} D(t_{P_1(i)}, t_{P_1(i+1)}) + D(t_{P_1(m_1)}, t_{P_1(1)}) L1=i=1∑m1−1D(tP1(i),tP1(i+1))+D(tP1(m1),tP1(1))
对于区域2的路径总长度为:
L 2 = ∑ i = 1 m 2 − 1 D ( t P 2 ( i ) , t P 2 ( i + 1 ) ) + D ( t P 2 ( m 2 ) , t P 2 ( 1 ) ) L_2 = \sum_{i=1}^{m_2-1} D(t_{P_2(i)}, t_{P_2(i+1)}) + D(t_{P_2(m_2)}, t_{P_2(1)}) L2=i=1∑m2−1D(tP2(i),tP2(i+1))+D(tP2(m2),tP2(1)) -
总目标函数:
Fitness ( P 1 , P 2 ) = L 1 + L 2 \text{Fitness}(P_1, P_2) = L_1 + L_2 Fitness(P1,P2)=L1+L2
该目标函数只优化路径顺序 P 1 P_1 P1 和 P 2 P_2 P2,寻找最优路径顺序以最小化总路径长度。
约束条件:
-
均衡划分约束:任务点数量均衡分配,即:
∣ m 1 − m 2 ∣ ≤ 1 |m_1 - m_2| \leq 1 ∣m1−m2∣≤1
强制两个区域任务点数量相等或接近相等。 -
所有任务点必须被分配:
∑ j = 1 k A i j = 1 , ∀ i = 1 , 2 , … , n \sum_{j=1}^{k} A_{ij} = 1, \forall i = 1, 2, \dots, n j=1∑kAij=1,∀i=1,2,…,n
优化算法:
- 差分进化算法(DE):
- 初始化:根据均衡条件随机生成区域划分矩阵 A A A,并随机生成初始路径顺序 P 1 P_1 P1 和 P 2 P_2 P2。
- 变异:生成新的路径顺序,选择三个不同路径序列,产生新的候选路径。
- 交叉:在父代与变异路径序列之间进行交叉,生成新的候选路径。
- 选择:保留适应度更优的路径,替换原解。
- 迭代:重复执行上述步骤,直到最大迭代次数或适应度收敛。
确保两半任务点模型
问题描述:
在这个版本中,任务点的区域划分是固定的,保证两个区域的任务点数量相等或接近相等。优化的目标是仅最小化每个区域内的路径长度。
参数定义:
- n n n:任务点总数
- k = 2 k = 2 k=2:区域数量
- T = { t 1 , t 2 , … , t n } T = \{t_1, t_2, \dots, t_n\} T={t1,t2,…,tn}:所有任务点的集合,每个任务点的坐标 t i = ( x i , y i , z i ) t_i = (x_i, y_i, z_i) ti=(xi,yi,zi)
- D ( t i , t j ) D(t_i, t_j) D(ti,tj):任务点 t i t_i ti 和 t j t_j tj 之间的距离函数(欧氏距离)
- 固定划分矩阵
A
A
A:区域划分固定,强制任务点在两个区域内均衡分配:
- A i j = 1 A_{ij} = 1 Aij=1 表示任务点 t i t_i ti 分配到区域 j j j,其中 j = 1 j = 1 j=1 或 j = 2 j = 2 j=2
- m 1 = m 2 m_1 = m_2 m1=m2 表示两个区域的任务点数量相等或接近相等。
- P 1 , P 2 P_1, P_2 P1,P2:分别为区域 1 和区域 2 的路径顺序变量
目标函数:
-
路径长度计算:
对于区域1的路径,路径总长度为:
L 1 = ∑ i = 1 m 1 − 1 D ( t P 1 ( i ) , t P 1 ( i + 1 ) ) + D ( t P 1 ( m 1 ) , t P 1 ( 1 ) ) L_1 = \sum_{i=1}^{m_1-1} D(t_{P_1(i)}, t_{P_1(i+1)}) + D(t_{P_1(m_1)}, t_{P_1(1)}) L1=i=1∑m1−1D(tP1(i),tP1(i+1))+D(tP1(m1),tP1(1))
对于区域2的路径总长度为:
L 2 = ∑ i = 1 m 2 − 1 D ( t P 2 ( i ) , t P 2 ( i + 1 ) ) + D ( t P 2 ( m 2 ) , t P 2 ( 1 ) ) L_2 = \sum_{i=1}^{m_2-1} D(t_{P_2(i)}, t_{P_2(i+1)}) + D(t_{P_2(m_2)}, t_{P_2(1)}) L2=i=1∑m2−1D(tP2(i),tP2(i+1))+D(tP2(m2),tP2(1)) -
总目标函数:
Fitness ( P 1 , P 2 ) = L 1 + L 2 \text{Fitness}(P_1, P_2) = L_1 + L_2 Fitness(P1,P2)=L1+L2
该目标函数只优化路径顺序 P 1 P_1 P1 和 P 2 P_2 P2,寻找最优路径顺序以最小化总路径长度。
约束条件:
-
均衡划分约束:任务点数量均衡分配,即:
∣ m 1 − m 2 ∣ ≤ 1 |m_1 - m_2| \leq 1 ∣m1−m2∣≤1
强制两个区域任务点数量相等或接近相等。 -
所有任务点必须被分配:
∑ j = 1 k A i j = 1 , ∀ i = 1 , 2 , … , n \sum_{j=1}^{k} A_{ij} = 1, \forall i = 1, 2, \dots, n j=1∑kAij=1,∀i=1,2,…,n
优化算法:
- 差分进化算法(DE):
- 初始化:根据均衡条件随机生成区域划分矩阵 A A A,并随机生成初始路径顺序 P 1 P_1 P1 和 P 2 P_2 P2。
- 变异:生成新的路径顺序,选择三个不同路径序列,产生新的候选路径。
- 交叉:在父代与变异路径序列之间进行交叉,生成新的候选路径。
- 选择:保留适应度更优的路径,替换原解。
- 迭代:重复执行上述步骤,直到最大迭代次数或适应度收敛。
区域优化
% 版本1:区域划分待优化
clc; clear; close all;
% 参数设置
popSize = 30; % 种群大小
dim = 100; % 使用100个任务点(包括起点和终点)
maxGen = 100; % 最大迭代次数
F_min = 0.4; % 缩放因子的最小值
F_max = 0.9; % 缩放因子的最大值
Cr_min = 0.1; % 交叉概率的最小值
Cr_max = 0.9; % 交叉概率的最大值
numRegions = 2; % 区域数量,设为2
% 生成100个随机三维任务点
numPoints = 100; % 任务点数量
xRange = [0, 100]; % X坐标范围
yRange = [0, 100]; % Y坐标范围
zRange = [0, 50]; % Z坐标范围
% 随机生成任务点
taskPoints = [rand(numPoints, 1) * (xRange(2) - xRange(1)) + xRange(1), ...
rand(numPoints, 1) * (yRange(2) - yRange(1)) + yRange(1), ...
rand(numPoints, 1) * (zRange(2) - zRange(1)) + zRange(1)];
% 初始化种群,每个个体表示一个任务点的区域分配(0 或 1)
pop = randi([0, 1], popSize, dim); % 初始化种群
% 目标函数:每个区域的路径长度之和
objective = @(x) regionPathLength(taskPoints, x, numRegions);
% 计算适应度
fitness = arrayfun(@(i) objective(pop(i, :)), 1:popSize);
% 用于保存每一代的最优适应度
bestFitnessHistory = zeros(1, maxGen);
% 主循环
for gen = 1:maxGen
% 自适应调整缩放因子 F 和交叉概率 Cr
F = F_min + rand() * (F_max - F_min); % 动态调整F
Cr = Cr_min + rand() * (Cr_max - Cr_min); % 动态调整Cr
newPop = pop; % 新种群
for i = 1:popSize
% 差分进化操作
% 选择三个不同的个体
r1 = randi([1, popSize]);
r2 = randi([1, popSize]);
r3 = randi([1, popSize]);
% 确保 r1, r2, r3 不等于 i
while r1 == i
r1 = randi([1, popSize]);
end
while r2 == i || r2 == r1
r2 = randi([1, popSize]);
end
while r3 == i || r3 == r1 || r3 == r2
r3 = randi([1, popSize]);
end
% 变异操作:对区域划分进行变异
v = mutate(pop(r1, :), pop(r2, :), pop(r3, :), F, dim);
% 交叉操作
u = crossover(pop(i, :), v, Cr);
% 选择操作
newFitness = objective(u);
if newFitness < fitness(i)
newPop(i, :) = u;
fitness(i) = newFitness;
end
end
% 更新种群
pop = newPop;
% 记录当前代的最优适应度
[bestFitness, bestIndex] = min(fitness);
bestFitnessHistory(gen) = bestFitness;
disp(['Generation ', num2str(gen), ': Best Fitness = ', num2str(bestFitness)]);
end
% 最优解显示
bestSolution = pop(bestIndex, :);
disp('Best Region Assignment:');
disp(bestSolution);
% 绘制适应度迭代图
figure;
plot(1:maxGen, bestFitnessHistory, 'LineWidth', 2);
title('适应度迭代图 - 区域划分待优化');
xlabel('代数');
ylabel('最优适应度');
grid on;
% 版本1:区域划分待优化 - 绘制路径的3D图
% 绘制两个区域的任务点分布,并绘制每个区域的三维路径
figure;
hold on;
% 绘制区域1的任务点
scatter3(taskPoints(bestSolution == 0, 1), taskPoints(bestSolution == 0, 2), taskPoints(bestSolution == 0, 3), 'bo');
% 绘制区域1的路径
region1Points = taskPoints(bestSolution == 0, :);
if size(region1Points, 1) > 1
order1 = randperm(size(region1Points, 1)); % 使用随机路径(你可以改为优化路径)
for i = 1:length(order1)-1
plot3([region1Points(order1(i), 1), region1Points(order1(i+1), 1)], ...
[region1Points(order1(i), 2), region1Points(order1(i+1), 2)], ...
[region1Points(order1(i), 3), region1Points(order1(i+1), 3)], 'b-');
end
% 返回到起点
plot3([region1Points(order1(end), 1), region1Points(order1(1), 1)], ...
[region1Points(order1(end), 2), region1Points(order1(1), 2)], ...
[region1Points(order1(end), 3), region1Points(order1(1), 3)], 'b-');
end
% 绘制区域2的任务点
scatter3(taskPoints(bestSolution == 1, 1), taskPoints(bestSolution == 1, 2), taskPoints(bestSolution == 1, 3), 'ro');
% 绘制区域2的路径
region2Points = taskPoints(bestSolution == 1, :);
if size(region2Points, 1) > 1
order2 = randperm(size(region2Points, 1)); % 使用随机路径(你可以改为优化路径)
for i = 1:length(order2)-1
plot3([region2Points(order2(i), 1), region2Points(order2(i+1), 1)], ...
[region2Points(order2(i), 2), region2Points(order2(i+1), 2)], ...
[region2Points(order2(i), 3), region2Points(order2(i+1), 3)], 'r-');
end
% 返回到起点
plot3([region2Points(order2(end), 1), region2Points(order2(1), 1)], ...
[region2Points(order2(end), 2), region2Points(order2(1), 2)], ...
[region2Points(order2(end), 3), region2Points(order2(1), 3)], 'r-');
end
% 设置三维视角
view(3); % MATLAB 的默认 3D 视角
axis vis3d; % 保证坐标轴按比例显示
title('多区域任务点划分与路径规划 (3D)');
xlabel('X坐标');
ylabel('Y坐标');
zlabel('Z坐标');
legend('区域1任务点', '区域1路径', '区域2任务点', '区域2路径');
grid on;
hold off;
%% 变异函数
function mutant = mutate(p1, p2, p3, F, dim)
mutant = p1; % 初始化变异个体
idx = randperm(dim, 2); % 随机选取两点进行变异
mutant(idx(1):idx(2)) = fix(p2(idx(1):idx(2)) + F * (p2(idx(1):idx(2)) - p3(idx(1):idx(2))));
mutant = max(min(mutant, 1), 0); % 保证区域划分在 0 和 1 之间
end
%% 交叉函数
function child = crossover(parent, mutant, Cr)
child = parent;
for i = 1:length(parent)
if rand() < Cr
child(i) = mutant(i);
end
end
end
%% 计算区域内的路径长度函数
function totalLength = regionPathLength(points, regionAssignment, numRegions)
totalLength = 0;
for r = 0:numRegions-1
regionPoints = points(regionAssignment == r, :); % 获取分配到区域 r 的点
if size(regionPoints, 1) > 1
order = randperm(size(regionPoints, 1)); % 随机生成访问顺序
totalLength = totalLength + pathLength3D(regionPoints, order); % 计算路径长度
end
end
end
%% 计算路径长度函数(3D)
function totalLength = pathLength3D(points, order)
totalLength = 0;
for i = 1:length(order)-1
totalLength = totalLength + norm(points(order(i), :) - points(order(i+1), :));
end
% 返回到起点
totalLength = totalLength + norm(points(order(end), :) - points(order(1), :));
end
第二种情况
区域对半
% 多区域配送问题的优化
clc; clear; close all;
% 参数设置
popSize = 30; % 种群大小
dim = 100; % 使用100个任务点(包括起点和终点)
maxGen = 100; % 最大迭代次数
F_min = 0.4; % 缩放因子的最小值
F_max = 0.9; % 缩放因子的最大值
Cr_min = 0.1; % 交叉概率的最小值
Cr_max = 0.9; % 交叉概率的最大值
numRegions = 2; % 区域数量,设为2
% 生成100个随机三维任务点
numPoints = 100; % 任务点数量
xRange = [0, 100]; % X坐标范围
yRange = [0, 100]; % Y坐标范围
zRange = [0, 50]; % Z坐标范围
% 随机生成任务点
taskPoints = [rand(numPoints, 1) * (xRange(2) - xRange(1)) + xRange(1), ...
rand(numPoints, 1) * (yRange(2) - yRange(1)) + yRange(1), ...
rand(numPoints, 1) * (zRange(2) - zRange(1)) + zRange(1)];
% 初始化种群(确保每个区域任务点数量接近一半一半)
pop = zeros(popSize, dim); % 初始化种群
for i = 1:popSize
% 确保一半的任务点分配到区域1,另一半分配到区域2
half = randperm(dim); % 打乱任务点
pop(i, half(1:round(dim/2))) = 1; % 将一半任务点分配到区域2
pop(i, half(round(dim/2)+1:end)) = 0; % 将另一半任务点分配到区域1
end
% 目标函数:每个区域的路径长度之和
objective = @(x) regionPathLength(taskPoints, x, numRegions);
% 计算适应度
fitness = arrayfun(@(i) objective(pop(i, :)), 1:popSize);
% 用于保存每一代的最优适应度
bestFitnessHistory = zeros(1, maxGen);
% 主循环
for gen = 1:maxGen
% 自适应调整缩放因子 F 和交叉概率 Cr
F = F_min + rand() * (F_max - F_min); % 动态调整F
Cr = Cr_min + rand() * (Cr_max - Cr_min); % 动态调整Cr
newPop = pop; % 新种群
for i = 1:popSize
% 差分进化操作
% 选择三个不同的个体
r1 = randi([1, popSize]);
r2 = randi([1, popSize]);
r3 = randi([1, popSize]);
% 确保 r1, r2, r3 不等于 i
while r1 == i
r1 = randi([1, popSize]);
end
while r2 == i || r2 == r1
r2 = randi([1, popSize]);
end
while r3 == i || r3 == r1 || r3 == r2
r3 = randi([1, popSize]);
end
% 变异操作:对区域划分进行变异
v = mutate(pop(r1, :), pop(r2, :), pop(r3, :), F, dim);
% 确保新个体依然是一半任务点分配到每个区域
u = fixHalfHalf(v, dim); % 调整后的变异操作,保持任务点分配平衡
% 交叉操作
u = crossover(pop(i, :), u, Cr);
% 选择操作
newFitness = objective(u);
if newFitness < fitness(i)
newPop(i, :) = u;
fitness(i) = newFitness;
end
end
% 更新种群
pop = newPop;
% 记录当前代的最优适应度
[bestFitness, bestIndex] = min(fitness);
bestFitnessHistory(gen) = bestFitness;
disp(['Generation ', num2str(gen), ': Best Fitness = ', num2str(bestFitness)]);
end
% 最优解显示
bestSolution = pop(bestIndex, :);
disp('Best Region Assignment:');
disp(bestSolution);
% 绘制两个区域的任务点分布,并绘制每个区域的三维路径
figure;
hold on;
% 绘制区域1的任务点
scatter3(taskPoints(bestSolution == 0, 1), taskPoints(bestSolution == 0, 2), taskPoints(bestSolution == 0, 3), 'bo');
% 绘制区域1的路径
region1Points = taskPoints(bestSolution == 0, :);
if size(region1Points, 1) > 1
order1 = randperm(size(region1Points, 1)); % 使用随机路径(可以改为优化路径)
for i = 1:length(order1)-1
plot3([region1Points(order1(i), 1), region1Points(order1(i+1), 1)], ...
[region1Points(order1(i), 2), region1Points(order1(i+1), 2)], ...
[region1Points(order1(i), 3), region1Points(order1(i+1), 3)], 'b-');
end
% 返回到起点
plot3([region1Points(order1(end), 1), region1Points(order1(1), 1)], ...
[region1Points(order1(end), 2), region1Points(order1(1), 2)], ...
[region1Points(order1(end), 3), region1Points(order1(1), 3)], 'b-');
end
% 绘制区域2的任务点
scatter3(taskPoints(bestSolution == 1, 1), taskPoints(bestSolution == 1, 2), taskPoints(bestSolution == 1, 3), 'ro');
% 绘制区域2的路径
region2Points = taskPoints(bestSolution == 1, :);
if size(region2Points, 1) > 1
order2 = randperm(size(region2Points, 1)); % 使用随机路径(可以改为优化路径)
for i = 1:length(order2)-1
plot3([region2Points(order2(i), 1), region2Points(order2(i+1), 1)], ...
[region2Points(order2(i), 2), region2Points(order2(i+1), 2)], ...
[region2Points(order2(i), 3), region2Points(order2(i+1), 3)], 'r-');
end
% 返回到起点
plot3([region2Points(order2(end), 1), region2Points(order2(1), 1)], ...
[region2Points(order2(end), 2), region2Points(order2(1), 2)], ...
[region2Points(order2(end), 3), region2Points(order2(1), 3)], 'r-');
end
% 设置三维视角
view(3); % MATLAB 的默认 3D 视角
axis vis3d; % 保证坐标轴按比例显示
title('多区域任务点划分与路径规划 (3D)');
xlabel('X坐标');
ylabel('Y坐标');
zlabel('Z坐标');
legend('区域1任务点', '区域1路径', '区域2任务点', '区域2路径');
grid on;
hold off;
% 绘制适应度迭代图
figure;
plot(1:maxGen, bestFitnessHistory, 'LineWidth', 2);
title('适应度迭代图');
xlabel('代数');
ylabel('最优适应度');
grid on;
%% 修复变异后的区域分配,确保两半任务点
function fixed = fixHalfHalf(mutant, dim)
half = randperm(dim); % 打乱任务点
fixed = mutant;
fixed(half(1:round(dim/2))) = 1; % 将一半任务点分配到区域2
fixed(half(round(dim/2)+1:end)) = 0; % 将另一半任务点分配到区域1
end
%% 计算区域内的路径长度函数
function totalLength = regionPathLength(points, regionAssignment, numRegions)
totalLength = 0;
for r = 0:numRegions-1
regionPoints = points(regionAssignment == r, :); % 获取分配到区域 r 的点
if size(regionPoints, 1) > 1
order = randperm(size(regionPoints, 1)); % 随机生成访问顺序(你可以改为优化路径)
totalLength = totalLength + pathLength3D(regionPoints, order); % 计算路径长度
end
end
end
%% 计算路径长度函数(3D)
function totalLength = pathLength3D(points, order)
totalLength = 0;
for i = 1:length(order)-1
totalLength = totalLength + norm(points(order(i), :) - points(order(i+1), :));
end
% 返回到起点
totalLength = totalLength + norm(points(order(end), :) - points(order(1), :));
end
%% 变异函数:基于差分进化的路径变异
function mutant = mutate(p1, p2, p3, F, dim)
mutant = p1; % 初始化变异个体
idx = randperm(dim, 2); % 随机选取两点进行变异
% 进行变异操作:p1 + F * (p2 - p3)
mutant(idx(1):idx(2)) = fix(p2(idx(1):idx(2)) + F * (p2(idx(1):idx(2)) - p3(idx(1):idx(2))));
% 确保变异后索引在有效范围内(1 或 0)
mutant = max(min(mutant, 1), 0); % 保证区域划分在 0 和 1 之间
end
%% 交叉函数:部分交叉操作
function child = crossover(parent, mutant, Cr)
child = parent; % 初始化为父代
for i = 1:length(parent)
if rand() < Cr
child(i) = mutant(i); % 随机选择变异后的基因
end
end
end