交互式選擇

書(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)度?
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容