簡體   English   中英

二部圖中的匹配算法

[英]Matching alghoritm in bipartite graph

我知道,這看起來像是學校作業,但這是一個真正的商業問題。 由於我不會寫,我們正在使用什么樣的 object,我將使用有點超現實的問題描述:

有許多城市(幾十個)。 每個城市都有最大數量的導彈,可以擊中它(從 1 到幾百)。

還有一些導彈,分布在世界各地(大約 1-2 千)。 每枚導彈都有一個可以瞄准的城市列表。 可以只有一個城市,可以有幾個,也可以包含所有可能的城市。

任務:

將目標分配給導彈,以便可以發射最大數量的導彈。

我們現在正在做的是“朴素隨機”的解決方案:

1. Randomly sort list of missiles
2. Pass each missile, and set it to target first city from it's list, that still can accept missile
3. Count number of of targeted missiles
4. If it's better than best solution so far, save it
5. Repeat multiple times (we can do this about 1-10 million times in reasonable time).

如果我們從導彈數量低於允許最大值的城市開始,我們可以稍微改善結果——但 rest 仍然是隨機化和重復的問題。

物理測試每個解決方案是不可能的,因為將有超過 1000 個。(千階乘)組合。

我正在尋找可以解決我問題的算法,也許是一些鏈接或文獻。 這是一種圖論問題,具有二分圖——即使是這種圖的名稱也將有助於進一步研究。

我們正在考慮 Hopcroft-Carp 算法,但它不適合 - 如果每個城市只允許一枚導彈,那就太好了。

任何幫助,將不勝感激。

隨時糾正我的英語。

一種可能的方法是使用遺傳算法。 如果有 m 個導彈,則染色體將是 m 個值的向量,每個值是一個 integer,范圍為 (0, 1,..., n)。 0 是一個特殊值,表示“沒有目標”。 n 是一個取決於導彈的值(因為每個導彈都有自己的可能目標列表)。

function 最大化(染色體適應度)是非零值的數量。

然而,交叉和變異存在一個問題:它們會產生無效的解決方案(因為可能無法滿足城市容量)。 一種解決方法是對適應度 function 施加懲罰。

假設我們有容量為 10 的城市 1 和容量為 5 的城市 2。如果城市 1 接收 12 枚導彈,而城市 2 接收 8 枚,我們有 2 + 3 = 5 額外導彈。 從適應度中刪除 5*k(k 是需要選擇的一些系數)。

遺傳算法偏愛具有高適應度的染色體,這意味着它應該產生滿足容量限制的解決方案。

Hopcroft-Karp 只需要很少的修改就可以處理這個問題。

可以將每個城市分成 N 個副本,其中 N 是它可以接受的導彈數量,因此每個副本只能接受 1 枚導彈。 然后你會尋找一個二分最大二分匹配,你可以使用 Hopcroft-Karp。

當然,這將大大增加您的問題的規模和解決方案的數量,因為您使用任何導彈瞄准哪個城市副本並不重要,而且您可以找到的許多匹配最終會是相同的重新組合分裂的城市后的解決方案。

但是現在你知道你可以做到,想象一下找到一條擴展路徑,從一個自由城市開始,在你已經擁有的那種解決方案中,一個城市可以在邊緣擁有最大的容量。

  1. 一條擴展路徑需要從一個自由城市開始——那是一個小於其當前邊緣容量的城市。
  2. 然后它沿着未使用的邊緣到達導彈;
  3. 然后它沿着現有的邊緣到達城市,城市的容量並不重要,因為;
  4. 然后它沿着未使用的邊緣到達另一個導彈,並根據需要重復 3-4 次。

現在,當您沿着增強路徑翻轉邊緣時,只有起始城市會看到瞄准它的導彈數量的變化,因此您無需在搜索過程中以任何方式考慮城市容量。

此搜索與 Hopcroft-Karp 之間唯一真正的區別是您需要允許多次訪問同一個城市(但不是同一個導彈)的路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM