• <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>

            振動理論

            我的C++實現之路

            C++遺傳算法源程序

            // CMVSOGA.h : main header file for the CMVSOGA.cpp
            ////////////////////////////////////////////////////////////////////
            /////                                                          /////
            /////                沈陽航空工業學院 動力工程系               /////
            /////                       作者:李立新                       /////
            /////                   完成日期:2006.08.02                   /////
            /////                   修改日期:2007.04.10                                       /////
            ////////////////////////////////////////////////////////////////////

            #if !defined(AFX_CMVSOGA_H__45BECA_61EB_4A0E_9746_9A94D1CCF767__INCLUDED_)
            #define AFX_CMVSOGA_H__45BECA_61EB_4A0E_9746_9A94D1CCF767__INCLUDED_

            #if _MSC_VER > 1000
            #pragma once
            #endif // _MSC_VER > 1000
            #include "Afxtempl.h"
            #define variablenum 14
            class CMVSOGA
            {
            public:
             CMVSOGA();
             ~CMVSOGA();
             void selectionoperator();
             void crossoveroperator();
             void mutationoperator();
             void initialpopulation(int, int ,double ,double,double *,double *);           //種群初始化
             void generatenextpopulation();          //生成下一代種群
             void evaluatepopulation();           //評價個體,求最佳個體
             void calculateobjectvalue();          //計算目標函數值
             void calculatefitnessvalue();          //計算適應度函數值
             void findbestandworstindividual();         //尋找最佳個體和最差個體
             void performevolution();   
             void GetResult(double *);
             void GetPopData(CList <double,double>&);
             void SetFitnessData(CList <double,double>&,CList <double,double>&,CList <double,double>&);
            private:
             struct individual
             {
              double chromosome[variablenum];         //染色體編碼長度應該為變量的個數
              double value;        
              double fitness;             //適應度
             };
             double variabletop[variablenum];         //變量值
             double variablebottom[variablenum];         //變量值
             int popsize;              //種群大小
            // int generation;              //世代數
             int best_index;  
             int worst_index;
             double crossoverrate;            //交叉率
             double mutationrate;            //變異率
             int maxgeneration;             //最大世代數
             struct individual bestindividual;         //最佳個體
             struct individual worstindividual;         //最差個體
             struct individual current;              //當前個體
             struct individual current1;              //當前個體
             struct individual currentbest;          //當前最佳個體
             CList <struct individual,struct individual &> population;   //種群
             CList <struct individual,struct individual &> newpopulation;  //新種群
             CList <double,double> cfitness;          //存儲適應度值
             //怎樣使鏈表的數據是一個結構體????主要是想把種群作成鏈表。節省空間。
            };
            #endif

             

            執行文件:

            // CMVSOGA.cpp : implementation file
            //

            #include "stdafx.h"
            //#include "vld.h"
            #include "CMVSOGA.h"
            #include "math.h"
            #include "stdlib.h"


            #ifdef _DEBUG
            #define new DEBUG_NEW
            #undef THIS_FILE
            static char THIS_FILE[] = __FILE__;
            #endif
            /////////////////////////////////////////////////////////////////////////////
            // CMVSOGA.cpp
            CMVSOGA::CMVSOGA()
            {
             best_index=0;  
             worst_index=0;
             crossoverrate=0;            //交叉率
             mutationrate=0;            //變異率
             maxgeneration=0;
            }
            CMVSOGA::~CMVSOGA()
            {
             best_index=0;  
             worst_index=0;
             crossoverrate=0;            //交叉率
             mutationrate=0;            //變異率
             maxgeneration=0;
             population.RemoveAll();   //種群
             newpopulation.RemoveAll();  //新種群
             cfitness.RemoveAll(); 
            }
            void CMVSOGA::initialpopulation(int ps, int gen ,double cr ,double mr,double *xtop,double *xbottom)  //第一步,初始化。
            {
             //應該采用一定的策略來保證遺傳算法的初始化合理,采用產生正態分布隨機數初始化?選定中心點為多少?
             int i,j;
             popsize=ps;
             maxgeneration=gen;
             crossoverrate=cr;
             mutationrate =mr;
             for (i=0;i<variablenum;i++)
             {
              variabletop[i] =xtop[i];
              variablebottom[i] =xbottom[i];
             }
             //srand( (unsigned)time( NULL ) );  //尋找一個真正的隨機數生成函數。
             for(i=0;i<popsize;i++)
             { 
              for (j=0;j<variablenum ;j++)
              {
               current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];
              }
              current.fitness=0;
              current.value=0;
              population.InsertAfter(population.FindIndex(i),current);//除了初始化使用insertafter外,其他的用setat命令。
             }
            }
            void CMVSOGA::generatenextpopulation()//第三步,生成下一代。
            {
             //srand( (unsigned)time( NULL ) );
             selectionoperator();
             crossoveroperator();
             mutationoperator();
            }
            //void CMVSOGA::evaluatepopulation()   //第二步,評價個體,求最佳個體
            //{
            // calculateobjectvalue();
            // calculatefitnessvalue();   //在此步中因該按適應度值進行排序.鏈表的排序.
            // findbestandworstindividual();
            //}
            void CMVSOGA:: calculateobjectvalue()  //計算函數值,應該由外部函數實現。主要因為目標函數很復雜。
            {
             int i,j;
                double x[variablenum];
             for (i=0; i<popsize; i++)
             {
              current=population.GetAt(population.FindIndex(i)); 
              current.value=0;
              //使用外部函數進行,在此只做結果的傳遞。
              for (j=0;j<variablenum;j++)
              {
               x[j]=current.chromosome[j];
               current.value=current.value+(j+1)*pow(x[j],4);
              }
              ////使用外部函數進行,在此只做結果的傳遞。
              population.SetAt(population.FindIndex(i),current);
             }
            }

            void CMVSOGA::mutationoperator()  //對于浮點數編碼,變異算子的選擇具有決定意義。
                      //需要guass正態分布函數,生成方差為sigma,均值為浮點數編碼值c。
            {
            // srand((unsigned int) time (NULL));
             int i,j;
             double r1,r2,p,sigma;//sigma高斯變異參數
             
             for (i=0;i<popsize;i++)
             {
              current=population.GetAt(population.FindIndex(i));

              //生成均值為current.chromosome,方差為sigma的高斯分布數
              for(j=0; j<variablenum; j++)
              {   
               r1 = double(rand()%10001)/10000;
               r2 = double(rand()%10001)/10000;
               p = double(rand()%10000)/10000;
               if(p<mutationrate)
               {
                double sign;
                sign=rand()%2;
                sigma=0.01*(variabletop[j]-variablebottom [j]);
                //高斯變異
                if(sign)
                {
                 current.chromosome[j] = (current.chromosome[j]
                  + sigma*sqrt(-2*log(r1)/0.4323)*sin(2*3.1415926*r2));
                }
                else
                {
                 current.chromosome[j] = (current.chromosome[j]
                  - sigma*sqrt(-2*log(r1)/0.4323)*sin(2*3.1415926*r2));
                }
                if (current.chromosome[j]>variabletop[j])
                {
                 current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];
                }
                if (current.chromosome[j]<variablebottom [j])
                {
                 current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];
                }
               }
              }
              population.SetAt(population.FindIndex(i),current);
             }
            }
            void CMVSOGA::selectionoperator()   //從當前個體中按概率選擇新種群,應該加一個復制選擇,提高種群的平均適應度
            {
             int i,j,pindex=0;
             double p,pc,sum;
             i=0;
             j=0;
             pindex=0;
             p=0;
             pc=0;
             sum=0.001;
             newpopulation.RemoveAll();
             cfitness.RemoveAll();
              //鏈表排序
            // population.SetAt (population.FindIndex(0),current); //多余代碼
             for (i=1;i<popsize;i++)
             { 
              current=population.GetAt(population.FindIndex(i));
              for(j=0;j<i;j++)   //從小到大用before排列。
              {
               current1=population.GetAt(population.FindIndex(j));//臨時借用變量
               if(current.fitness<=current1.fitness)  
               {
                population.InsertBefore(population.FindIndex(j),current);
                population.RemoveAt(population.FindIndex(i+1));
                break;
               }
              }
            //  m=population.GetCount();
             }
             //鏈表排序
             for(i=0;i<popsize;i++)//求適應度總值,以便歸一化,是已經排序好的鏈。
             {
              current=population.GetAt(population.FindIndex(i)); //取出來的值出現問題.
              sum+=current.fitness;
             }
             for(i=0;i<popsize; i++)//歸一化
             {
              current=population.GetAt(population.FindIndex(i)); //population 有值,為什么取出來的不正確呢??
              current.fitness=current.fitness/sum;
              cfitness.InsertAfter (cfitness .FindIndex(i),current.fitness);
             }
             
             for(i=1;i<popsize; i++)//概率值從小到大;
             {
              current.fitness=cfitness.GetAt (cfitness.FindIndex(i-1))
               +cfitness.GetAt(cfitness.FindIndex(i));   //歸一化
              cfitness.SetAt (cfitness .FindIndex(i),current.fitness);
              population.SetAt(population.FindIndex(i),current);
             }
             for (i=0;i<popsize;)//輪盤賭概率選擇。本段還有問題。
             {
              p=double(rand()%999)/1000+0.0001;  //隨機生成概率
              pindex=0;  //遍歷索引
              pc=cfitness.GetAt(cfitness.FindIndex(1));  //為什么取不到數值???20060910
              while(p>=pc&&pindex<popsize) //問題所在。
              {
               pc=cfitness.GetAt(cfitness .FindIndex(pindex));
               pindex++;
              }
              //必須是從index~popsize,選擇高概率的數。即大于概率p的數應該被選擇,選擇不滿則進行下次選擇。
              for (j=popsize-1;j<pindex&&i<popsize;j--)
              {
               newpopulation.InsertAfter (newpopulation.FindIndex(0),
                population.GetAt (population.FindIndex(j)));
               i++;
              }
             }
             for(i=0;i<popsize; i++)
             {
              population.SetAt (population.FindIndex(i),
               newpopulation.GetAt (newpopulation.FindIndex(i)));
             }
            // j=newpopulation.GetCount();
            // j=population.GetCount();
             newpopulation.RemoveAll();
            }

            //current   變化后,以上沒有問題了。


            void CMVSOGA:: crossoveroperator()   //非均勻算術線性交叉,浮點數適用,alpha ,beta是(0,1)之間的隨機數
                      //對種群中兩兩交叉的個體選擇也是隨機選擇的。也可取beta=1-alpha;
                      //current的變化會有一些改變。
            {
             int i,j;
             double alpha,beta;
             CList <int,int> index;
             int point,temp;
             double p;
            // srand( (unsigned)time( NULL ) );
             for (i=0;i<popsize;i++)//生成序號
             {
              index.InsertAfter (index.FindIndex(i),i);
             }
             for (i=0;i<popsize;i++)//打亂序號
             {
              point=rand()%(popsize-1);
              temp=index.GetAt(index.FindIndex(i));
              index.SetAt(index.FindIndex(i),
               index.GetAt(index.FindIndex(point)));  
              index.SetAt(index.FindIndex(point),temp);
             }
             for (i=0;i<popsize-1;i+=2)
             {//按順序序號,按序號選擇兩個母體進行交叉操作。
              p=double(rand()%10000)/10000.0;
              if (p<crossoverrate)
              {  
               alpha=double(rand()%10000)/10000.0;
               beta=double(rand()%10000)/10000.0;
               current=population.GetAt(population.FindIndex(index.GetAt(index.FindIndex(i))));
               current1=population.GetAt(population.FindIndex(index.GetAt(index.FindIndex(i+1))));//臨時使用current1代替
               for(j=0;j<variablenum;j++)
               { 
                //交叉
                double sign;
                sign=rand()%2;
                if(sign)
                {
                 current.chromosome[j]=(1-alpha)*current.chromosome[j]+
                  beta*current1.chromosome[j];
                }
                else
                {
                 current.chromosome[j]=(1-alpha)*current.chromosome[j]-
                  beta*current1.chromosome[j];
                }
                if (current.chromosome[j]>variabletop[j])  //判斷是否超界.
                {
                 current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];
                }
                if (current.chromosome[j]<variablebottom [j])
                {
                 current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];
                }
                if(sign)
                {
                 current1.chromosome[j]=alpha*current.chromosome[j]+
                  (1- beta)*current1.chromosome[j];
                }
                else
                {
                 current1.chromosome[j]=alpha*current.chromosome[j]-
                  (1- beta)*current1.chromosome[j];
                }
                if (current1.chromosome[j]>variabletop[j])
                {
                 current1.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];
                }
                if (current1.chromosome[j]<variablebottom [j])
                {
                 current1.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];
                }
               }
               //回代
              }
              newpopulation.InsertAfter  (newpopulation.FindIndex(i),current);
              newpopulation.InsertAfter  (newpopulation.FindIndex(i),current1);
             }
             ASSERT(newpopulation.GetCount()==popsize);
             for (i=0;i<popsize;i++)
             {
              population.SetAt (population.FindIndex(i),
               newpopulation.GetAt (newpopulation.FindIndex(i)));
             }
             newpopulation.RemoveAll();
             index.RemoveAll();
            }
            void CMVSOGA:: findbestandworstindividual( )  
            {
             int i;
             bestindividual=population.GetAt(population.FindIndex(best_index));
             worstindividual=population.GetAt(population.FindIndex(worst_index));
             for (i=1;i<popsize; i++)
             {
              current=population.GetAt(population.FindIndex(i));
              if (current.fitness>bestindividual.fitness)
              {
               bestindividual=current;
               best_index=i;
              }
              else if (current.fitness<worstindividual.fitness)
              {
               worstindividual=current;
               worst_index=i;
              }
             }
             population.SetAt(population.FindIndex(worst_index),
              population.GetAt(population.FindIndex(best_index)));
             //用最好的替代最差的。
             if (maxgeneration==0)
             {
              currentbest=bestindividual;
             }
             else
             {
              if(bestindividual.fitness>=currentbest.fitness)
              {
               currentbest=bestindividual;
              }
             }
            }
            void CMVSOGA:: calculatefitnessvalue() //適應度函數值計算,關鍵是適應度函數的設計
                      //current變化,這段程序變化較大,特別是排序。
            {
             int  i;
             double temp;//alpha,beta;//適應度函數的尺度變化系數
             double cmax=100;
             for(i=0;i<popsize;i++)
             {
              current=population.GetAt(population.FindIndex(i));
              if(current.value<cmax)
              {
               temp=cmax-current.value;
              }
              else
              {
               temp=0.0;
              }
              /*
              if((population[i].value+cmin)>0.0)
              {temp=cmin+population[i].value;}
             else
             {temp=0.0;
               }
              */
              current.fitness=temp;
              population.SetAt(population.FindIndex(i),current); 
             }
            }
            void CMVSOGA:: performevolution() //演示評價結果,有冗余代碼,current變化,程序應該改變較大
            {
             if (bestindividual.fitness>currentbest.fitness)
             {
              currentbest=population.GetAt(population.FindIndex(best_index));
             }
             else
             {
              population.SetAt(population.FindIndex(worst_index),currentbest);
             }
            }
            void CMVSOGA::GetResult(double *Result)
            {
             int i;
             for (i=0;i<variablenum;i++)
             {
              Result[i]=currentbest.chromosome[i];
             }
             Result[i]=currentbest.value;
            }

            void CMVSOGA::GetPopData(CList <double,double>&PopData) 
            {
             PopData.RemoveAll();
             int i,j;
             for (i=0;i<popsize;i++)
             {
              current=population.GetAt(population.FindIndex(i));
              for (j=0;j<variablenum;j++)
              {
               PopData.AddTail(current.chromosome[j]);
              }
             }
            }
            void CMVSOGA::SetFitnessData(CList <double,double>&PopData,CList <double,double>&FitnessData,CList <double,double>&ValueData)
            {
             int i,j;
             for (i=0;i<popsize;i++)
             { 
              current=population.GetAt(population.FindIndex(i)); //就因為這一句,出現了很大的問題。 
              for (j=0;j<variablenum;j++)
              {
               current.chromosome[j]=PopData.GetAt(PopData.FindIndex(i*variablenum+j));
              }
              current.fitness=FitnessData.GetAt(FitnessData.FindIndex(i));
              current.value=ValueData.GetAt(ValueData.FindIndex(i));
              population.SetAt(population.FindIndex(i),current);
             }
             FitnessData.RemoveAll();
             PopData.RemoveAll();
             ValueData.RemoveAll();
            }

            posted on 2007-05-26 08:14 唯月釋懷 閱讀(15054) 評論(7)  編輯 收藏 引用

            Feedback

            # re: C++遺傳算法源程序 2007-05-26 17:38 pass86

            我也寫過一點,從書上改編的。
            /********************************************************************
            Filename: aiWorld.h
            Purpose: 遺傳算法,花朵演化。
            Author: pass86
            E-mail: pass86@gmail.com
            Created: 2007/03/29
            Id:
            Copyright:
            Licence:
            *********************************************************************/
            #ifndef AIWORLD_H_
            #define AIWORLD_H_

            #include <iostream>
            #include <ctime>
            #include <cstdlib>
            #include <cmath>

            #define kMaxFlowers 10

            using std::cout;
            using std::endl;

            class ai_World
            {
            public:
            ai_World()
            {
            srand(time(0));
            }
            ~ai_World() {}

            int temperature[kMaxFlowers]; //溫度
            int water[kMaxFlowers]; //水質
            int sunlight[kMaxFlowers]; //陽光
            int nutrient[kMaxFlowers]; //養分
            int beneficialInsect[kMaxFlowers]; //益蟲
            int harmfulInsect[kMaxFlowers]; //害蟲

            int currentTemperature;
            int currentWater;
            int currentSunlight;
            int currentNutrient;
            int currentBeneficialInsect;
            int currentHarmfulInsect;

            /**
            第一代花朵
            */
            void Encode();

            /**
            花朵適合函數
            */
            int Fitness(int flower);

            /**
            花朵演化
            */
            void Evolve();

            /**
            返回區間[start, end]的隨機數
            */
            inline int tb_Rnd(int start, int end)
            {
            if (start > end)
            return 0;
            else
            {
            //srand(time(0));
            return (rand() % (end + 1) + start);
            }
            }

            /**
            顯示數值
            */
            void show();
            };
            // ----------------------------------------------------------------- //
            void ai_World::Encode()
            // ----------------------------------------------------------------- //

            {
            int i;

            for (i=0;i<kMaxFlowers;i++)
            {
            temperature[i]=tb_Rnd(1,75);
            water[i]=tb_Rnd(1,75);
            sunlight[i]=tb_Rnd(1,75);
            nutrient[i]=tb_Rnd(1,75);
            beneficialInsect[i]=tb_Rnd(1,75);
            harmfulInsect[i]=tb_Rnd(1,75);
            }

            currentTemperature=tb_Rnd(1,75);
            currentWater=tb_Rnd(1,75);
            currentSunlight=tb_Rnd(1,75);
            currentNutrient=tb_Rnd(1,75);
            currentBeneficialInsect=tb_Rnd(1,75);
            currentHarmfulInsect=tb_Rnd(1,75);

            currentTemperature=tb_Rnd(1,75);
            currentWater=tb_Rnd(1,75);
            currentSunlight=tb_Rnd(1,75);
            currentNutrient=tb_Rnd(1,75);
            currentBeneficialInsect=tb_Rnd(1,75);
            currentHarmfulInsect=tb_Rnd(1,75);

            }
            // ----------------------------------------------------------------- //
            int ai_World::Fitness(int flower)
            // ----------------------------------------------------------------- //

            {
            int theFitness;


            theFitness=abs(temperature[flower]-currentTemperature);
            theFitness=theFitness+abs(water[flower]-currentWater);
            theFitness=theFitness+abs(sunlight[flower]-currentSunlight);
            theFitness=theFitness+abs(nutrient[flower]-currentNutrient);
            theFitness=theFitness+abs(beneficialInsect[flower]-currentBeneficialInsect);
            theFitness=theFitness+abs(harmfulInsect[flower]-currentHarmfulInsect);

            return (theFitness);

            }
            // ----------------------------------------------------------------- //
            void ai_World::Evolve()
            // ----------------------------------------------------------------- //

            {
            int fitTemperature[kMaxFlowers];
            int fitWater[kMaxFlowers];
            int fitSunlight[kMaxFlowers];
            int fitNutrient[kMaxFlowers];
            int fitBeneficialInsect[kMaxFlowers];
            int fitHarmfulInsect[kMaxFlowers];
            int fitness[kMaxFlowers];
            int i;
            int leastFit=0;
            int leastFitIndex;

            for (i=0;i<kMaxFlowers;i++)
            if (Fitness(i)>leastFit)
            {
            leastFit=Fitness(i);
            leastFitIndex=i;
            }

            temperature[leastFitIndex]=temperature[tb_Rnd(0,kMaxFlowers - 1)];
            water[leastFitIndex]=water[tb_Rnd(0,kMaxFlowers - 1)];
            sunlight[leastFitIndex]=sunlight[tb_Rnd(0,kMaxFlowers - 1)];
            nutrient[leastFitIndex]=nutrient[tb_Rnd(0,kMaxFlowers - 1)];
            beneficialInsect[leastFitIndex]=beneficialInsect[tb_Rnd(0,kMaxFlowers - 1)];
            harmfulInsect[leastFitIndex]=harmfulInsect[tb_Rnd(0,kMaxFlowers - 1)];

            for (i=0;i<kMaxFlowers;i++)
            {
            fitTemperature[i]=temperature[tb_Rnd(0,kMaxFlowers - 1)];
            fitWater[i]=water[tb_Rnd(0,kMaxFlowers - 1)];
            fitSunlight[i]=sunlight[tb_Rnd(0,kMaxFlowers - 1)];
            fitNutrient[i]=nutrient[tb_Rnd(0,kMaxFlowers - 1)];
            fitBeneficialInsect[i]=beneficialInsect[tb_Rnd(0,kMaxFlowers - 1)];
            fitHarmfulInsect[i]=harmfulInsect[tb_Rnd(0,kMaxFlowers - 1)];
            }

            for (i=0;i<kMaxFlowers;i++)
            {
            temperature[i]=fitTemperature[i];
            water[i]=fitWater[i];
            sunlight[i]=fitSunlight[i];
            nutrient[i]=fitNutrient[i];
            beneficialInsect[i]=fitBeneficialInsect[i];
            harmfulInsect[i]=fitHarmfulInsect[i];
            }

            for (i=0;i<kMaxFlowers;i++)
            {
            if (tb_Rnd(1,100)==1)
            temperature[i]=tb_Rnd(1,75);
            if (tb_Rnd(1,100)==1)
            water[i]=tb_Rnd(1,75);
            if (tb_Rnd(1,100)==1)
            sunlight[i]=tb_Rnd(1,75);
            if (tb_Rnd(1,100)==1)
            nutrient[i]=tb_Rnd(1,75);
            if (tb_Rnd(1,100)==1)
            beneficialInsect[i]=tb_Rnd(1,75);
            if (tb_Rnd(1,100)==1)
            harmfulInsect[i]=tb_Rnd(1,75);
            }

            }
            void ai_World::show()
            {
            // cout << "\t temperature water sunlight nutrient beneficialInsect harmfulInsect\n";
            cout << "current\t " << currentTemperature << "\t " << currentWater << "\t ";
            cout << currentSunlight << "\t " << currentNutrient << "\t ";
            cout << currentBeneficialInsect << "\t " << currentHarmfulInsect << "\n";
            for (int i=0;i<kMaxFlowers;i++)
            {
            cout << "Flower " << i << ": ";
            cout << temperature[i] << "\t ";
            cout << water[i] << "\t ";
            cout << sunlight[i] << "\t ";
            cout << nutrient[i] << "\t ";
            cout << beneficialInsect[i] << "\t ";
            cout << harmfulInsect[i] << "\t ";
            cout << endl;
            }
            }
            #endif // AIWORLD_H_

            //test.cpp
            #include <iostream>
            #include "ai_World.h"

            using namespace std;

            int main()
            {
            ai_World a;
            a.Encode();
            // a.show();
            for (int i = 0; i < 10; i++)
            {
            cout << "Generation " << i << endl;
            a.Evolve();
            a.show();
            }

            system("PAUSE");
            return 0;
            }
              回復  更多評論   

            # re: C++遺傳算法源程序 2007-05-27 19:04 江水獸

            啊哈 當初我也寫過 只是沒有像這樣如此具有遺傳算法的特點 當時只是為了選修課寫的一個具有基本功能的GA Program  回復  更多評論   

            # re: C++遺傳算法源程序 2007-06-25 17:33 7777

            垃圾 什么你都往上傳  回復  更多評論   

            # re: C++遺傳算法源程序 2007-10-21 08:15 starlet

            作者不知道有沒有聯系方式,有問題請教  回復  更多評論   

            # re: C++遺傳算法源程序 2008-04-20 02:33 阿毛

            你好,我在做遺傳算法解決vrp問題的畢業論文,有問題想指教,有償求助,急,望回復,我的q是267497220  回復  更多評論   

            # re: C++遺傳算法源程序 2008-10-19 21:57

            謝謝,我如果有新的代碼,也給大家傳上來共享!  回復  更多評論   

            # re: C++遺傳算法源程序 2011-04-20 16:28 sjiao888

            你好,我在做遺傳算法的畢業論文,有問題想指教,我的QQ是709375489  回復  更多評論   


            My Links

            Blog Stats

            常用鏈接

            留言簿(5)

            隨筆檔案

            文章檔案

            My sohu blog

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            国产亚洲成人久久| 久久精品亚洲男人的天堂| 亚洲精品无码专区久久久 | 久久久久久极精品久久久 | 日本五月天婷久久网站| 亚洲国产欧美国产综合久久| 久久亚洲AV成人无码电影| 国产精品九九久久精品女同亚洲欧美日韩综合区| 久久综合九色综合97_久久久| 久久久精品久久久久久 | 狠狠精品久久久无码中文字幕| 久久久国产精品亚洲一区 | 久久夜色精品国产噜噜麻豆| 久久久久中文字幕| 精品人妻伦九区久久AAA片69| 91亚洲国产成人久久精品| 无码国产69精品久久久久网站| 久久AAAA片一区二区| 国产精品免费看久久久| 偷窥少妇久久久久久久久| 久久996热精品xxxx| 国内精品久久人妻互换 | 国产激情久久久久影院| 精品久久8x国产免费观看| 97精品依人久久久大香线蕉97| 久久久久一本毛久久久| 国产激情久久久久影院| 97超级碰碰碰碰久久久久| 久久91精品国产91久久小草| 婷婷久久香蕉五月综合加勒比| 一本久久综合亚洲鲁鲁五月天| 欧美激情精品久久久久| 国产亚洲婷婷香蕉久久精品| 97精品国产97久久久久久免费| 久久久久久精品无码人妻| 亚洲欧美日韩精品久久亚洲区| 久久精品国产99久久丝袜| 国产精品成人久久久久三级午夜电影 | 亚洲欧美日韩久久精品| 亚洲国产成人久久综合一区77| 天天做夜夜做久久做狠狠|