tic;
clc;
clear;
% 读取 Excel 文件数据
data = xlsread('C:\Users\86198\Desktop\weizhi.xlsx');
% 检查数据是否有效
if isempty(data) || mod(size(data, 2), 2) ~= 0
error('Excel 数据为空或格式不正确,每一行应包含 (x, y) 坐标');
end
% 提取 x, y 坐标
x = data(:, 1:2:end); % x 坐标(每行第 1,3,5,... 列)
y = data(:, 2:2:end); % y 坐标(每行第 2,4,6,... 列)
% 将数据展平成一列
x = x(:);
y = y(:);
% 组合坐标数据
sj = [x y];
num_points = size(sj, 1); % 获取点的数量
% 设定起点
d1 = [70, 40];
% 在数据起点和终点添加 d1
sj0 = [d1; sj; d1];
% 坐标转换为弧度
sj = sj0 * pi / 180;
% 初始化距离矩阵
L = num_points + 2; % 总共 100 + 2 个点(包含起点和终点)
d = zeros(L);
% 计算球面距离矩阵
for i = 1:L-1
for j = i+1:L
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); % 地球半径 6370 km
end
end
d = d + d'; % 使矩阵对称
% 遗传算法参数
w = 50; % 种群规模
dai = 100; % 进化代数
% 生成初始种群 J
J = zeros(w, L);
for k = 1:w
c = randperm(num_points); % 随机排列 100 个点
c1 = [1, c + 1, L]; % 加入起点和终点
flag = 1;
% 2-opt 局部优化
while flag > 0
flag = 0;
for m = 1:L-3
for n = m+2:L-1
if d(c1(m), c1(n)) + d(c1(m+1), c1(n+1)) < d(c1(m), c1(m+1)) + d(c1(n), c1(n+1))
flag = 1;
c1(m+1:n) = c1(n:-1:m+1);
end
end
end
end
J(k, :) = c1;
end
% 确保 J 只包含 1 到 L 之间的整数
J = round(J);
% 设定起点和终点
J(:, 1) = 1;
J(:, L) = L;
% 初始化随机种子
rand('state', sum(clock));
% 遗传算法进化
A = J;
for k = 1:dai
% 交叉操作
B = A;
c = randperm(w); % 随机选择个体
for i = 1:2:w
F = 2 + floor(num_points * rand(1));
temp = B(c(i), F:L);
B(c(i), F:L) = B(c(i + 1), F:L);
B(c(i + 1), F:L) = temp;
end
% 变异操作
C = A;
by = find(rand(1, w) < 0.1); % 10% 概率发生变异
if isempty(by)
by = floor(w * rand(1)) + 1;
end
C = A(by, :);
L3 = length(by);
for j = 1:L3
bw = 2 + floor(num_points * rand(1,3)); bw = sort(bw);
C(j, :) = C(j, [1:bw(1)-1, bw(2)+1:bw(3), bw(1):bw(2), bw(3)+1:L]);
end
% 合并父代与子代
G = [A; B; C];
TL = size(G, 1);
% 确保 G 只包含 1 到 L 之间的整数
G = round(G);
if any(G(:) < 1) || any(G(:) > L) || any(mod(G(:), 1) ~= 0)
error('G 中包含无效索引,请检查遗传算法路径');
end
% 计算路径长度
temp = zeros(TL, 1);
for j = 1:TL
for i = 1:L-1
temp(j) = temp(j) + d(G(j, i), G(j, i + 1));
end
end
% 选择最优个体
[DZ, IZ] = sort(temp);
A = G(IZ(1:w), :);
end
% 最优路径及其长度
path = A(1, :);
long = DZ(1);
% 可视化路径
xx = sj0(path, 1);
yy = sj0(path, 2);
plot(xx, yy, '-o');
xlabel('经度');
ylabel('纬度');
title('最优路径');
grid on;
% 显示最优路径长度
disp(['最短路径长度: ', num2str(long)]);
toc;将以上Matlab代码改为python中运行
最新发布