青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 12,  comments - 54,  trackbacks - 0
1. 遺傳算法的數據結構

大致畫了下數據結構的邏輯圖,如下:




















參加生存競爭的整個群體稱為種群(Population),種群中所有參與進化的個體(Chromosome)的數量一般為一個定值,而每個個體可能含有多于一個基因(Gene)。

例如,求解一個Camel函數在區間-100<x,y<100上邊的最小值:
f(x,y)=[4 - 2.1(x^2) + (x^3)/3](x^2) + xy +[-4 +4(y^2)](y^2)
這時候就需要兩個基因,每個基因上限是100,下限是-100.

假設數值求解的精度為10^(-7),那么對應的二進制編碼長度N可以這樣確定
(2^N)-1 >= [ 100 - ( -100 ) ] / [ 10^(-7) ]
于是,將一個十進制數字x轉化為二進制
x' = [x- (-100)] * [(2^N) -1] / [ 100 - ( -100 ) ]
同樣,也可以將一個二進制數字x'轉化為十進制數字x

程序中,數據結構可以這樣定義
 1 struct Gene
 2 {
 3     long double Upper;                      //upper boundary of the value
 4     long double Lower;                      //lower boundary of the value
 5     long double Value;                      //decimal value of the gene
 6     std :: vector< int > Binary_Array;      //binary form of the value
 7     long double Accuracy;                   //accuracy of the value
 8 };
 9 
10 struct Chromosome
11 {
12     std :: vector< Gene > Gene_Array;   //Gene[]
13     long double Fitness;                //the weigh of the chromosome in ga
14 };
15 
16 struct Population
17 {
18     std :: vector< Chromosome > Chromosome_Array;   //Chromosome[]
19    
20     long double Mutation_Probability;               //probability of mutation
21     long double Crossover_Probability;              //probability of crossover
22 };

2. 與數據結構相關的基本算法


1) 基因的自動初始化 --在搜索區間中隨機生成初始基因
     
 1 //generate random value
 2 void initialize( Gene& g)
 3 {
 4     const long double Ran = ran();
 5     const long double Upper = g.Upper;
 6     const long double Lower = g.Lower;
 7     //const long double Accuracy = g.Accuracy;
 8     assert( Upper > Lower );
 9 
10     g.Value = Lower + Ran * ( Upper - Lower );
11 }
12 

2) 基因的二進制編碼--將十進制數據編碼為二進制
 1 //decimal value -> binary form
 2 void encoding( Gene& g )
 3 {
 4     const long double Value = g.Value;
 5     const long double Upper = g.Upper;
 6     const long double Lower = g.Lower;
 7     const long double Accuracy = g.Accuracy;
 8 
 9     unsigned int Size = 1                       +
10     static_cast< unsigned int >
11     (
12         log( ( Upper - Lower ) / ( Accuracy ) ) /
13         log( 2.0 )
14     );
15 
16     if ( Size > 63 )
17         Size = 63;
18 
19     const unsigned long long Max = 1 << Size;
20 
21     unsigned long long x =
22     static_cast< unsigned long long >
23     (
24         static_cast< long double>( Max -1 )     *
25         ( Value - Lower )                       /
26         ( Upper - Lower )
27     );
28 
29     std :: vector<int> Binary_Array;
30 
31     for ( unsigned int i = 0; i <= Size; ++i )
32     {
33         if ( x & 1 )    //case odd
34         {
35             Binary_Array.push_back( 1 );
36         }
37         else            //case even
38         {
39             Binary_Array.push_back( 0 );
40         }
41         x >>= 1;
42     }
43 
44     g.Binary_Array = Binary_Array;
45 
46 }
47 

3)二進制向十進制的解碼--將二進制數據解碼為十進制
 1 //binary form -> decimal value
 2 void decoding( Gene& g )
 3 {
 4     const unsigned int Size = g.Binary_Array.size();
 5     assert( Size > 0 );
 6 
 7     const long double Upper = g.Upper;
 8     const long double Lower = g.Lower;
 9     //const long double Accuracy = g.Accuracy;
10     const std::vector<int> Binary_Array = g.Binary_Array;
11 
12     const unsigned long long Max = 1 << Size;
13     unsigned long long x = 0;
14 
15     for( unsigned int i = Size; i > 0--i )
16     {
17         x += Binary_Array[i-1];
18         x <<= 1;
19     }
20     //x += Binary_Array[0];
21 
22     const long double Value = Lower         +
23         static_cast<long double>( x )       /
24         static_cast<long double>( Max - 1 ) *
25         ( Upper - Lower );
26 
27     g.Value = Value;
28 }

