国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

遺傳算法解背包問(wèn)題(javascript實(shí)現(xiàn))

longshengwang / 2938人閱讀

摘要:遺傳算法物競(jìng)天擇,適者生存,遺傳算法就是借鑒生物體自然選擇和自然遺傳機(jī)制的隨機(jī)搜索算法。隨機(jī)生成的基因適應(yīng)度的最大值隨機(jī)生成,適應(yīng)度函數(shù)計(jì)算種群中所有對(duì)象的適應(yīng)度及總和,并對(duì)超出的基因進(jìn)行懲罰。

此為《算法的樂(lè)趣》讀書(shū)筆記,我用javascript(ES6)重新實(shí)現(xiàn)算法。

遺傳算法

“物競(jìng)天擇,適者生存”,遺傳算法就是借鑒生物體自然選擇和自然遺傳機(jī)制的隨機(jī)搜索算法。算法的關(guān)鍵點(diǎn)有:基因的選擇與編碼、適應(yīng)度評(píng)估函數(shù)與三個(gè)遺傳算子(選擇、交叉和變異)的設(shè)計(jì)。

0-1背包問(wèn)題

有一個(gè)背包,最多承重為C=150的物品,現(xiàn)在有7個(gè)物品,編號(hào)為1~7,重量分別是w=[35,30,60,50,40,10,25],價(jià)值分別是p=[10,40,30,50,35,40,30],現(xiàn)在從這7個(gè)物品中選擇一個(gè)或多個(gè)裝入背包,要求在物品總重量不超過(guò)C的前提下,所裝入的物品總價(jià)值最高。

代碼及思路

該算法采用屬性序列方式對(duì)基因編碼,遺傳算子則使用了比例選擇模式、多點(diǎn)交叉和均勻變異三種方式,麻雀雖小,五臟具全。

變量定義
var C = 150                            //背包最大承重
var WEIGHT = [35,30,60,50,40,10,25]    //物品重量
var POWER = [10,40,30,50,35,40,30]     //物品價(jià)值
var LEN = 7                            //基因長(zhǎng)度
var maxPower = 0                       //保存最大值方案
var maxGene = []
var maxi = 0;                          //最大值最初出現(xiàn)的進(jìn)化代數(shù)
const POPMAX = 32,                     //種群數(shù)量
    P_XOVER = 0.8,                     //遺傳概率
    P_MUTATION = 0.15,                 //變異概率
    MAXGENERATIONS = 20                //總的進(jìn)化代數(shù)
var pop = []                           //種群所有對(duì)象
基因編碼

基因由7件物品狀態(tài)組成,1表示裝入,0表示不裝入;每個(gè)個(gè)體除了基因外,還有適應(yīng)度、選擇概率和積累選擇概率。類(lèi)定義如下:

class Gene{
    constructor(gene){
        this.gene = gene;            //基因,數(shù)組
        this.fitness = 0;
        this.rf = 0;
        this.cf = 0;
    }
}
種群初始化

每個(gè)個(gè)體選擇隨機(jī)的基因,使用0,1隨機(jī)數(shù)直接填充gene數(shù)組。因?yàn)檫@個(gè)具體問(wèn)題規(guī)模較小,在選擇時(shí)我丟棄了適應(yīng)度較高的方案,以此來(lái)更好的測(cè)試算法的效果。

