问题背景
我目前正在开发的蚁群系统算法的框架。 我想我会试图通过他们,他们分别适用于第一个问题开始了:旅行商问题(TSP)。 我将使用C#来完成任务。
所有TSP实例将包括一个完整的无向图具有与每个边缘相关联2个不同的权重。
题
到现在为止我只用邻接表表示的,但我读过,他们建议只对稀疏图。 由于我不是最有知识的人,当涉及到数据结构,我想知道什么是实现一个无向完全图的最有效方法是什么?
如果需要,我可以提供更多的细节。
感谢您的时间。
UPDATE
重量澄清 。 每边都会有与之关联的两个值:
- 两个城市之间的距离(d(I,J)= d(J,在两个方向上ⅰ)相同的距离)
- 在那个特定的边缘沉积蚂蚁信息素的量
运营 。 我会在图表上做业务的小总结:
- 对于每个节点,该特定节点上的蚂蚁将具有通过与所有入射边缘相关联的值来迭代
问题澄清
蚁群算法可“解决” TSP,因为这是他们在那里首先被施加到。 我说“解决”,因为他们是一个家庭的算法称为启发式算法最优化的一部分,因此,他们永远无法保证返回的最佳解决方案。
对于手头的问题:
- 蚂蚁会知道如何完成巡演,因为每只蚂蚁都会有记忆。
- 每次一只蚂蚁访问城市将存储到内存中那个城市。
- 每次蚂蚁考虑访问一个新的城市它会在内存中搜索并选择相应的外出边缘只有当这种优势将不是导致已经访问过的城市。
- 当没有更多的边缘蚂蚁可以选择它完成游; 在这一点上,我们可以通过它的记忆回溯折回由蚂蚁创建的巡演。
研究文章详细介绍: 蚁群文章
效率的考虑
我更担心的不是内存运行时(速度)。
首先,有一个一般的指导邻接表VS矩阵这里。 这是一个相当低的水平,非特异性的讨论,虽然如此,它可能不会告诉你任何你不知道的。
外卖的,我认为是这样的:如果你经常发现自己需要回答这个问题,“我需要知道的距离或精确节点i和节点j之间的边的信息素水平”,那么你可能想的矩阵形式作为这个问题可以在O(1)时间来回答。
你提到需要遍历邻近node--边缘这里是一些聪明和微妙的可以进来了。如果你不关心迭代的顺序,那么你不关心数据结构。 如果您十分关心的顺序,你知道订单达阵,它永远不会改变,你也许可以直接编码成邻接表这一点。 如果你发现自己总是想,比如,信息素的最大或最小浓度,你可能想尝试一些更结构化的,就像一个优先级队列。 这真的取决于你在做什么样的操作。
最后,我知道你提到,你更感兴趣的速度比内存小,但它不是我清楚,你会多少图形表示来使用。 如果只有一个,那么你真的不在乎。 但是,如果每个蚂蚁构建了自己的图形表示,它沿着去,你可能更关心比你想象的,和邻接表可以让你随身携带不完整的图形表示; 的是,另一面是,当蚂蚁在其前沿探索这将需要时间来建立起来的表示。
最后的最后,我知道你说你正在处理的完整图表和TSP,但它是值得我们思考的,你是否会永远需要这些例程适应其他一些问题上可能的图形,如果是这样,那又怎么样。
我倚向邻接表和/或更多的结构,但我不认为你会找到一个干净,清晰的答案。
既然你有一个完整的图形,我觉得,最好的表现将是一个二维数组。
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对象(如果你有大量的信息存储每个节点的能力)图中的该节点的。