我最近实现了Dijkstra的算法来练习Java。我现在正在考虑如何构建随机测试图(具有单向边)。
目前,我使用了一种天真的方法。节点在2d空间中的随机位置创建(其中x和y是0和某个MAX_SPACE常量之间的无符号整数)。随机创建边缘以连接节点,以便每个节点具有至少为1(并且最多为MAX_DEGREE)的outdegree。 Indegree未强制执行。然后我搜索集合中第一个和最后一个节点之间的路径,可以连接也可以不连接。
在更现实的情况下,节点在2d空间中具有与其接近度成比例的连接概率。使用该属性构建随机测试图的好策略是什么?
备注
我将主要使用它来构建可以手工绘制和验证的图形,但需要考虑缩放到更大的图形。
应该很容易修改策略以支持以下常量(也许还有其他常规 - 如果你想到任何有趣的话,请告诉我):
答案 0 :(得分:1)
您可以先查看JUNG(Java库)中可用的不同随机图生成器:
Barabasi Albert Generator - 简单的进化无标度随机图生成器。在每个时间步,创建一个新的顶点,并根据"优先附着"的原则连接到现有的顶点,从而具有更高度数的顶点被选择用于附着的概率更高。
Eppstein Power Law Generator - 生成具有幂律度分布的无向图的图生成器。
还有其他各种生成器 - See Listing Here
对于python,NetworkX库也提供了许多图形生成器 - Listed Here
对于许多这些发生器,您可以指定大小,因此您可以从小处开始,然后从那里开始。