繁体   English   中英

如何将一个图分为两个图(类)? (编辑)

[英]How can I divide a graph into two graphs (classes)? (edited)

基本上,我想将大图分为(几乎)相等大小的两个(或三个,取决于类的大小)较小的图。 并且每个节点仍应至少具有一个边缘。

因此,我在neo4j中制作了一个带有节点和边的图形。 但是现在我不知道如何继续。

“现实世界中的问题”:
我的一个朋友(小学老师)遇到问题。 当孩子们从幼儿园进入小学时,他们可以希望再有三个孩子要上课。 然后,教师尝试使他们至少与三者中的一者一起上一堂课。

到目前为止,这是我的图表:

CREATE (Luke:Person { name: "Luke"}),
(Jan:Person { name: "Jan"}),
(Tim:Person { name: "Tim"}),
(Finn:Person { name: "Finn"}),
(Leon:Person { name: "Leon"}),
(Niklas:Person { name: "Niklas"}),
(Tom:Person { name: "Tom"}),
(Jonas:Person { name: "Jonas"}),
(Yannic:Person { name: "Yannic"}),
(Luca:Person { name: "Luca"}),
(Leia:Person { name: "Leia"}),
(Anna:Person { name: "Anna"}),
(Sarah:Person { name: "Sarah"}),
(Hannah:Person { name: "Hannah"}),
(Michelle:Person { name: "Michelle"}),
(Laura:Person { name: "Laura"}),
(Lisa:Person { name: "Lisa"}),
(Lara:Person { name: "Lara"}),
(Lena:Person { name: "Lena"}),
(Julia:Person { name: "Julia"}),
(Luke)-[:PRIORITY {rating: 1}]->(Leia),
(Jan)-[:PRIORITY {rating: 1}]->(Tim),
(Tim)-[:PRIORITY {rating: 1}]->(Lara),
(Finn)-[:PRIORITY {rating: 1}]->(Luke),
(Leon)-[:PRIORITY {rating: 1}]->(Luca),
(Niklas)-[:PRIORITY {rating: 1}]->(Lisa),
(Tom)-[:PRIORITY {rating: 1}]->(Michelle),
(Jonas)-[:PRIORITY {rating: 1}]->(Finn),
(Yannic)-[:PRIORITY {rating: 1}]->(Tim),
(Luca)-[:PRIORITY {rating: 1}]->(Jonas),
(Leia)-[:PRIORITY {rating: 1}]->(Laura),
(Anna)-[:PRIORITY {rating: 1}]->(Tom),
(Sarah)-[:PRIORITY {rating: 1}]->(Leon),
(Hannah)-[:PRIORITY {rating: 1}]->(Niklas),
(Michelle)-[:PRIORITY {rating: 1}]->(Lena),
(Laura)-[:PRIORITY {rating: 1}]->(Leia),
(Lisa)-[:PRIORITY {rating: 1}]->(Lara),
(Lara)-[:PRIORITY {rating: 1}]->(Lisa),
(Lena)-[:PRIORITY {rating: 1}]->(Sarah),
(Julia)-[:PRIORITY {rating: 1}]->(Jonas),
(Luke)-[:PRIORITY {rating: 2}]->(Niklas),
(Jan)-[:PRIORITY {rating: 2}]->(Jonas),
(Tim)-[:PRIORITY {rating: 2}]->(Luca),
(Finn)-[:PRIORITY {rating: 2}]->(Leon),
(Leon)-[:PRIORITY {rating: 2}]->(Luke),
(Niklas)-[:PRIORITY {rating: 2}]->(Anna),
(Tom)-[:PRIORITY {rating: 2}]->(Yannic),
(Jonas)-[:PRIORITY {rating: 2}]->(Michelle),
(Yannic)-[:PRIORITY {rating: 2}]->(Hannah),
(Luca)-[:PRIORITY {rating: 2}]->(Luke),
(Leia)-[:PRIORITY {rating: 2}]->(Jan),
(Anna)-[:PRIORITY {rating: 2}]->(Lisa),
(Sarah)-[:PRIORITY {rating: 2}]->(Tim),
(Hannah)-[:PRIORITY {rating: 2}]->(Finn),
(Michelle)-[:PRIORITY {rating: 2}]->(Leon),
(Laura)-[:PRIORITY {rating: 2}]->(Tom),
(Lisa)-[:PRIORITY {rating: 2}]->(Tom),
(Lara)-[:PRIORITY {rating: 2}]->(Tim),
(Lena)-[:PRIORITY {rating: 2}]->(Yannic),
(Julia)-[:PRIORITY {rating: 2}]->(Sarah),
(Luke)-[:PRIORITY {rating: 3}]->(Michelle),
(Jan)-[:PRIORITY {rating: 3}]->(Luca),
(Tim)-[:PRIORITY {rating: 3}]->(Tom),
(Finn)-[:PRIORITY {rating: 3}]->(Lara),
(Leon)-[:PRIORITY {rating: 3}]->(Anna),
(Niklas)-[:PRIORITY {rating: 3}]->(Lara),
(Tom)-[:PRIORITY {rating: 3}]->(Lena),
(Jonas)-[:PRIORITY {rating: 3}]->(Luke),
(Yannic)-[:PRIORITY {rating: 3}]->(Leia),
(Luca)-[:PRIORITY {rating: 3}]->(Lisa),
(Leia)-[:PRIORITY {rating: 3}]->(Yannic),
(Anna)-[:PRIORITY {rating: 3}]->(Hannah),
(Sarah)-[:PRIORITY {rating: 3}]->(Lena),
(Hannah)-[:PRIORITY {rating: 3}]->(Julia),
(Michelle)-[:PRIORITY {rating: 3}]->(Luke),
(Laura)-[:PRIORITY {rating: 3}]->(Jan),
(Lisa)-[:PRIORITY {rating: 3}]->(Tim),
(Lara)-[:PRIORITY {rating: 3}]->(Finn),
(Lena)-[:PRIORITY {rating: 3}]->(Leon),
(Julia)-[:PRIORITY {rating: 3}]->(Niklas)