4)普通二進制編碼轉到格雷碼
多說一點,在進行二進制交叉的時候,使用格雷碼比普通的二進制編碼要有效一點。
例如,如果采用普通二進制編碼,8可以表示為1000,而7則表示為0111,四個位都是不同的,7與8僅僅相差了1,但是普通二進制編碼卻相差了這么多,如果對他們進行交叉的話,出來的結果偏離7與8實在太遠了,而使用格雷碼則可以避免這種尷尬。
這里(http://baike.baidu.com/view/358724.htm)是百度一個有關格雷碼的介紹,我就不復制了,有興趣的話過去看看。

 1 //Normal Binary Form --> Gray Binary Form
 2 void normal2gray( Gene& g )
 3 {
 4     const unsigned int Size = g.Binary_Array.size();
 5     assert( Size > 0 );
 6 
 7     std :: vector<int> G_Binary_Array;      //gray code
 8     const std :: vector<int> Binary_Array = g.Binary_Array;
 9 
10     G_Binary_Array.push_back( Binary_Array[0] );
11     for ( unsigned int i = 1; i < Size; ++i )
12     {
13         G_Binary_Array.push_back( ( Binary_Array[i-1+ Binary_Array[i] ) & 1 );
14     }
15     g.Binary_Array = G_Binary_Array;
16 }
17 

5) 格雷碼轉換到普通二進制編碼
 1 //Gray Binary Form --> Normal Binary Form
 2 void normal2binary( Gene& g )
 3 {
 4     const unsigned int Size = g.Binary_Array.size();
 5     assert( Size > 0 );
 6 
 7     std :: vector<int> N_Binary_Array;  //Normal Binary Form
 8     const std :: vector<int> Binary_Array = g.Binary_Array;
 9 
10     unsigned int result = 0;
11     for ( unsigned int i = 0; i < Size; ++i )
12     {
13         result += Binary_Array[i];
14         N_Binary_Array.push_back( result & 1 );
15     }
16 
17     g.Binary_Array = N_Binary_Array;
18 }
19 
20 

6) 進化種群初始化函數一 -- 生成進化個體
 1 void initialize(    Population& population,
 2                     const unsigned int size
 3                 )
 4 {
 5     Chromosome* chromosome = new Chromosome;
 6 
 7     population.Generation = 1;
 8 
 9     for ( unsigned int i = 0; i < size; ++i )
10     {
11 
12         population.Chromosome_Array.push_back( *chromosome );
13     }
14 
15     delete chromosome;
16 }
17 

7) 進化種群初始化函數二 -- 對種群中的每個個體,初始化其基因
      如上邊的Camel函數,因為里邊有兩個自變量需要搜索,那么需要調用這個函數兩次,分別對應于x和y
       append_gene( p, 100, -100, 1E-7);
       append_gene( p, 100, -100, 1E-7);
 1 void append_gene(   Population& population,
 2                     const long double& upper,
 3                     const long double& lower,
 4                     const long double& accuracy
 5                 )
 6 {
 7     assert( upper > lower );
 8     assert( accuracy > 0 );
 9 
10     Gene* gene = new Gene;
11 
12     gene -> Upper = upper;
13     gene -> Lower = lower;
14     gene -> Accuracy = accuracy;
15 
16     const unsigned int Size = population.Chromosome_Array.size();
17     for ( unsigned int i = 0; i < Size; ++i )
18     {
19         initialize( *gene );
20         population.Chromosome_Array[i].Gene_Array.push_back( *gene );
21     }
22 
23     delete gene;
24 }
25 

8) 搜尋最佳適應度個體 -- 進化到指定年代后,找出最佳個體
 1 const std :: vector< long double > elite( const Population& population )
 2 {
 3     const unsigned int Size = population.Chromosome_Array.size();
 4     assert( Size > 0 );
 5     long double max = population.Chromosome_Array[0].Fitness;
 6     unsigned int index = 0;
 7     for ( unsigned int i = 1; i < Size; ++i )
 8     {
 9         if ( population.Chromosome_Array[i].Fitness > max )
10         {
11             index = i;
12             max = population.Chromosome_Array[i].Fitness;
13         }
14     }
15 
16     std :: vector<long double> Elite;
17     const unsigned int G_Size = population.Chromosome_Array[0].Gene_Array.size();
18     for ( unsigned int i = 0; i < G_Size; ++i )
19         Elite.push_back( population.Chromosome_Array[index].Gene_Array[i].Value );
20 
21     return Elite;
22 }

