簡體   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