MATLAB-贪婪算法解决旅行商问题(TSP)

这段代码是一个使用贪婪算法解决旅行商问题(TSP)的示例。它随机生成了一些城市的位置,然后使用贪婪算法找到这些城市的最短路径,使得旅行商经过每个城市一次后返回起点城市。代码的主要步骤包括:

  1. 随机生成城市位置。
  2. 从第一个城市开始,依次选择距离最近的未访问城市作为下一个访问城市,直到所有城市都被访问过。
  3. 计算并记录路径的总距离。
  4. 绘制城市和路径图。

你可以运行这段代码,查看生成的城市和路径图,以及路径的总距离。

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');

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贪婪算法解决 TSP 问题的一种简单有效的方法。它的基本思想是从一个起点开始,每次选择距离该点最近的未访问过的点,并将其加入路径中,直到所有的点都被访问过为止。 具体实现步骤如下: 1. 随机选择一个起点,并将其标记为已访问。 2. 在未访问的点中,选择距离当前点最近的点,并将其加入路径中,标记为已访问。 3. 重复步骤 2,直到所有的点都被访问过为止。 4. 将最后一个点和起点相连,形成完整的路径。 贪婪算法的时间复杂度为 O(n^2),其中 n 是城市的数量。尽管贪婪算法不能保证找到全局最优解,但是它的运行速度非常快,通常可以在很短的时间内找到较优的解。 以下是使用 MATLAB 实现贪婪算法解决 TSP 问题的示例代码: ```matlab n = 10; % 城市数量 xy = 10*rand(n,2); % 城市坐标 d = zeros(n,n); % 距离矩阵 for i = 1:n for j = 1:n d(i,j) = norm(xy(i,:)-xy(j,:)); % 计算欧几里得距离 end end % 贪婪算法求解 TSP 问题 visited = zeros(n,1); % 标记城市是否已访问 path = zeros(n+1,1); % 记录路径 path(1) = 1; % 起点为第一个城市 visited(1) = 1; for i = 2:n [~,j] = min(d(path(i-1),:).*~visited'); % 选择距离上一个城市最近的未访问城市 path(i) = j; % 将该城市加入路径中 visited(j) = 1; end path(n+1) = 1; % 最后一个城市与起点相连 % 绘制路径图 plot(xy(:,1),xy(:,2),'ko','MarkerSize',10,'LineWidth',2); hold on; plot(xy(path,1),xy(path,2),'r.-','MarkerSize',20,'LineWidth',2); hold off; ``` 运行以上代码,将生成一个随机的 10 个城市的 TSP 问题,并使用贪婪算法求解最优路径。最后将绘制路径图,红色点线表示最优路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值