9) 隨機函數
由于遺傳算法是一種隨機搜索算法,執行的時候需要大量的隨機數(記得之前搜索四個未知數,種群100個體,進化800代,大概整個運行過程用了10^10數量級的隨機數),庫里的隨機數生成函數肯定不行。當前使用了一個Kruth推薦的(Kruth, D. E. 1997, Seminumerical Algorithms, vol2. $3)、基于相減方法的隨機數生成算法,比基于線性同余方法的快一點。
 1 #include <ctime>
 2 
 3 static long double _ran( int& seed );
 4 
 5 long double ran()
 6 {
 7     static int seed = static_cast < unsigned int >( time( NULL ) );
 8     return _ran( seed );
 9 }
10 
11 static long double _ran( int& seed )
12 {
13 
14     const int MBIG = 1000000000;
15     const int MSEED = 161803398;
16     const int MZ = 0;
17     const long double FAC = 1.0E-9L;
18 
19     static int inext, inextp;
20     static long ma[56];
21     static int iff = 0;
22     long mj, mk;
23     int i, ii, k;
24 
25     if ( seed < 0 || iff == 0)
26     {
27         iff = 1;
28         mj = MSEED - (seed < 0 ? -seed : seed);
29         mj %= MBIG;
30         ma[55= mj;
31         mk = 1;
32         for (i = 1; i <= 54; i++) {
33             ii = (21 * i) % 55;
34             ma[ii] = mk;
35             mk = mj - mk;
36             if (mk < MZ)
37                 mk += MBIG;
38             mj = ma[ii];
39         }
40         for (k = 1; k <= 4; k++)
41             for (i = 1; i <= 55; i++)
42             {
43                 ma[i] -= ma[1 + (i + 30% 55];
44                 if (ma[i] < MZ)
45                     ma[i] += MBIG;
46             }
47         inext = 0;
48         inextp = 31;
49         seed = 1;
50     }
51     if (++inext == 56)
52         inext = 1;
53     if (++inextp == 56)
54         inextp = 1;
55     mj = ma[inext] - ma[inextp];
56     if (mj < MZ)
57         mj += MBIG;
58     ma[inext] = mj;
59     return mj * FAC;
60 }
61 
62 







posted on 2008-06-16 16:53 Wang Feng 閱讀(2949) 評論(0)  編輯 收藏 引用 所屬分類: Numerical C++

<2008年6月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用鏈接

留言簿(4)

隨筆分類

隨筆檔案

Link List

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美a级在线| 亚洲剧情一区二区| 欧美午夜精品久久久| 在线视频欧美一区| 欧美成年人网站| 一本一本久久a久久精品综合麻豆| 久久精品国产综合| 久久成人一区| 91久久精品美女| 亚洲精品视频在线| 国产精品一区二区久久久久| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲国产日韩在线| 麻豆成人在线观看| 欧美国产精品劲爆| 亚洲欧美成人综合| 欧美专区日韩专区| 99国产精品久久久久久久| 最新日韩精品| 国产精品人人爽人人做我的可爱| 午夜精品免费视频| 欧美国产一区视频在线观看| 一区二区三区四区五区在线 | 国产精品一卡二| 亚洲国产欧美久久| 日韩视频二区| 狠狠爱www人成狠狠爱综合网| 亚洲国产成人在线播放| 国产精品久久久一区麻豆最新章节| 久久大香伊蕉在人线观看热2| 麻豆9191精品国产| 午夜精品亚洲| 国产精品欧美一区二区三区奶水| 免费精品99久久国产综合精品| 国产精品久久久久久久久免费桃花 | 欧美体内she精视频| 久久精品一本久久99精品| 欧美日韩国产bt| 欧美护士18xxxxhd| 亚洲电影免费观看高清| 久久xxxx| 久久另类ts人妖一区二区| 国产精品嫩草久久久久| 日韩小视频在线观看| 99在线观看免费视频精品观看| 久久久综合网站| 巨乳诱惑日韩免费av| 精品二区视频| 亚洲视频欧美视频| 欧美一区二区三区四区在线观看地址 | 国产欧美日韩视频一区二区| 91久久国产综合久久蜜月精品 | 久久久久久色| 老司机凹凸av亚洲导航| 黄网站色欧美视频| 久久噜噜噜精品国产亚洲综合| 久久不射电影网| 亚洲高清不卡| 国产精品久久久一区二区| 欧美一区二区三区四区高清| 欧美在线观看视频一区二区三区| 欧美午夜精品理论片a级按摩| 亚洲欧美成人在线| 亚洲国产精品高清久久久| 中文精品视频一区二区在线观看| 欧美精品成人一区二区在线观看 | 久久裸体视频| 99伊人成综合| 欧美大成色www永久网站婷| 一本色道久久综合一区| 黄色日韩网站视频| 国产精品久久久对白| 欧美成年人在线观看| 欧美自拍偷拍| 午夜精品一区二区三区四区 | 久久久久久久久久久久久久一区| 亚洲国产视频一区| 欧美成人午夜视频| 久久精品国产亚洲一区二区三区 | 午夜综合激情| 午夜伦欧美伦电影理论片| 日韩视频免费观看高清完整版| 国产精品一区二区久久久久| 欧美黄污视频| 久久9热精品视频| 久久女同精品一区二区| 久久成人免费网| 久久久999| 开心色5月久久精品| 久久亚洲精选| 欧美激情国产高清| 亚洲日本激情| 99综合精品| 午夜精品久久一牛影视| 久久久美女艺术照精彩视频福利播放| 午夜精品美女自拍福到在线| 亚洲免费在线视频| 久久久久久高潮国产精品视| 久久亚洲电影| 国产精品大片wwwwww| 国产午夜精品理论片a级探花| 好看不卡的中文字幕| 亚洲美女黄色| 一区二区免费在线观看| 欧美一区二区在线免费观看| 日韩视频专区| 久久久91精品国产一区二区三区| 久久亚洲综合| 国产视频一区在线| 日韩视频免费在线| 美女主播精品视频一二三四| 99re热这里只有精品免费视频| 亚洲综合色激情五月| 欧美日韩不卡视频| 亚洲国产日韩欧美| 久久久久在线| 午夜精品久久久久| 欧美日韩精品在线观看| 亚洲国产精品久久| 久久久久久久91| 亚洲欧美国产视频| 国产精品高清一区二区三区| 亚洲级视频在线观看免费1级| 欧美一区二区三区婷婷月色| aa成人免费视频| 欧美区日韩区| 久久亚洲影音av资源网| 亚洲欧洲综合另类| 亚洲精品影院在线观看| 久久人人97超碰精品888| 欧美一区三区二区在线观看| 西瓜成人精品人成网站| 久久国产精品久久精品国产| 欧美一区二区三区在线播放| 午夜精品一区二区三区在线视| 99国产成+人+综合+亚洲欧美| 国产自产在线视频一区| 亚洲国产日日夜夜| 亚洲视频播放| 久久久国产精品亚洲一区 | 国产精品免费一区二区三区在线观看 | 亚洲日韩欧美视频| 亚洲曰本av电影| 欧美大片在线看| 亚洲一级一区| 欧美日韩大陆在线| 亚洲国产精品久久久久| 午夜欧美大尺度福利影院在线看| 久久久在线视频| 中文一区二区| 久久午夜精品一区二区| 欧美日韩欧美一区二区| 国产精品色午夜在线观看| 国产日韩视频| 亚洲美女精品一区| 欧美在线观看www| 日韩一级在线| 另类av导航| 香蕉亚洲视频| 久久久999精品免费| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲欧美综合国产精品一区| 国产日韩欧美日韩| 亚洲一区二区三区高清| 亚洲国产成人tv| 久久久久久久波多野高潮日日| 欧美日韩亚洲一区二区三区在线 | 久久久精品一品道一区| 久久九九热re6这里有精品| 亚洲精品久久在线| 久久人体大胆视频| 亚洲国产精品成人| 欧美福利视频在线观看| 久久国产精品一区二区三区| 欧美日韩天堂| 一区二区三区日韩精品| 99re成人精品视频| 国产精品高潮呻吟久久av黑人| 欧美a级片网站| 夜夜嗨av一区二区三区中文字幕| 久久精品国产久精国产爱| 久久aⅴ乱码一区二区三区| 国产欧美婷婷中文| 欧美韩日一区二区| 久久网站免费| 久久久美女艺术照精彩视频福利播放 | 嫩草国产精品入口| 99亚洲视频| 久久久久一区二区三区四区| 亚洲精品日韩久久| 亚洲综合视频一区| 亚洲黄色成人| 一本久道久久综合婷婷鲸鱼| 国产精品成人在线| 麻豆国产va免费精品高清在线| 免费欧美网站| 美女视频网站黄色亚洲| 欧美韩国一区| 在线一区二区三区四区| 国内自拍一区|