这段代码是一个使用贪婪算法解决旅行商问题(TSP)的示例。它随机生成了一些城市的位置,然后使用贪婪算法找到这些城市的最短路径,使得旅行商经过每个城市一次后返回起点城市。代码的主要步骤包括:
- 随机生成城市位置。
- 从第一个城市开始,依次选择距离最近的未访问城市作为下一个访问城市,直到所有城市都被访问过。
- 计算并记录路径的总距离。
- 绘制城市和路径图。
你可以运行这段代码,查看生成的城市和路径图,以及路径的总距离。
clc;close all;clear all;warning off;%清除变量
% 参数设置
numCities = 10; % 城市数量
maxIter = numCities - 1; % 最大迭代次数(因为需要访问所有城市并返回原点)
% 随机生成城市位置
cities = 100*rand(numCities, 2);
for i = 1:numCities
plot(cities(i,1), cities(i,2), 'ro', 'MarkerSize', 20, 'MarkerFaceColor', "r");
text(cities(i,1), cities(i,2), num2str(i), 'FontSize', 10)
hold on
end
% 贪婪算法实现
currentCity = cities(1, :); % 从第一个城市开始
path = currentCity; % 初始化路径
totalDistance = 0; % 初始化总距离
distances = zeros(1, maxIter); % 存储每次迭代的距离
for i = 1:maxIter %迭代次数
% 计算当前城市到所有未访问城市的距离
unvisitedCities = cities;
unvisitedCities(ismember(cities, path, 'rows'), :) = []; % L= ismember(A,B,'rows') 当A中的行也存在于B中时,将返回包含逻辑值1,否则0。
distancesToUnvisited = sqrt(sum((bsxfun(@minus, unvisitedCities, currentCity)).^2, 2));
% 选择最近的未访问城市作为下一个城市
[~, nextCityIdx] = min(distancesToUnvisited);
nextCity = unvisitedCities(nextCityIdx, :);
% 更新路径和总距离
path = [path; nextCity];
currentCity = nextCity;
totalDistance = totalDistance + distancesToUnvisited(nextCityIdx);
distances(i) = distancesToUnvisited(nextCityIdx);
end
% 返回原点
path = [path; cities(1, :)];
totalDistance = totalDistance + sqrt(sum((cities(1, :) - currentCity).^2));
% 绘制路径图
figure;
plot(cities(:,1), cities(:,2), 'ro', 'MarkerSize', 20, 'MarkerFaceColor', 'r');
hold on;
for i = 1:size(path, 1) - 1
plot([path(i,1), path(i+1,1)], [path(i,2), path(i+1,2)], '-b', 'LineWidth', 4);
text(path(i,1), path(i,2), num2str(i), 'FontSize', 10)
end
plot([path(end,1), path(1,1)], [path(end,2), path(1,2)], '-b', 'LineWidth', 2); % 连接最后一个城市和第一个城市
hold off;
xlabel('X');
ylabel('Y');
title('Greedy TSP Algorithm Path');