- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经实现了 Clarke-Wright 启发法来解决 TSP(基于伪代码 here )。我已附上我在 Matlab 中的实现。然而,它对我来说不够快,并且需要 O(n2) 空间(因为成对距离)。我想知道是否可以应用任何理论或实践优化来降低复杂性(特别是空间复杂性)。如果有人能帮助我,我将不胜感激。
function [tour, length] = clarke_wright (data)
n=size(data,1); % number of records
center = mean(data,1); % mean of data
hubIdx = knnsearch(data,center,'k',1); % nearest record to center
distances = dist(data,data'); % this requires O(n^2) space :(
savings = zeros(n); % place to store the saving after adding an edge %
% Can be more vectorized? %
for i=1:n
if i==hubIdx
continue;
end
savings(i,(i+1):n)=distances(i,hubIdx)+distances(hubIdx,(i+1):n)-distances(i,(i+1):n);
end
minParent = 1:n;
[~,si] = sort(savings(:),'descend');
si=si(1:(end/2));
Vh = zeros(1,n);
Vh(hubIdx) = 1;
VhCount = n-1;
degrees = zeros(1,n);
selectedIdx = 1; % edge to try for insertion
tour = zeros(n,2);
curEdgeCount = 1;
while VhCount>2
i = mod(si(selectedIdx)-1,n)+1;
j = floor((si(selectedIdx)-1)/n)+1;
if Vh(i)==0 && Vh(j)==0 && (minParent(i)~=minParent(j)) && i~=j && i~=hubIdx && j~=hubIdx % always all degrees are <= 2, so it is not required to check them
% if (minParent(i)~=minParent(j)) && isempty(find(degrees>2, 1)) && i~=j && i~=hubIdx && j~=hubIdx && Vh(i)==0 && Vh(j)==0
degrees(i)=degrees(i)+1;
degrees(j)=degrees(j)+1;
tour(curEdgeCount,:) = [i,j];
if minParent(i)<minParent(j)
minParent(minParent==minParent(j))=minParent(i);
else
minParent(minParent==minParent(i))=minParent(j);
end
curEdgeCount = curEdgeCount + 1;
if degrees(i)==2
Vh(i) = 1;
VhCount = VhCount - 1;
end
if degrees(j)==2
Vh(j) = 1;
VhCount = VhCount - 1;
end
end
selectedIdx = selectedIdx + 1;
end
remain = find(Vh==0);
n1=remain(1);
n2=remain(2);
tour(curEdgeCount,:) = [hubIdx n1];
curEdgeCount = curEdgeCount + 1;
tour(curEdgeCount,:) = [hubIdx n2];
tour = stitchTour(tour);
tour=tour(:,1)';
length=distances(tour(end),tour(1));
for i=1:n-1 % how can I vectorize these lines?
length=length+distances(tour(i),tour(i+1));
end
end
function tour = stitchTour(t) % uniforms the tour [a b; b c; c d; d e;.... ]
n=size(t,1);
[~,nIdx] = sort(t(:,1));
t=t(nIdx,:);
tour(1,:) = t(1,:);
t(1,:) = -t(1,:);
lastNodeIdx = tour(1,2);
for i=2:n
nextEdgeIdx = find(t(:,1)==lastNodeIdx,1);
if ~isempty(nextEdgeIdx)
tour(i,:) = t(nextEdgeIdx,:);
t(nextEdgeIdx,:)=-t(nextEdgeIdx,:);
else
nextEdgeIdx = find(t(:,2)==lastNodeIdx,1);
tour(i,:) = t(nextEdgeIdx,[2 1]);
t(nextEdgeIdx,:)=-t(nextEdgeIdx,:);
end
lastNodeIdx = tour(i,2);
end
end
最佳答案
如果空间有问题,您可以这样做(可能会稍微降低计算速度)。
我没有真正研究过你的代码,但从伪代码来看,这应该可以解决问题:
对于每一对或每一点,计算通过连接它们所节省的成本。
如果这比迄今为止找到的最佳节省更好,请更新最佳节省,并记住两点。
检查完所有对后,只需实现最佳节省即可。
这样您就几乎不需要额外的空间。
关于matlab - 如何在 Matlab 中优化 TSP 的 Clarke-Wright 启发式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17536053/
遗传算法解决旅行商问题 作者:Cukor丘克 环境:MatlabR2020a + vscode 问题描述 旅行商问题(TSP). 一个商人欲从自己所在的城市出发,到
完全有向图上的旅行商问题是否存在多项式时间算法? 最佳答案 不太可能。如果有的话,您可以采用任何图形并添加所有具有非常高权重的缺失边。这将允许解决问题的标准版本,已知该问题是 NP 难的。 关于gra
我正在使用 R 中的 TSP 包解决旅行推销员问题,但试图实现预定的起点和终点。 该软件包显然允许设置旅程的起点,如下所述: How to specify a starting city using
我是 Java 新手,正在尝试获取多个城市之间的最短路径。 从某个点(城市)开始,经过所有其他城市,结束在同一城市 从 JSON 文件解析日期: { "city": "City1", "latitud
我需要编写诸如旅行推销员问题之类的程序,但带有节点。我需要获得较少错位的金额。 我不知道如何使用玻尔兹曼常数实现模拟退火算法。 我已经编写了第一部分的代码: `导入java.util.ArrayLis
为学校做一个项目,我们实现最近邻启发式算法(我已经完成了),以及旅行推销员问题,我们进行详尽的搜索(然后我们分析算法、它们的时间复杂度等)。我们的老师说要四处寻找用于穷举搜索部分的代码(或修改),而不
我正在使用 C 语言中的蚁群优化来解决 TSP 问题。我认为我的实现是正确的,但我的程序不起作用。我知道我的代码中存在内存问题,因为当我运行程序时,控制台会写“核心已转储”。我使用 gdb 来查找错误
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 3 年前。 Improve th
在其他帖子中,Networkx 被建议为“我的 friend ”。但是对于 TSP 问题的特定解决方案,似乎没有现成的可用函数。即 Creating undirected graphs in Pyth
我正在使用一段代码来使用动态编程实现 TSP。我找到了这段代码,但无法弄清楚 compute() 函数及其工作原理。我不知道变量是什么,也不知道它是如何计算路径的。非常感谢任何帮助。 #include
我正在努力实现一个基于模拟退火的程序来解决旅行商问题。我得到的所有解决方案都不令人满意,我不知道如何改进我的实现。显然我不是在关注基准测试,而只是在寻找视觉上可接受的最短路径。如果有人可以启发我,我将
我正在尝试用机票解决旅行商问题,所以主要思想是从一个机场开始,只访问所有机场一次,然后返回原点。 举个例子:从洛杉矶国际机场出发访问 LV、CA、NY结束 LAX。 这是一个经典的图形问题,我们可以将
我想问一下如何在自组织映射 (SOM) 中实现 TSP。 SOM 算法/工作如何获取 TSP 路径的结果? 最佳答案 旅行商问题 (TSP) 是一个优化问题。有许多算法试图解决 TSP,包括像遗传算法
TSP 的成本函数如何运作?假设我有一个距离为 100 的游览,我稍微更改了游览,对原始游览进行了 4 次更改,现在它的距离为 50。 成本函数会给我 4,因为那是变化的数量;还是 50,因为距离的变
我正在尝试解决一个包含大约 10,000 个城市的非常大的 TSP。为了并行化我的任务,我想将这些城市划分为集群并为每个集群解决 TSP。 我想要一种可以将我的城市分成集群的方法(基于城市密度/该集群
我一直在尝试弄清楚如何使用回溯来解决 TSP。如何计算“成本”? 矩阵: ∞ 20 30 10 11 15 ∞ 16 4 2 3 5 ∞ 2 4 19 6
解决 TSP 问题的最常见启发式方法(特别是 Kernighan–Lin 启发式方法)需要处理随机生成的路线并从中改进解决方案。然而,我想出的唯一方法是生成顶点的随机排列并检查它是否是一个解决方案。
我正在尝试使用分支定界算法解决 TSP。 我必须建立一个包含成本的矩阵,但我遇到了这个问题:我有坐标为 x 和 y 的城市。 旅行的费用是 ceil(ceil(sqrt((x1-x2)^2+(y1-y
我希望在 Java 中实现模拟退火算法,以找到 Travelling Salesman Problem 的最佳路径。 ,到目前为止,我已经实现了蛮力,并希望修改该代码以使用模拟退火。显然,蛮力和模拟退
我无法理解为什么该算法不返回 TSP 的最短路径。 vector tsp(int n, vector >& cost) { long nsub = 1 > opt(nsub, vector(n)
我是一名优秀的程序员,十分优秀!