利用遺傳編程來進化一個沿牆運動的機器人。咱們進化一個程序,此程序把機器人當前的傳感器數據做爲輸入,並計算出一個動做。咱們但願重複運行此程序來控制機器人,先把機器人從任意位置移到與牆毗鄰的一個單元中,使其永遠沿牆移動。編程
此程序的基本函數包括:四個布爾函數——and、or、not 和 if;四個動做——東南西北。這幾個布爾函數的定義以下:函數
和以前的傳感器同樣,這裏咱們將周圍的八個位置的用n,ne,e,se,s,sw,w和nw表示。當相應的單元空缺,agent能夠採起動做移動到該單元時,輸入值爲0;不然爲1。下圖給出了一個沿牆走動的程序,同時也給出了此程序的樹狀表示。重複運行此程序將使機器人向北走到牆邊,而後順時針沿牆移動。blog
在遺傳編程的過程當中,咱們從隨機程序開始。依然是上面的機器人永遠沿牆移動的問題,咱們從5000個隨機程序開始進化一個沿牆運動的agent。每一代程序都要接受評估,只有當某個程序的表現讓人比較滿意時纔在此基礎上產生新一代程序。基礎
評估方法程序
咱們能夠將一個程序運行60次,並計算在這60次中被訪問的與牆毗鄰的單元個數(共有32個單元是貼牆的,一次都沒有沿牆行走的計數爲0,理想狀態計數32)。而後,讓機器人分別在10個隨機選擇的不一樣初始位置開始執行程序。在這10個運行中被訪問的與牆批零的單元總數即爲該程序的「合理度」。可能的合理度最高值爲320。方法
第i代按照如下方法構造第i+1代im
把第i代的500個程序(10%)直接複製到第i+1代。用「錦標賽選拔」過程來選擇這500個程序:從5000個程序中隨機選出7個,在從中選擇最適合的一個。nw
把4500個新的「孩子」程序(90%)納入第i+1代。每個孩子程序經過如下「交叉」操做由母親程序和父親程序共同產生出來:這些雙親程序均從第i代的錦標賽選拔中選出,把母親程序中一個隨機選擇的子樹替換爲父親程序中一個隨機選擇的子樹,便獲得孩子程序。如圖所示:數據
這個孩子程序的合適度可能比其雙親高,也可能低。db
有時,還須要一個「變異算子」來構造下一代個體,但它構造的下一代數目不多。這個變異算子用錦標賽選拔從第i代中選出一個單親,刪除此單親程序中隨機選擇的子樹並替換一個新成長的隨機子樹。
在構造下一代的過程當中,要設置幾個任意參數,包括直接複製的數目,交叉生產數目,參加錦標賽的程序數目以及變異百分比。實例中所用參數均爲遺傳編程專家推薦的參數。
下圖給出了0代最合適的程序(合適度爲92)
第二代的最佳程序合適度爲117,下圖展現了這個程序及其兩次典型的合適度運行表現,這個程序比0代最佳程序短,但仍被困於右下角。
到第六代,程序的最高合適度達到163。其中最佳程序可理想的沿邊界運動,依然被困在右下角。
最後直到第10代,遺傳編程過程已進化出一個能十分完美地沿牆運動的程序。下圖展現了此程序以及從不一樣起點開始的兩條路徑。此程序順時針沿牆移動,而且一開始就向南移動直至靠牆。
下圖給出每一代程序進化的合適度曲線。