變異的實現
這個代碼的編寫很簡單,規定變異規模,使用rand,選擇位置即可。
交叉的實現
對於兩串編碼,選擇一個交叉點,然後將尾部部分進行交換即可。注意,在編寫代碼的時候,邊界情況要考慮清楚。
比如,0000 1111與0101 0101進行交叉,交叉點爲bits數組的第4位(bits[4],按照我們的交叉方法:將bits[0]~bits[3]依次進行考慮),交叉的結果爲0000 0101、0101 1111。
思考:如果選擇2個交叉點,採用循環交叉的方式,又會如何?(顯然算法實現的複雜度上升了,效果會不會更好呢?)
如果“單點交叉”能夠生成完成“雙點交叉”所有的樣本,那麼我們完全就沒必要使用複雜的雙點交叉方式。我們寧可在初始的時候多生成一些樣本點,然後採用簡單的交叉方式;
二元信息素的累加
暫時還沒有實現,需要考慮幾個方面:
1,信息素累加不要過快,免得陷入局部最優;
2,信息素累加太慢也不好,陷入隨機搜索;而且“信息素累加”這個操作本身就在浪費時間。
這些都是最基本的運算,必須保證高效;我現在覺得,數據結構就是圍繞它們來進行規劃的:天馬行空式的編碼方式(隨意拷貝、傳遞數據等),無法滿足運算的要求;雖然設計成類、封裝,能夠幫助我理解代碼的意義,但是如果不能得到足夠高效的運算結果,那豈不是很糟糕?
在現階段,我考慮的是“算法的有效性”問題,可以考慮一些相對簡單的樣本,驗證我的算法。
(在算法得到驗證之後)
如果涉及到實踐的問題,那就需要優化工作了——將tsp在有限時間內提高兩個城市的規模,也是一件非常實際的工作啊!