有這么一種算法,它會騙人、寫詩,還會讓游戲里的機器人碾壓你
有一款非常魔性的小游戲叫《Boxcar2D》,游戲主要內容是用幾何圖形和圓形的輪子組成小汽車,不斷走過一條有上下波動的路,看什么形狀的小車可以走的更遠。但和大部分游戲不一樣的是,不用玩家自己手動拼裝小車,整個過程完全由算法自動進行,每次隨機生成小車,卡到路上了就重新來過。最后小車會越走越遠,整個過程中小車的形狀會越來越合適,一開始可能只是個獨輪車,到后期則會很接近我們生活中摩托車的樣子。
要問有什么案例能簡單明晰地體現出智能、自學習的概念,這款游戲一定是我的首選。而這款游戲中,應用的就是遺傳算法。
什么是遺傳算法?
簡單來說,遺傳算法是一種隨機搜索算法,主要目的是用來優化。和自然界的遺傳一樣,遺傳算法秉持的是適者生存、優勝劣汰。通過選擇、交叉和變異,不斷迭代出更優秀的解法。
通過編碼,將解空間變成編碼空間,從中選擇當前較為優秀的解當做父母,下一步則是將多種解的特征進行交叉,誕生下一代,最后再經過變異成為子嗣。如果子嗣還是不能符合要求,那就再進行一次上述步驟,直到滿足要求。
過程中,工業機器人維修,較差的基因就會一步步被淘汰。最后再進行解碼,就能得到我們想要的結果。總之,這是一個枚舉的過程。就像長頸鹿的進化一樣,樹葉長在高處,每一只鹿都去嘗試吃樹葉,只有符合標準的長頸鹿能夠吃到食物、生產下來并誕生后代。
但要注意的是,這種算法很多時候不會給出一個最優解,而是給出一些較為接近的次優解,從中矮子里面拔將軍。
在哪里能看到遺傳算法?
遺傳算法經常被用來解決一些調度類的問題,比如確定車間工程流程、飛機航線等等。工程、航行中所需要的資源消耗、時間等等權值看做染色體,幾種染色體排列組合,最終選擇其中的較優方案。
此外,機器人中也會用到遺傳算法,尤其是快速定位、路徑規劃等。就像《Boxcar2D》這個游戲一樣,機器人在仿真環境中不斷嘗試接近目標,路線的優越度隨著路線的長度減少,結合機器人對自身位置的感知,最后得出較優解。
同時,遺傳算法也可以被應用于幫助神經網絡調參數,只是這種方式需要的時間太長、運算量太大,屬于性價比較低的參數調整方式。
在游戲中,也能見到遺傳算法的影子。很多游戲會有在同一場景面對多輪敵人的生存模式,在這一模式中,敵人的屬性是會不斷增強的,有了遺傳算法,就可以根據你自身屬性的變化不斷改變敵人的屬性,以增強游戲的難度。你的法術強度高,敵人就會增加法術防御度,你的攻擊穿透性高,敵人就會增加血量。這樣一來,相比直接的增加屬性,可以有更好的游戲體驗。
從騙人到寫詩,遺傳算法有什么好玩的應用?
以上都是一些適用于實際場景的應用,由于遺傳算法簡單易用,我們可以看到很多娛樂化的、有趣的應用。
比如說,模仿圖形。在一款程序中,我們可以看到遺傳算法通過幾何圖形的不斷組合,最終慢慢變成接近案例圖形的樣子。
同時你還可以親自調整變異的傾向,最終成果雖然和原圖相比還有很大差距,但也不乏自己的風格。不過嘗試時就可以發現,整個過程時間很長,某種程度上也體現了遺傳算法的低效。
基于上述的功能,遺傳算法還有一個非常有趣的玩法,庫卡機器人驅動器維修,那就是欺騙深度學習模型。
2014年有一篇論文曾經寫過,深度神經網絡(DNN)在圖片識別上有著很優異的表現。可當用遺傳算法模擬圖片時,兩張圖片在人眼看來一模一樣,可深度神經網絡卻完全識別不出來。或者遺傳算法可以模擬出一張人眼看起來是亂碼的圖片,卻被深度神經網絡識別成正常的圖片。
這一點讓人們注意到了機器視覺和人類視覺的區別,和人類不一樣,機器還是會把圖像轉化為數字,再進行比對、識別。這也導致了,有時候深度神經網絡會把一張噪聲圖識別成動物、建筑等等。
除了生成圖片,遺傳算法還可以生成音樂、宋詞等等。將詞語和音符輸入,讓機器隨機組合,加入人類評分機制。整個過程幾乎和讓猴子在打字前坐幾十年可以寫出莎翁作品的假說差不多。基本上只能用于娛樂,不太適合實操。
其實,目前遺傳算法已經慢慢淡出了主流舞臺。雖然主旨是為了避開局部最優誤區,為無限解集問題尋找答案,可在實際應用時相比梯度和蒙特卡羅算法都沒有明顯的差異和優勢,常常被視作玄學算法。比如計算結果的穩定性差、求解過程沒有可復制性等等都是遺傳算法的缺點。很長一段時間里,遺傳算法都被看做只能用來湊論文的算法。
不過理論也和技術一樣,KUKA機器人示教器維修,會隨著實踐和研究不斷發展,曾經的神經網絡也曾被打入冷宮。最近DeepMind還提出了把神經網絡和遺傳算法結合,應用到遷移學習中的案例。或許,有朝一日遺傳算法還會重新進入我們的視野。