代碼實現前的痛苦思考

變異的實現

這個代碼的編寫很簡單,規定變異規模,使用rand,選擇位置即可。

交叉的實現

對於兩串編碼,選擇一個交叉點,然後將尾部部分進行交換即可。注意,在編寫代碼的時候,邊界情況要考慮清楚。

比如,0000 1111與0101 0101進行交叉,交叉點爲bits數組的第4位(bits[4],按照我們的交叉方法:將bits[0]~bits[3]依次進行考慮),交叉的結果爲0000 0101、0101 1111。

思考:如果選擇2個交叉點,採用循環交叉的方式,又會如何?(顯然算法實現的複雜度上升了,效果會不會更好呢?)

如果“單點交叉”能夠生成完成“雙點交叉”所有的樣本,那麼我們完全就沒必要使用複雜的雙點交叉方式。我們寧可在初始的時候多生成一些樣本點,然後採用簡單的交叉方式;

二元信息素的累加

暫時還沒有實現,需要考慮幾個方面:

1,信息素累加不要過快,免得陷入局部最優;

2,信息素累加太慢也不好,陷入隨機搜索;而且“信息素累加”這個操作本身就在浪費時間。

 

這些都是最基本的運算,必須保證高效;我現在覺得,數據結構就是圍繞它們來進行規劃的:天馬行空式的編碼方式(隨意拷貝、傳遞數據等),無法滿足運算的要求;雖然設計成類、封裝,能夠幫助我理解代碼的意義,但是如果不能得到足夠高效的運算結果,那豈不是很糟糕?

在現階段,我考慮的是“算法的有效性”問題,可以考慮一些相對簡單的樣本,驗證我的算法。

 

(在算法得到驗證之後)

如果涉及到實踐的問題,那就需要優化工作了——將tsp在有限時間內提高兩個城市的規模,也是一件非常實際的工作啊!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章