无法给出确切的原因,我认为您的问题在于NP(对此表示欢迎)。 我没有完整的解决方案,至少不能提供最佳解决方案(另外,知道最佳解决方案将需要对问题进行更具体的说明。例如,我们的目标是使孩子们尽可能获得最大的成就吗?是否满足优先级?还是为了获得最高的评分?)。 但是我有一个可能有用的想法。

当我阅读您的问题陈述时,该图是有向图的,并且在将图划分为较小的组件之后,所有节点都应至少具有到同一组件内另一节点的一个出站边缘(而不是任何边缘,因为所有子项都应位于一个与他们选择的人一起上课,而不仅仅是与选择他们的人一起上课)。

我的想法如下:首先测试图是否已连接(弱应该足够),如果可以,则在图中找到2个小循环(如果要将子级划分为三个类,则为3个小循环),并创建节点与这些相关联成两个“类”。 跟踪进入这两个类的所有边缘。 对于最小的类,找到来自尚未与类关联的节点的入边,并将其添加到类中。 继续执行此操作,直到它们具有相同的大小为止,然后可以在向每个类中添加节点之间进行切换,直到其中一个不再具有与类无关的节点的传入边缘为止。 然后将其余节点添加到另一个类中。

如果您的图形未连接,则必须考虑到这一点,但是任何小于所需类大小的连接组件都将包含满足所有优先级的子级,因此可以将其添加到一个小周期中从开始添加其他节点开始。 大于最大类大小(如果存在这样的限制)的连接组件可能需要进行一些额外的计算,以便找出要删除的对象而不会导致违反约束的情况。

如前所述,这既不是最佳解决方案,也不是最终的解决方案,但是假设所有孩子都至少希望一个,这应该将每个孩子都放在一个班级中;如果所有孩子都希望全部三个愿望,我的直觉就是应该有一个公平的机会类的大小或多或少均匀。 如果没有,从几个不同的启动周期选择中运行代码可能会提供一些可供选择的解决方案。

希望这可以帮助您入门。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM