问题背景
我目前正在开发一个Ant Colony System算法框架。我想我会先尝试他们应用的第一个问题:旅行推销员问题(TSP)。我将使用C#来完成任务。
所有TSP实例都包含一个完整的无向图,其中2个不同的权重与每条边相关联。
问题
到目前为止,我只使用了邻接列表表示,但我读过它们只推荐用于稀疏图。由于我不是最了解数据结构的人,我想知道实现无向完整图的最有效方法是什么?
如果需要,我可以提供其他详细信息。
感谢您的时间。
更新
重量澄清。每条边都有两个与之关联的值:
运营即可。我将在图表上进行的操作的小摘要:
问题澄清
蚁群优化算法可以“解决”TSP,因为这是他们首次应用的地方。我说“解决”因为它们是一系列称为元启发式优化的算法的一部分,因此它们永远不能保证返回最优解。
关于手头的问题:
研究文章详情:Ant Colony System article
效率考虑因素
我比运行时间(速度)更担心。
答案 0 :(得分:2)
首先,有一个关于邻接列表与矩阵的一般指南here.这是一个非常低级别,非特定的讨论,所以它可能不会告诉你任何你不知道的事情。
我想,外卖是这样的:如果你经常发现自己需要回答这个问题,“我需要知道节点i和节点j之间边缘的距离或信息素水平,”那么你可能想要矩阵形式,因为该问题可以在O(1)时间内回答。
你提到需要迭代一个节点附近的边缘 - 这里有一些聪明和微妙的地方可能会进来。如果你不关心迭代的顺序,那么你不关心数据结构。如果您非常关心订单,并且您知道订单,并且它永远不会改变,您可以直接将其编码到邻接列表中。如果您发现自己总是想要,例如,最大或最小的信息素浓度,您可能想要尝试更有条理的东西,比如优先级队列。这实际上取决于你正在做什么样的操作。
最后,我知道你提到你对速度比对记忆更感兴趣,但我不清楚你将使用多少图形表示。如果只有一个,那么你真的不在乎。但是,如果每个蚂蚁正在构建自己的图形表示,那么你可能比你想象的更多,并且邻接列表将允许你携带不完整的图形表示;另一方面,当蚂蚁在其边境探索时,需要时间来建立表示。
最后,我知道你说你正在处理完整的图形和TSP,但是值得思考你是否曾经需要将这些例程调整到可能的图形上的其他问题,如果是的话,那么。
我倾向于邻接列表和/或更多结构,但我认为你不会找到干净,清晰的答案。
答案 1 :(得分:1)
由于您有完整的图表,我认为最佳表示形式是2D数组。
public class Edge
{
//change types as appropriate
public int Distance {get;set;}
public int Pheromone {get;set;}
}
int numNodes;
Edge[,] graph = new Edge[numNodes,numNodes];
for(int i = 0; i < numNodes; i++)
{
for(int j = 0; j < numNodes; j++)
{
graph[i][j] = new Edge();
//initialize Edge
}
}
如果你有很多节点,并且在这个图中没有按照索引“记住”节点,那么拥有一个将Node
映射到图中索引的字典可能是有益的。反向查找也可能有帮助(List
将是适当的数据结构。这将使您能够获取Node对象(如果您有关于每个节点存储的大量信息)基于图中该节点的索引。