2012-07-20 128 views
0

我一直在研究一個多目標優化問題,該問題使用遺傳算法來顯示一年多的最佳解決方案。java將二維數組作爲遺傳算法中的對象

問題包括根據許多標準將人員分配給不同的團隊。我已經完成了初始化階段,並且完成了適應性函數編碼。但是,我無法將生成的(2d數組)解決方案保存爲對象,並暫時將其保存在內存中,以便可以在GA的後期階段使用它們:選擇,交叉和突變。

我使用的輪盤選擇和略有不同的交叉和變異算法。我沒有這些問題。這只是我一直無法找到一種方法來暫時在內存中保存1個生成的解決方案(在這種情況下是完整的團隊分配),然後生成另一個解決方案並將其保存在內存中,然後再將其保存在內存中,然後再保存到另一個解決方案等。

我已經嘗試了很多不同的東西,我可以想到,從我可以記住的兩個是: (i)將2d數組類型從int更改爲Object,但這給出了一個錯誤,因爲2d數組創建團隊使用另一個int數組來定位列表中的人員id索引位置; (ii)使用在每次運行初始種羣生成類後要增加的靜態類字段變量。

我已經研究了幾個月,並嘗試了所有我能想到的。如果有人能夠指導我甚至給我提示,我如何保存一個二維數組,以便我可以在GA的後期階段使用它,將會有很大的幫助。

由於

編輯:這是具有創建小組2D陣列位初始羣體類:每行代表隊數量和列是會員ID(我已經排除一些代碼,稱爲其他類而是用文字表示):

+1

你說你不能將生成的解決方案臨時存儲在內存中......我的第一個問題是「這個數據集有多大?」其次,你能否提供一些專門做這部分的代碼?第三,從「int」到「Object」不是一個好主意,如果你能看到使用包裝類的優點,你至少會碰到'Integer'。 – Makoto 2012-07-20 19:56:50

+0

您能否提供您的實施細節?有關「2d」陣列的信息如何?它有多大?爲什麼你不能保存解決方案?你嘗試了什麼? – Behe 2012-07-20 20:23:56

+0

我已編輯帖子以添加團隊創建2D陣列的示例代碼。我最初想要重複120次創建組的120次,因爲實際上這兩個陣列將創建120個不同的團隊分配,並將這120個團隊分配保存在臨時存儲器中 – Anon 2012-07-20 21:20:25

回答

0

你的問題在這裏是一個架構。你正在創建你的人口在一個單獨的班級,而無需發送任何地方。你想把你的初始化包裝在另一個類中。當我編寫新的GA時,我通常會做這樣的事情。

class GeneticAlgorithm { 

    public static int[][] population; 
    public static double mutationRate; 
    public static double crossoverRate; 

    public int[][] initializePopulation //this is where your createTeams method would go 
    public int[][] mutation 
    public int[][] crossover 

    public void runGA 

} 

這是我對遺傳算法的基本結構。在你的runGA方法中,你可以根據你的喜好循環多少代,不管它是基於退出標準還是靜態數字。每一代你只需將你現有的人口傳遞給你的變異和交叉函數,它就會返回你所得到的人口。當你完成所有這些工作時,你的人口將被安全地存儲在一個變量中,該變量可以在你的遺傳算法終止時保存或輸出。

希望有所幫助,祝你好運。

+0

我認爲這是我之前錯過的。我會嘗試按照你的建議來運行這些類,並讓你知道它是如何實現的(我大概99%肯定這會解決我的問題)。非常感謝你 – Anon 2012-07-25 15:20:31

+0

如果這不能解決你的問題,隨意發佈一些更多的信息。如果確實如此,請不要忘記接受答案。 – Raskolnikov 2012-07-31 21:38:56