function initGenes(){
    let count = 0, maxFit = 100;    //隨機(jī)生成的基因適應(yīng)度的最大值
    while(count < POPMAX){
        let tmp = [],pall = 0;
        for(let j = 0; j
適應(yīng)度函數(shù)

計(jì)算種群中所有對(duì)象的適應(yīng)度及總和,并對(duì)超出C的基因進(jìn)行“懲罰”。

function envaluateFitness(max){            //max參數(shù)只是用來(lái)記錄進(jìn)化代數(shù)
    let totalFitness = 0;
    for(let i=0; i C){                    //基因不符合要求,適應(yīng)降到1,讓其自然淘汰
            pop[i].fitness = 1;
        }else{
            if(pop[i].fitness > maxPower){            //保存階段最優(yōu)值
                maxPower = pop[i].fitness;
                maxGene = __.cloneDeep(pop[i].gene);  //使用lodash庫(kù)
                maxi = max;
            }
        }
        totalFitness += pop[i].fitness
    }
    return totalFitness;
}
選擇算子函數(shù)

采用簡(jiǎn)單的輪盤(pán)賭方式進(jìn)行選擇,首先計(jì)算種群中所有個(gè)體的選擇概率和累積概率,然后利用隨機(jī)數(shù)進(jìn)行“輪盤(pán)賭”,挑出幸運(yùn)者作為新種群。這里有個(gè)坑,lodash的cloneDeep直接克隆pop會(huì)有問(wèn)題,出現(xiàn)怪異問(wèn)題,難道是我的對(duì)象層次太深,求解!

function selectBetter(totalFitness){
    let lastCf = 0;
    let newPop = []
    for(let i = 0; i= pop[j].cf && p < pop[j+1].cf){
                    newPop[i] = pop[j+1];
                    break;
                }
            }
        }
    }
    pop = []         //種群替換,坑在這,直接 pop=__.cloneDeep(newPop)不對(duì),高手給解釋下,誰(shuí)研究過(guò)lodash的源碼?
    for(let i=0; i< newPop.length; i++){    
        pop.push(__.cloneDeep(newPop[i]))
    }
}
交叉算子函數(shù)

交叉算子采用多點(diǎn)交叉策略,對(duì)兩個(gè)隨機(jī)選中的個(gè)體基因進(jìn)行交換,基因交換的位置和個(gè)數(shù)都是隨機(jī)的,使得新個(gè)體的基因更具有隨機(jī)性。

function crossover(){
    let first = -1;
    for(let i=0; i
變異算子函數(shù)

變異算子采用均勻變異的策略,選中個(gè)體基因變異的個(gè)數(shù)與位置都是隨機(jī)選擇的。

function mutation(){
    for(let i=0; i
算法主流程

主流程很簡(jiǎn)單,幾乎是線性的。

initGenes();
var f = envaluateFitness(0)
for(let i=0; i " + maxGene.join(","));
總結(jié)

以前一直覺(jué)得遺傳算法很神秘,因此仔細(xì)研究了一下,覺(jué)得算法的效果很大程度上取決于各種參數(shù)的設(shè)定。另外,也許進(jìn)化過(guò)程中出現(xiàn)過(guò)最優(yōu)值,但最后的種群中也不一定會(huì)有最優(yōu)值存在。真是能用其它方法可以解決時(shí)最好不用它,呵呵!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/79264.html

相關(guān)文章

  • 遺傳算法GA(Genetic Algorithm)入門(mén)知識(shí)梳理

    摘要:編碼需要將問(wèn)題的解編碼成字符串的形式才能使用遺傳算法。遺傳算子遺傳算法有個(gè)最基本的操作選擇,交叉,變異。實(shí)驗(yàn)發(fā)現(xiàn),比較大的種群的規(guī)模并不能優(yōu)化遺傳算法的結(jié)果。災(zāi)變遺傳算法的局部搜索能力較強(qiáng),但是很容易陷入局部極值。 一、遺傳算法進(jìn)化論背景知識(shí) 作為遺傳算法生物背景的介紹,下面內(nèi)容了解即可: 種群(Population):生物的進(jìn)化以群體的形式進(jìn)行,這樣的一個(gè)群體稱為種群。 個(gè)體:組成...

    gxyz 評(píng)論0 收藏0
  • Python遺傳算法框架DEAP-Creating Types

    摘要:是一個(gè)遺傳算法框架,這里是它的簡(jiǎn)介。最小化問(wèn)題使用負(fù)值的的最大化問(wèn)題用正值。略種群種群橫線個(gè)體。這個(gè)種群是直接使用和函數(shù)來(lái)初始化的。個(gè)體之間分布在網(wǎng)格中每個(gè)格子包含一個(gè)個(gè)體。調(diào)用將會(huì)返回一個(gè)種群,個(gè)體是使用兩個(gè)索引可獲得的。 DEAP是一個(gè)python遺傳算法框架,這里是它的簡(jiǎn)介。DEAP documentation今天整理一下DEAP的概覽,大體了解一下它的流程。初學(xué),不嚴(yán)謹(jǐn),僅作為...

    Channe 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<