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

            振動(dòng)理論

            我的C++實(shí)現(xiàn)之路

            C++遺傳算法源程序

            // CMVSOGA.h : main header file for the CMVSOGA.cpp
            ////////////////////////////////////////////////////////////////////
            /////                                                          /////
            /////                沈陽(yáng)航空工業(yè)學(xué)院 動(dòng)力工程系               /////
            /////                       作者:李立新                       /////
            /////                   完成日期: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();           //評(píng)價(jià)個(gè)體,求最佳個(gè)體
             void calculateobjectvalue();          //計(jì)算目標(biāo)函數(shù)值
             void calculatefitnessvalue();          //計(jì)算適應(yīng)度函數(shù)值
             void findbestandworstindividual();         //尋找最佳個(gè)體和最差個(gè)體
             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];         //染色體編碼長(zhǎng)度應(yīng)該為變量的個(gè)數(shù)
              double value;        
              double fitness;             //適應(yīng)度
             };
             double variabletop[variablenum];         //變量值
             double variablebottom[variablenum];         //變量值
             int popsize;              //種群大小
            // int generation;              //世代數(shù)
             int best_index;  
             int worst_index;
             double crossoverrate;            //交叉率
             double mutationrate;            //變異率
             int maxgeneration;             //最大世代數(shù)
             struct individual bestindividual;         //最佳個(gè)體
             struct individual worstindividual;         //最差個(gè)體
             struct individual current;              //當(dāng)前個(gè)體
             struct individual current1;              //當(dāng)前個(gè)體
             struct individual currentbest;          //當(dāng)前最佳個(gè)體
             CList <struct individual,struct individual &> population;   //種群
             CList <struct individual,struct individual &> newpopulation;  //新種群
             CList <double,double> cfitness;          //存儲(chǔ)適應(yīng)度值
             //怎樣使鏈表的數(shù)據(jù)是一個(gè)結(jié)構(gòu)體????主要是想把種群作成鏈表。節(jié)省空間。
            };
            #endif

             

            執(zhí)行文件:

            // 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)  //第一步,初始化。
            {
             //應(yīng)該采用一定的策略來(lái)保證遺傳算法的初始化合理,采用產(chǎn)生正態(tài)分布隨機(jī)數(shù)初始化?選定中心點(diǎn)為多少?
             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 ) );  //尋找一個(gè)真正的隨機(jī)數(shù)生成函數(shù)。
             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()   //第二步,評(píng)價(jià)個(gè)體,求最佳個(gè)體
            //{
            // calculateobjectvalue();
            // calculatefitnessvalue();   //在此步中因該按適應(yīng)度值進(jìn)行排序.鏈表的排序.
            // findbestandworstindividual();
            //}
            void CMVSOGA:: calculateobjectvalue()  //計(jì)算函數(shù)值,應(yīng)該由外部函數(shù)實(shí)現(xiàn)。主要因?yàn)槟繕?biāo)函數(shù)很復(fù)雜。
            {
             int i,j;
                double x[variablenum];
             for (i=0; i<popsize; i++)
             {
              current=population.GetAt(population.FindIndex(i)); 
              current.value=0;
              //使用外部函數(shù)進(jìn)行,在此只做結(jié)果的傳遞。
              for (j=0;j<variablenum;j++)
              {
               x[j]=current.chromosome[j];
               current.value=current.value+(j+1)*pow(x[j],4);
              }
              ////使用外部函數(shù)進(jìn)行,在此只做結(jié)果的傳遞。
              population.SetAt(population.FindIndex(i),current);
             }
            }

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

              //生成均值為current.chromosome,方差為sigma的高斯分布數(shù)
              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()   //從當(dāng)前個(gè)體中按概率選擇新種群,應(yīng)該加一個(gè)復(fù)制選擇,提高種群的平均適應(yīng)度
            {
             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));//臨時(shí)借用變量
               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++)//求適應(yīng)度總值,以便歸一化,是已經(jīng)排序好的鏈。
             {
              current=population.GetAt(population.FindIndex(i)); //取出來(lái)的值出現(xiàn)問(wèn)題.
              sum+=current.fitness;
             }
             for(i=0;i<popsize; i++)//歸一化
             {
              current=population.GetAt(population.FindIndex(i)); //population 有值,為什么取出來(lái)的不正確呢??
              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;)//輪盤賭概率選擇。本段還有問(wèn)題。
             {
              p=double(rand()%999)/1000+0.0001;  //隨機(jī)生成概率
              pindex=0;  //遍歷索引
              pc=cfitness.GetAt(cfitness.FindIndex(1));  //為什么取不到數(shù)值???20060910
              while(p>=pc&&pindex<popsize) //問(wèn)題所在。
              {
               pc=cfitness.GetAt(cfitness .FindIndex(pindex));
               pindex++;
              }
              //必須是從index~popsize,選擇高概率的數(shù)。即大于概率p的數(shù)應(yīng)該被選擇,選擇不滿則進(jìn)行下次選擇。
              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   變化后,以上沒有問(wèn)題了。


            void CMVSOGA:: crossoveroperator()   //非均勻算術(shù)線性交叉,浮點(diǎn)數(shù)適用,alpha ,beta是(0,1)之間的隨機(jī)數(shù)
                      //對(duì)種群中兩兩交叉的個(gè)體選擇也是隨機(jī)選擇的。也可取beta=1-alpha;
                      //current的變化會(huì)有一些改變。
            {
             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++)//生成序號(hào)
             {
              index.InsertAfter (index.FindIndex(i),i);
             }
             for (i=0;i<popsize;i++)//打亂序號(hào)
             {
              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)
             {//按順序序號(hào),按序號(hào)選擇兩個(gè)母體進(jìn)行交叉操作。
              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))));//臨時(shí)使用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() //適應(yīng)度函數(shù)值計(jì)算,關(guān)鍵是適應(yīng)度函數(shù)的設(shè)計(jì)
                      //current變化,這段程序變化較大,特別是排序。
            {
             int  i;
             double temp;//alpha,beta;//適應(yīng)度函數(shù)的尺度變化系數(shù)
             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() //演示評(píng)價(jià)結(jié)果,有冗余代碼,current變化,程序應(yīng)該改變較大
            {
             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)); //就因?yàn)檫@一句,出現(xiàn)了很大的問(wèn)題。 
              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) 評(píng)論(7)  編輯 收藏 引用

            Feedback

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

            我也寫過(guò)一點(diǎn),從書上改編的。
            /********************************************************************
            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]; //水質(zhì)
            int sunlight[kMaxFlowers]; //陽(yáng)光
            int nutrient[kMaxFlowers]; //養(yǎng)分
            int beneficialInsect[kMaxFlowers]; //益蟲
            int harmfulInsect[kMaxFlowers]; //害蟲

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

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

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

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

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

            /**
            顯示數(shù)值
            */
            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;
            }
              回復(fù)  更多評(píng)論   

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

            啊哈 當(dāng)初我也寫過(guò) 只是沒有像這樣如此具有遺傳算法的特點(diǎn) 當(dāng)時(shí)只是為了選修課寫的一個(gè)具有基本功能的GA Program  回復(fù)  更多評(píng)論   

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

            垃圾 什么你都往上傳  回復(fù)  更多評(píng)論   

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

            作者不知道有沒有聯(lián)系方式,有問(wèn)題請(qǐng)教  回復(fù)  更多評(píng)論   

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

            你好,我在做遺傳算法解決vrp問(wèn)題的畢業(yè)論文,有問(wèn)題想指教,有償求助,急,望回復(fù),我的q是267497220  回復(fù)  更多評(píng)論   

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

            謝謝,我如果有新的代碼,也給大家傳上來(lái)共享!  回復(fù)  更多評(píng)論   

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

            你好,我在做遺傳算法的畢業(yè)論文,有問(wèn)題想指教,我的QQ是709375489  回復(fù)  更多評(píng)論   



            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            My Links

            Blog Stats

            常用鏈接

            留言簿(5)

            隨筆檔案

            文章檔案

            My sohu blog

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            日日躁夜夜躁狠狠久久AV| 久久精品国产精品青草app| 久久夜色精品国产亚洲| 久久久久亚洲Av无码专| 亚洲精品国精品久久99热一| 国产精品99久久久精品无码| 97精品伊人久久大香线蕉| 婷婷久久综合| 亚洲日本久久久午夜精品| 久久久久久国产a免费观看黄色大片| 欧美色综合久久久久久| 久久亚洲中文字幕精品一区| 蜜桃麻豆WWW久久囤产精品| 亚洲va久久久噜噜噜久久男同| 久久精品国产99久久久古代| 久久亚洲精品成人AV| 潮喷大喷水系列无码久久精品 | 久久人人爽人人爽人人av东京热| 亚洲精品美女久久久久99小说| 久久久久av无码免费网| 波多野结衣中文字幕久久 | 国产精品va久久久久久久| 色综合久久天天综合| 亚洲精品无码久久久| 国产成人精品白浆久久69| 久久一区二区三区99| 久久精品国产第一区二区三区| 久久国产视屏| 囯产精品久久久久久久久蜜桃| 精品一区二区久久| 国产亚洲美女精品久久久2020| 久久久综合九色合综国产| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久久久久亚洲精品成人| 久久久噜噜噜久久| 精品国产乱码久久久久久郑州公司 | 99久久精品这里只有精品| 久久精品免费一区二区| 亚洲国产精品久久久久| 99精品国产综合久久久久五月天| 青青草国产精品久久|