沉浸式寫代碼|遺傳算法解決旅行商問題|MATLAB實現(xiàn)

這里是司守奎老師《數(shù)學(xué)建模算法與應(yīng)用》一書中的截圖:
希望能夠幫助沒有書籍參考的小伙伴理解代碼,視頻的代碼也是來自這本書。
然后想說,我是剛學(xué)數(shù)模的小白,自己學(xué)習的過程遇到了一些坎坷,學(xué)習完之后就想和大家分享,如果能幫助到也是剛學(xué)的小伙伴,那就更好了!


這道題和模擬退火那道題是一樣的,如果有小伙伴不清楚,歡迎去上一個視頻看看哦。
對于編碼的話,表現(xiàn)型通過編碼轉(zhuǎn)化為基因型,我們在遺傳算法中進行的交叉、變異操作都是針對基因型,最后我們通過解碼再把基因型轉(zhuǎn)化為表現(xiàn)型,這樣我門就能得出我們問題的解。
書上用的編碼方式并不是常見的二進制編碼,而是十進制編碼。在我看來,二進制編碼有編碼簡單、操作易實現(xiàn)的優(yōu)點,但是呢因為其隨機性,使得算法的局部搜索能力差,下面引用CSDN上某位博主的例子:若0010101111的第2位發(fā)生了變異,即從0變?yōu)?,那么表現(xiàn)型則會從x=175變成了x=431,變異使得表現(xiàn)型變化很大,很不穩(wěn)定。遺傳算法相比模擬退火算法,在我看來前者局部搜索能力強,但是全局搜索能力較差,那么對后者的學(xué)習,我們需要揚長避短,所以我覺得用十進制編碼是一個不錯的選擇。另外,遺傳算法的時間復(fù)雜度是不是高了億點點(吐槽)。并且十進制編碼還能夠避免出現(xiàn)二進制編碼出現(xiàn)非法染色體的情況,這個特點是我查到的,但是我不太理解,希望有小伙伴教教我(誠懇!)。
交叉和變異操作,書上有改進的內(nèi)容,這里我截圖給大家:


對于說尋優(yōu)抖振現(xiàn)象,說白了就是結(jié)果會由于初始條件微小的變化而產(chǎn)生大的變化。那么在尋找最優(yōu)解的過程中會出現(xiàn)上下波動的情況,最終還是沒有確定答案。