書(shū)名:代碼本色:用編程模擬自然系統(tǒng)
作者:Daniel Shiffman
譯者:周晗彬
ISBN:978-7-115-36947-5
第9章目錄
9.12 交互式選擇
- 交互式選擇:適應(yīng)度由用戶(hù)確定的遺傳算法。
1、評(píng)分系統(tǒng)
-
為了展示這種技術(shù),我們打算創(chuàng)建一個(gè)由表情構(gòu)成的種群。每個(gè)表情都有一系列屬性:頭的大小、頭的顏色、眼睛的位置、眼睛的大小、嘴的顏色、嘴的位置、嘴的寬度以及嘴的高度。
表情的DNA(基因型)是介于0~1的浮點(diǎn)數(shù)組。表情的每個(gè)屬性都對(duì)應(yīng)著數(shù)組的某個(gè)元素。
class DNA {
float[] genes;
int len = 20; 為了畫(huà)出這張臉,我們需要20個(gè)基因
DNA() {
genes = new float[len];
for (int i = 0; i < genes.length; i++) {
genes[i] = random(0,1); 每個(gè)基因都是介于0~1的隨機(jī)浮點(diǎn)數(shù)
}
}
}
- 表現(xiàn)型是Face類(lèi),其中包含一個(gè)DNA實(shí)例。
class Face {
DNA dna;
float fitness;
- 接下來(lái)要在屏幕上繪制表情,我們可以用Processing的map()函數(shù)將基因信息轉(zhuǎn)化為合適的像素值或顏色值。(在本例中,我們還會(huì)用colorMode()函數(shù)將RGB范圍設(shè)置為0~1。)
void display() {
float r = map(dna.genes[0],0,1,0,70); 用map()函數(shù)將基因轉(zhuǎn)化為繪制參數(shù)
color c = color(dna.genes[1],dna.genes[2],dna.genes[3]);
float eye_y = map(dna.genes[4],0,1,0,5);
float eye_x = map(dna.genes[5],0,1,0,10);
float eye_size = map(dna.genes[5],0,1,0,10);
color eyecolor = color(dna.genes[4],dna.genes[5],dna.genes[6]);
color mouthColor = color(dna.genes[7],dna.genes[8],dna.genes[9]);
float mouth_y = map(dna.genes[5],0,1,0,25);
float mouth_x = map(dna.genes[5],0,1,-25,25);
float mouthw = map(dna.genes[5],0,1,0,50);
float mouthh = map(dna.genes[5],0,1,0,10);
}
到目前為止,我們一直在做前面已經(jīng)做過(guò)的事。
但這里會(huì)有一點(diǎn)不同:我們不打算實(shí)現(xiàn)fitness()函數(shù),也不打算用某個(gè)數(shù)學(xué)公式計(jì)算表情的適應(yīng)度;
相反,我們打算讓用戶(hù)自己確定適應(yīng)度函數(shù)。如何用最佳方式讓用戶(hù)確定適應(yīng)度是交互設(shè)計(jì)方面的問(wèn)題,這不在本書(shū)的討論范圍。
因此我們不會(huì)討論如何寫(xiě)一個(gè)滑動(dòng)條控件,也不會(huì)討論如何實(shí)現(xiàn)一個(gè)用于打分的硬件,或創(chuàng)建一個(gè)Web應(yīng)用專(zhuān)門(mén)讓用戶(hù)提交在線分?jǐn)?shù)。用什么樣的方式獲得適應(yīng)度分值應(yīng)該由你自己決定,同時(shí)也取決于應(yīng)用的具體類(lèi)型。為了實(shí)現(xiàn)簡(jiǎn)單的演示功能,我們打算用以下方式獲取適應(yīng)度分值:當(dāng)鼠標(biāo)在某個(gè)表情上停留越久,它的適應(yīng)度就越高。當(dāng)用戶(hù)點(diǎn)擊“evolve next generation”按鈕時(shí),我們就為他創(chuàng)建下一代表情。
讓我們來(lái)看看遺傳算法的各個(gè)步驟如何應(yīng)用在主標(biāo)簽程序中。我們要注意:適應(yīng)度由鼠標(biāo)操作決定,下一代的創(chuàng)建由按鈕觸發(fā)。
2、示例代碼9-4 交互式選擇
Population population;
Button button;
void setup() {
size(780,200);
float mutationRate = 0.05;
population = new Population(mutationRate,10);
button = new Button(15,150,160,20, "evolve new generation");
}
void draw() {
population.display();
population.rollover(mouseX,mouseY); 將鼠標(biāo)位置傳入population對(duì)象的rollover()函數(shù),以
button.display();
}
void mousePressed() {
if (button.clicked(mouseX,mouseY)) { 一旦按鈕被按下,就通過(guò)選擇和繁殖創(chuàng)建下一代
population.selection();
population.reproduction();
}
}
- 注意:本例只是交互式選擇的演示程序,并不能實(shí)現(xiàn)具有實(shí)際意義的結(jié)果。
- 首先,我們沒(méi)有花心思設(shè)計(jì)表情的外形,這些表情只是由簡(jiǎn)單圖形和顏色構(gòu)成的。
- 還有個(gè)關(guān)鍵問(wèn)題,那就是時(shí)間。在自然界,進(jìn)化的過(guò)程要花費(fèi)數(shù)百萬(wàn)年。在電腦模擬的世界里,我們用某種特定的算法創(chuàng)建新一代,整個(gè)進(jìn)化過(guò)程進(jìn)行地很快。
由于適應(yīng)度值是根據(jù)數(shù)學(xué)公式計(jì)算出來(lái)的,我們還可以引入更大的樣本,加快進(jìn)化速度。然而,在交互式選擇中,我們必須等待用戶(hù)對(duì)種群的每個(gè)個(gè)體進(jìn)行評(píng)分,評(píng)分完成后才能產(chǎn)生下一代。如果種群太大,用戶(hù)會(huì)覺(jué)得很無(wú)聊,而且用戶(hù)也沒(méi)有耐心經(jīng)歷太多子代! - 成功構(gòu)建交互式選擇系統(tǒng)的關(guān)鍵在于遺傳算法。遺傳算法的幾個(gè)關(guān)
鍵點(diǎn):什么是基因型和表現(xiàn)型;如何計(jì)算適應(yīng)度。在交互式選擇中,第二個(gè)問(wèn)題應(yīng)該改為:如何在用戶(hù)的交互過(guò)程中獲取適應(yīng)度?

