我需要生成一个具有固定数量顶点的随机图.我每次都在寻找解决方案时遇到一些困难.
图规则
>每个顶点将具有一个随机数量的连接,最多为N-1,其中N是顶点的总数.
>顶点不能包含与自身的直接连接
>顶点不能包含与其他顶点的重复连接.
>如果顶点A连接到顶点B,则顶点B必须连接到顶点A.
>每个顶点必须连接至少3个其他顶点.因此每个顶点将在[3,N-1]个边之间.
我在70%的时间内得到了正确的解决方案,但有时候我在图中相当远,那么就没有剩下有效的顶点了.我需要对顶点连接有什么约束来保证解决方案?
到目前为止我在做什么
>随机化[3,N-1]之间每个顶点的多个连接.
>检查连接总数是否均匀.如果A指向B,B指向A,那么图中的连接总数应该是偶数,否则就没有解决方案.如果是奇数修改顶点,那么总数是偶数.
>填写完全约束的每个顶点.因此,具有N-1个连接的顶点必须指向所有其他顶点.填写从该顶点到所有其他顶点的连接,并为所有其他顶点提供与完全约束的顶点的连接.
>按照约束的程度处理每个顶点.因此,通过生成的随机顶点索引处理所有具有N-2个连接的顶点,然后是N-3连接,然后是N-4等.
>如果新的随机索引有效,则连接它们然后继续,如果它无效则重新随机索引,直到获得有效值. (这些图表最多只能是7-15个节点,所以这不会花费很长时间).
一般来说,我到达最后2个顶点,但是这个方法没有剩下有效值.每个都需要1个连接,但它们已经相互连接.任何人都有更好的算法或对连接数量的额外约束可以帮助我吗?
如果存在偶数个边缘,应该有很多解决方案,但我上面的算法显然不能保证找到一个.
最佳答案 >创建一个边数少于3的所有顶点的矢量.
>随机选择矢量中的顶点.
>复制已移除所选顶点的矢量(您可以交换选定的椎骨和最后一个并调整大小).
>同时删除已连接到所选顶点的所有目标顶点.
>从复制的矢量中选择一个顶点,并在两个选定的n个顶点之间的每个方向上创建一条边
>只要边长少于3的所有顶点的矢量不为空,重复步骤1..5