我正在用Java編寫一個時間表生成器,使用AI方法來滿足硬約束並幫助找到最佳解決方案。到目前爲止,我已經實現了迭代構造(最受限制的第一種啓發式算法)和模擬退火算法,而且我正在實施遺傳算法。基因交叉函數
對這個問題的一些信息,以及如何我代表它,然後: 我有一組事件,房間功能(即事件需要和房間滿足),學生和插槽 的問題在於分配給每個事件老虎機和一個房間,這樣就不需要學生在一個時間段內參加兩個活動,所有分配的房間都滿足了必要的要求。
我有一個等級的功能,爲每套如果分配檔次的軟約束違規,因此關鍵是要儘量減少這種。
我實施遺傳算法的方式是從迭代構建(可以將事件未分配)生成的種羣開始,然後執行正常步驟:評估,選擇,交叉,變異並保持最佳狀態。沖洗並重復。
我的問題是,我的解決方案似乎改善太少。無論我做什麼,人口往往會隨機適應,並在那裏停滯不前。請注意,這種健身總是不同的,但是會出現下限。
我懷疑問題出在我的交叉功能,這裏是一個道理:
兩個任務是隨機選擇交叉。讓我們稱之爲分配A和B.對於所有B的事件,執行以下程序(順序B的事件都被選中是隨機的):
獲取一個對應的事件,並比較分配。 3種不同的情況可能發生。
- 如果只有其中一個未分配,並且如果有可能在子項上覆制另一個分配,則選擇此分配。
- 如果兩者都被分配,但只有一個分配給孩子的時候不產生
衝突,一個選擇。 - 如果它們都被分配並且沒有創建衝突,則它們是隨機選擇的 。
在任何其他情況下,該事件被留下未分配的。
這將創建一個孩子的一些家長的任務,一些母親的,所以在我看來,這是一個有效的功能。而且,它並沒有打破任何硬性限制。
至於突變,我用我的SA鄰近的功能給我基於對孩子的另一項任務,然後更換這個孩子。
再次。通過這種設置,初始人口數爲100,GA運行並始終趨於穩定在某個隨機(高)適應值。有人能給我一個關於我可能做錯什麼的指針嗎?
感謝
編輯:格式化並清除一些事情
嗨。我想這可能不是最好的,但它可以完成,因爲它在幾篇論文中顯示http://secretgeek.net/content/bambrilg.pdf,http://www.cs.nott.ac.uk/ TR/1995/1995-8.pdf等等,所以我真的很希望看到我的實現工作正在進行......現在它應該會聚到具有這種交叉功能的最佳解決方案,但顯然它不會「所以我做了一些錯誤=/ – JMarques