如何将加权循环图划分为n个图,尽可能少地断开连接

时间:2017-11-02 06:44:09

标签: java optimization graph-algorithm

问题的背景:

在我女儿学校的每一个新年开始时,校长总是谈到将孩子分成几个班是多么困难,因为他们对于他们想要在课堂上的人有很多要求,幼儿园也有一些建议。

在我看来,这只是一个加权的循环图,其中包含孩子作为节点,请求/建议作为需要拆分的边缘。

问题:

想象一下,如果你愿意,带有周期和加权边的图可能会断开连接。 我想将该图划分为n个较小的图,每个图中至少有s个节点,每个图中最多有t个节点,同时尽可能少地打破边。 我认为NP很难解决,所以它可能真的是一个优化问题。

  1. 此图算法是否具有名称?
  2. 有没有可以帮我解决这个问题的java库?
  3. 谢谢, 的Jesper

2 个答案:

答案 0 :(得分:0)

图表的组件也是图表。去年我不得不编写图像拼接代码,这些代码使用了64000像素的有向图数据结构而且速度都不慢。image second image first enter image description here

生成的图片是最后一张,代码在这里github

嗯,在您的情况下,您可以创建图形数据结构。创建一个Linkedlist的一维数组,并在该链接列表中保存与三个参数连接的数据结构,第一个是您的第一个学生,第二个是第一个连接的学生,第三个是表示它们之间的强度的数字。 :示例学生1连接到学生5,其强度== 100然后您创建一个新节点Connected c = new connected(1,5,100);并将其添加到数组的第一个条目,如下所示:array[i].add(c) where i == 1

搜索:哪个学生与哪个学生相关联:当您尝试查找哪个学生连接到哪个学生时,您可以简单地使用以下数组索引:

`for(Connected c : array[i].get();
        int firstStudent = c.getFirst()
        int secondStudent = c.getSecond()
         int strength = c.getStrength();`

您的链接列表应该有一个迭代器,以便您可以进行遍历。

这实际上是这样的:   enter image description here

答案 1 :(得分:0)

此问题听起来像是最小切割问题,但对于有向图。

  

在图论中,图的最小切割是切割(切割的一个分区)   图的顶点分为由at连接的两个不相交的子集   至少一个边缘)在某种意义上是最小的。 wiki

针对您所描述的问题的一个未优化的解决方案是找到所有连接的组件并找到每个组件的最小切割(导致它们破坏),直到所有生成的组件满足您的标准。

现在这个方法的问题在于我知道的算法,用于无向图的最小切割工作。在我对该主题的搜索中,我发现了article这个问题可能有用。