Algorithm 在不相交的顶点之间生成随机边
我在2D空间中有一组任意的顶点。我希望在这些顶点之间几乎随机地生成边,以便满足以下三个条件:Algorithm 在不相交的顶点之间生成随机边,algorithm,graph,Algorithm,Graph,我在2D空间中有一组任意的顶点。我希望在这些顶点之间几乎随机地生成边,以便满足以下三个条件: 每个顶点至少有一条边 没有两条边彼此相交,除非可能在一个公共顶点处 除了初始集之外,不需要添加新的顶点 总的来说,我不太明白如何解决这个问题。我最初尝试将我的顶点强制构造成整齐的列(尽管在同一列中的顶点之间具有任意的垂直间距),然后一次形成一列的边,顶点只连接到下一列中的边。我想我可以检查当前行中较高位置的顶点是否连接到下一行中较低位置的顶点,如果是,则阻止任何符合该条件的边。(换句话说,如果V[j,k
总的来说,我不太明白如何解决这个问题。我最初尝试将我的顶点强制构造成整齐的列(尽管在同一列中的顶点之间具有任意的垂直间距),然后一次形成一列的边,顶点只连接到下一列中的边。我想我可以检查当前行中较高位置的顶点是否连接到下一行中较低位置的顶点,如果是,则阻止任何符合该条件的边。(换句话说,如果V[j,k]是“从列j顶部开始的第k个顶点”,那么如果在任何顶点V[j,k3]和V[j+1,k4]之间存在边,我将阻止V[j,k1]和V[j+1,k2]之间的任何边),其中k4>k2和k3从极坐标和间隔操作的角度进行攻击。列出未连接的顶点;应用随机洗牌 对于每个未连接点
p
:
- 列出
“可见”的所有点:未被边缘阻挡的点(见下文)P
- 随机选择一个“可见”点
;将边PQ添加到图形中Q
- 平移所有坐标,使
为原点P
- 计算每个其他点的极坐标(r,θ)
- 对于每个边AB,角度范围(A.theta,B.theta)和角度(0,2*pi)的环绕描述了一个空间饼图切片,其顶点位于
。很简单,如果C.r>max(A.r,B.r),则该切片中的任何点P
,都是不可见的--如果距离C
比任一端点都远。同样,如果距离P
比任一端点都近,则仍在考虑中。对每一点P
进行检查将大大减少您的候选名单C
P
最近的点必须可见。
-对于任何其他点C,对覆盖其角度(θ)的所有边AB进行相交检查,使r.Ap
可见的所有点的列表(请注意,必须至少有一个点,除非p
是图形中的唯一点;如果图形中至少有两个点与p
的角度不同,则必须至少有两个这样的点)。随机选择一个点并添加边
这可能不是计算效率最高的算法。但是,它很容易可视化,每个步骤都很容易实现,并且很容易为给定的问题提供解决方案。从极坐标和间隔操作的角度对此进行攻击。列出未连接的顶点;应用随机洗牌 对于每个未连接点
p
:
- 列出
“可见”的所有点:未被边缘阻挡的点(见下文)P
- 随机选择一个“可见”点
;将边PQ添加到图形中Q
- 平移所有坐标,使
为原点P
- 计算每个其他点的极坐标(r,θ)
- 对于每个边AB,角度范围(A.theta,B.theta)和角度(0,2*pi)的环绕描述了一个空间饼图切片,其顶点位于
。很简单,如果C.r>max(A.r,B.r),则该切片中的任何点P
,都是不可见的--如果距离C
比任一端点都远。同样,如果距离P
比任一端点都近,则仍在考虑中。对每一点P
进行检查将大大减少您的候选名单C
P
最近的点必须可见。
-对于任何其他点C,对覆盖其角度(θ)的所有边AB进行相交检查,使r.Ap
可见的所有点的列表(请注意,必须至少有一个点,除非p
是图形中的唯一点;如果图形中至少有两个点与p
的角度不同,则必须至少有两个这样的点)。随机选择一个点并添加边
这可能不是计算效率最高的算法。但是,它很容易可视化,每一步都很容易实现,并且很容易为给定的问题提供解决方案。拾取两个随机顶点,并在不创建交点的情况下将边添加到边集是否有问题?可能?与限制有关1:每个顶点必须至少有一条边。随机拾取点,然后可能不在它们之间添加边(如果它们与另一条边相交),这意味着,给定限制1,该算法可能是无界的,对吗?我想避免冻结应用程序的可能性:)编辑,尽管这给了我一个想法。。。我可以遍历这些顶点,对每个顶点,洗牌所有其他顶点的列表,并遍历这些顶点,直到其中一个顶点没有交集。。。是t吗