我目前正在編寫一個C語言的鍵盤佈局優化算法(例如Peter Klausler設計的算法),我想實現如此處所述的適合度選擇(PDF Link) :健身比例「輪盤」選擇的高效實現
隨着輪盤賭選擇您選擇一個基於 roullete輪模型的人口 成員。製作一個餡餅 圖表,其中成員 切片到整個圓的面積是成員適度與總人口 的比率 。正如你所看到的,圓圈的圓周上的點 是隨機挑選的那些 那些具有較高適合度的成員 將被挑選的概率較高。 這確保自然選擇需要 的地方。
問題是,我沒有看到如何有效地實現它。我想到了兩種方法:一種是不可靠的,另一種是緩慢的。
首先,緩慢之一:
對於長度爲N的鍵盤池,創建長度的數組N,其中該陣列的每個元素實際上包含兩個元素,最小和最大值。每個鍵盤都有相應的最小值和最大值,範圍取決於鍵盤的適應性。例如,如果鍵盤零有10健身,鍵盤一個具有20健身,和鍵盤二包含的25健身,它是這樣的: 代碼:
array[0][0] = 0; // minimum
array[0][1] = 9; // maximum
array[1][0] = 10;
array[1][1] = 30;
array[2][0] = 31;
array[2][1] = 55;
(在這種情況下,因爲它意味着更少的努力是必需的。)
然後生成一個隨機數。無論數字落入哪個範圍,相應的鍵盤都會被「殺死」,並被另一個鍵盤的後代取代。根據需要多次重複此操作。
問題在於它非常緩慢。完成O(N^2)操作。
下一頁快1:
首先弄清楚什麼對鍵盤的最低和最高的適應度是。然後在(最低健身)和(最高健身)之間生成一個隨機數,並殺死所有鍵盤的適應度高於生成的數字。這是有效的,但不能保證只殺死一半的鍵盤。它也有一些與「輪盤」選擇不同的機制,所以它甚至可能不適用。
所以問題是,什麼是有效的實現?
本書第36頁有一些有效的算法(Link),但問題是,只有在輪盤賭選擇只有一次或幾次時纔有效。有沒有什麼有效的方法可以同時做很多輪盤賭選擇?
請將代碼塊重新格式化爲代碼,並修復您的Google圖書鏈接。 – 2009-08-14 06:32:23