SIA: Swarm Intelligence Algorithms

الگوریتم های هوش جمعی

SIA: Swarm Intelligence Algorithms

الگوریتم های هوش جمعی

پیاده سازی الگوریتم ژنتیک در ++C برای حل یک مساله ساده

پیاده سازی حل مسئله تساوی ساده ریاضی به کمک الگوریتم ژنتیک در Visual studio C++

بیان مسئله:

فرض کنید تساوی a+2b+3c+4d=30 برقرار باشد با استفاده از الگوریتم ژنتیک مقادیر a,b,c,d به گونه ای باید تعیین شود که تساوی برقرار باشد. در ابتدا باید تابع هدف فرمول بندی شود. که در این مثال هدف مینیم کردن تابع f(x)=a+2b+3c+4d-30 می باشد. چون چهار متغیر در معادله وجود دارد می توان کروموزوم ها را به صورت شکل 1 ایجاد کرد. در ادامه هر کدام از مراحل الگوریتم ژنتیک همراه با کد آورده شده است.

d

c

b

a

 

 


شکل 1: تشکیل کروموزوم برای معادله ریاضی f(x) با چهار متغیر

 

پیاده سازی تابع هدف به کمک فایل Fchromosomemath1.h :

همان طور که در کد ذیل آورده شده است کروموزوم ها یا همان راه حل ها را از تابع اصلی به عنوان ورودی دریافت می کند. و سپس تابع هدف به کمک ژن ها در این مثال متغیرهای a,b,c,d به تعداد 6 کروموزوم بدست می آید. و در انتها یک آرایه یک بعدی سطری با 6 عنصر به عنوان جواب هر کرموزوم به تابع اصلی به عنوان خروجی برگردانده می شود.

////////////////////Fchromosomemath1.h\\\\\\\\\\\\\\\\\\\\\\\\

structmystruct400

{

       int F400[6];

};

usingnamespace std;

structmystruct400 Fchromosomemath400(intnewchromosome3[6][4])

{

 

       structmystruct400 items4;

 

       for (int i = 0; i < 6; i++)

              for (int j = 0; j < 4; j++)

                     cout <<"\nchr000000["<<i<<"]["<<j<<"]="<<newchromosome3[i][j];

       int F400[6] = { 0 };

       for (int i = 0; i < 6; i++)

       {

              int a = newchromosome3[i][0];

              int b = newchromosome3[i][1];

              int c = newchromosome3[i][2];

              int d = newchromosome3[i][3];

              F400[i] = abs(a + 2 * b + 3 * c + 4 * d - 30);

              cout <<"\nF["<<i<<"]="<< F400[i];

              items4.F400[i] = F400[i];

              cout <<"\nitems4.F["<< i <<"]="<< items4.F400[i];

 

 

       }

 

       return items4;

}

//////////////////// End-Fchromosomemath1.h\\\\\\\\\\\\\\\\\\\\\\\\

  

 

پیاده سازی عملگر انتخاب به کمک فایل Fselectmath1 :

از بین راه حل هایی که در هر جمعیت تولید شده است باید والدین با شانس بیشتر انتخاب شوند. بدین منظور کروموزوم ها یا راه حل های یک جمعیت و مقدار تابع هدف هر راه حل به عنوان ورودی به تابع Fselectmath1 داده می شود. پس از بدست آوردن احتمال انتخاب هر راه حل و میزان Fitness و مجموع کل یا Total به کمک جمع تجمعی و از روی چرخه رولت کروموزوم های جدید یعنی  newchromosome ها انتخاب می شوند. Chromosome11,Pr,Fitness,Total,F11 به عنوان خروجی به تابع اصلی برگردانده می شود.

////////////////////Fselectmath1.h\\\\\\\\\\\\\\\\\\\\\\\\

 

 

#defineIter = 50

structmystruct100

{

       int F11[50][6];

       int chromosome11[6][4];

       floatpr[6];

       floatFitness[6];

       float Total1 = 0;

};

 

structmystruct100 Fselectmath1(floatTotal,intF12[50][6],intnewchromosome1[6][4])

{

      

       structmystruct100 items;

       //int i, a, b, c, d;

       floatFitness[6] = { 0, 0, 0, 0, 0, 0 };

       floatpr[6] = { 0, 0, 0, 0, 0, 0 };

       float Total1 = 0;

      

       for (int i = 0; i < 6; i++)

              std::cout <<"\n\n F12="<<F12[0][i];

      

       for (int i = 0; i < 6; i++)

       {

              //std::cout << "\n\n F12=" << F12[0][i] << "\t\t" << Total;

              Fitness[i] = 1 / float(1 + F12[0][i]);

              Total = Total + Fitness[i];

              std :: cout <<"\n\n ttttttttt="<< Fitness[i] <<"\t\t"<<Total;

       }//End calculate Total

       //probability of any chromosome

       for (int i = 0; i < 6; i++)

              pr[i] = Fitness[i] / Total;//End probability of any chromosome

       //calculate cumulative sum

       floatcroullete[6];

       croullete[0] = pr[0];

       std :: cout <<"\n\n\nc000="<<croullete[0];

      

      

       croullete[1] = croullete[0] + pr[1];

       croullete[2] = croullete[1] + pr[2];

       croullete[3] = croullete[2] + pr[3];

       croullete[4] = croullete[3] + pr[4];

       croullete[5] = croullete[4] + pr[5];

       for (int i = 0; i < 6; i++)

       {

              std :: cout <<"\ncroullete["<< i <<"]="<<croullete[i];

       }

       //End calculate cumulative sum

       //create random number

       doubleRandom[6];

       //int Random1[6];

       srand(time(0));

       for (int i = 0; i < 6; i++)

       {

              Random[i] = ((double)rand()/RAND_MAX);

             

              std::cout <<"\n yqqqqqqqqqqqq"<<"["<< i <<"]"<<"="<< Random[i];

       }

      

 

       for (int i = 0; i < 6; i++)

              for (int j = 0; j < 4; j++)

                     std::cout <<"\nnewchromosome1111["<< i <<"]"<<"["<< j <<"]="<<newchromosome1[i][j];

 

       for (int i = 0; i < 6; i++)

       {

             

                     if (Random[i] <= croullete[0])

                           for (int k = 0; k < 4; k++)

                                  newchromosome1[i][k] = newchromosome1[0][k];

                    

                     for (int j = 0; j < 5; j++)

                     if (croullete[j] < Random[i] && Random[i] <= croullete[j + 1])

                           for (int k = 0; k < 4; k++)

                                  newchromosome1[i][k] = newchromosome1[j + 1][k];

             

       }

             

                     for (int i = 0; i < 6; i++)

                     {

                           for (int j = 0; j < 4; j++)

                                  items.chromosome11[i][j] = newchromosome1[i][j];

                           items.Fitness[i]=Fitness[i];

                           items.pr[i] = pr[i];

                     }

                     items.Total1 = Total;

                     for (int i = 0; i < 50; i++)

                           for (int j = 0; j < 6; j++)

                                  items.F11[i][j] = F12[i][j];

 

                          

                     return items;

      

}

 

 

//////////////////// End-Fselectmath1.h\\\\\\\\\\\\\\\\\\\\\\\\

پیاده سازی عملگر تقاطع به کمک فایل Fcrossmath1.h :

 

پس از انتخاب والدین با شایستگی بیشتر حال نوبت به استفاده از عملگر تقاطع رسیده است. میزان نرخ تقاطع یعنی cross_rate و راه حل های یک جمعیت که در آن والدین با شایستگی بیشتر انتخاب شده است به عنوان newchromosome از تابع اصلی دریافت می شود. در این مثال از تقاطع تک نقطه ای استفاده شده است که در آن به صورت تصادفی محل تقاطع انتخاب شده و از همان نقطه و به تعداد cross_rate کروموزوم عملگر تقاطع اعمال می گردد. در نهایت راه حل های جدید پس از اعمال تقاطع و تعداد انتخاب کروموزوم به عنوان خروجی به تابع اصلی برگردانده می شود.

 

////////////////////Fcrossmath1.h\\\\\\\\\\\\\\\\\\\\\\\\

 

structmystruct200

{

       int newchromosome1[6][4];

       intnselectch[6];

};

usingnamespace std;

structmystruct200 Fcrossmath1(floatcross_rate,  intnewchromosome1[6][4])

{

      

       structmystruct200 items2;

       //using namespace std;

       floatR[6] = { 0 };

       srand(time(0));

       for (int i = 0; i < 6; i++)

       {

              R[i] = ((double)rand() / RAND_MAX);

              std :: cout <<"\nRTESTTTTTTTT ["<<i<<"]="<< R[i];

       }

       //selected chromosome for crossover

       intnselectch[6] = {6,6,6,6,6,6};

       for (int i = 0; i <6;i++)

              std :: cout <<"\nnselectch ["<< i <<"]="<<nselectch[i];

       for (int i = 0; i < 6; i++)

              if (R[i] <= cross_rate)

                     nselectch[i] = i;

       for (int i = 0; i < 6; i++)

              std::cout <<"\nnewwwwwnselectch ["<< i <<"]="<<nselectch[i];

       intkk = 6;

      

       for (int i = 0; i <kk; i++)

              if (nselectch[i] == 6)

              {

                    

                     --kk;

                     for (int j = i; j <kk; j++)

                           nselectch[j] = nselectch[j + 1];

             

                     --i;  

              }

       for (int i = 0; i <kk; i++)

              std:: cout <<"\nnewnselectch ["<< i <<"]="<<nselectch[i];

       sizeofnselectch == kk;

       std::cout <<"\nsssssssssssssssssssss"<<sizeofnselectch;

       std::cout <<"\nsssssssssssssssssssss"<<kk;

       intTemp[6][4] = {0};

       for (int i = 0; i < 6; i++)

              for (int j = 0; j < 4; j++)

                     std::cout <<"\nTemp["<<i<<"]["<<j<<"]="<< Temp[i][j];

       int newchromosome200[6][4] = {0};

       for (int i = 0; i < 6; i++)

              for (int j = 0; j < 4; j++)

              {

                     std::cout <<"\nnewchromosome200["<< i <<"]["<< j <<"]="<< newchromosome200[i][j];

                     newchromosome200[i][j] = newchromosome1[i][j];

                     std::cout <<"\nnewchromosomenew200["<< i <<"]["<< j <<"]="<< newchromosome200[i][j];

              }

       //if number chromosome selected equal 0 or 1 no operation crossover

       if (kk == 0 || kk == 1)

              for (int i = 0; i < 6; i++)

                     for (int j = 0; j < 4; j++)

                     {

                           newchromosome200[i][j] = newchromosome1[i][j];

                           std::cout <<"\nnewchromosome22222200200["<< i <<"]["<< j <<"]="<< newchromosome200[i][j];

                     }

       //if number chromosome selected greater than 1 then operation crossover

       else

       {

              for (int i = 0; i <kk - 1; i++)

              {

                     Temp[nselectch[i]][0] = newchromosome1[nselectch[i]][0];

                     Temp[nselectch[i]][1] = newchromosome1[nselectch[i]][1];

                     Temp[nselectch[i]][2] = newchromosome1[nselectch[i + 1]][2];

                     Temp[nselectch[i]][3] = newchromosome1[nselectch[i + 1]][3];

                     newchromosome200[nselectch[i]][0]=Temp[nselectch[i]][0];

                     newchromosome200[nselectch[i]][1]=Temp[nselectch[i]][1];

                     newchromosome200[nselectch[i]][2]=Temp[nselectch[i]][2];

                     newchromosome200[nselectch[i]][3]=Temp[nselectch[i]][3];

              }

              if (kk>= 2)

              {

                     Temp[nselectch[kk - 1]][0] = newchromosome1[nselectch[kk - 1]][0];

                     Temp[nselectch[kk - 1]][1] = newchromosome1[nselectch[kk - 1]][1];

                     Temp[nselectch[kk - 1]][2] = newchromosome1[nselectch[0]][2];

                     Temp[nselectch[kk - 1]][3] = newchromosome1[nselectch[0]][3];

                     newchromosome200[nselectch[kk - 1]][0]=Temp[nselectch[kk - 1]][0];

                     newchromosome200[nselectch[kk - 1]][1]=Temp[nselectch[kk - 1]][1];

                     newchromosome200[nselectch[kk - 1]][2] = Temp[nselectch[kk - 1]][2];

                     newchromosome200[nselectch[kk - 1]][3] = Temp[nselectch[kk - 1]][3];

              }

 

 

              for (int i = 0; i < 6; i++)

                     for (int j = 0; j < 4; j++)

                           std::cout <<"\nTemp22["<< i <<"]["<< j <<"]="<< Temp[i][j];

              for (int i = 0; i < 6; i++)

                     for (int j = 0; j < 4; j++)

                           std::cout <<"\nnewchromosome200new["<< i <<"]["<< j <<"]="<< newchromosome200[i][j];

       }

 

 

       for (int i = 0; i < 6; i++)

              for (int j = 0; j < 4; j++)

              {

                     items2.newchromosome1[i][j] = newchromosome200[i][j];

                     std::cout <<"\nnewchromosome1111["<< i <<"]"<<"["<< j <<"]="<< items2.newchromosome1[i][j];

              }

 

      

       for (int i = 0; i < kk-1; i++)

       {

              items2.nselectch[i] = nselectch[i];

              cout <<"\nnselectch["<<i<<"]="<<nselectch[i];

       }

 

 

       return items2;

 

}

 

 

//////////////////// End-Fcrossmath1.h\\\\\\\\\\\\\\\\\\\\\\\\

پیاده سازی عملگر جهش به کمک تابع Fmutationmath1 :

پس از عملیات تقاطع باید از عملگر جهش استفاده شود. در این عملگر mutation_rate به عنوان نرخ جهش و newchromosome2 به عنوان جمعیتی که روی آن عملگر تقاطع رخ داده است و   همچنین  Total_genبه عنوان تعداد کل ژن ها به عنوان سه ورودی تابع Fmutationmath1 می باشند. در این تابع از روی تعداد ژن ها و انتخاب ژن به تعداد mutation_rate روی این ژن های انتخاب شده عملیات جهش صورت می گیرد. در این مثال عملیات جهش با انتخاب مقدار ژن تصادفی بین 0 تا 30 برای هر ژن محقق می شود. در نهایت newchromosome2 به عنوان جمعیت جدید پس از جهش، Rmutation جایگاه ژنی که می خواهد جهش روی آن رخ دهد و x مقادیر جدید ژن های با موقعیت Rmutationبه عنوان خروجی به تابع اصلی برگردانده می شود.

 

////////////////////Fmutationmath1.h\\\\\\\\\\\\\\\\\\\\\\\\

structmystruct300

{

       int newchromosome2[6][4];

       intnumber_of_mutation;

       intRmutation[24];

       int x;

};

usingnamespace std;

structmystruct300 Fmutationmath1(floatmutation_rate, intnewchromosome2[6][4],intTotal_gen)

{

 

       structmystruct300 items3;

       items3.x = 0;

       items3.number_of_mutation = 0;

       for (int i = 0; i < 6; i++)

              for (int j = 0; j < 4; j++)

              {

                     items3.newchromosome2[i][j] = 0;

                     std::cout <<"\nnewchromosome1111["<< i <<"]"<<"["<< j <<"]="<< items3.newchromosome2[i][j];

              }

 

 

      

       int y=sizeof items3.Rmutation;

       cout <<"\nTotal_gen="<<Total_gen;

       intnumber_of_mutation = round(mutation_rate*Total_gen);

       cout <<"\n numberrrrrrrrrrrrrrrrr="<<number_of_mutation;

       //srand(time(0));

       int p=1, q=30;

       intx[24] = {0};//value mutation

       intRmutation[24] = {0};//location mutation

       for (int i = 0; i <number_of_mutation; i++)

       {

              Rmutation[i] = round(((Total_gen - p))* ((float)rand() / RAND_MAX));

              std :: cout <<"\nrmuttttttttt["<<i<<"]="<<Rmutation[i];

              x[i] = round((p+(q - p))* ((float)rand() / RAND_MAX));

              std::cout <<"\t XXXXXXXXX["<< i <<"]="<< x[i];

       }

       int Rmutation1[6][4] = {0};

       for (int i = 0; i < 6; i++)

              for (int j = 0; j <4;j++)

              {

                     Rmutation1[i][j] = newchromosome2[i][j];

                     std::cout <<"\nRmutation1000000000000000000["<< i <<"]["<< j <<"]="<< Rmutation1[i][j];

 

              }

       for (int i = 0; i <number_of_mutation; i++)

       {

              int j=Rmutation[i]/4;

              int k = Rmutation[i] %4;

              Rmutation1[j][k]=x[i];

              std :: cout <<"\nRmutation1["<<j<<"]["<<k<<"]="<< Rmutation1[j][k];

       }

       for (int i = 0; i < 6; i++)

              for (int j = 0; j < 4; j++)

              {

                     items3.newchromosome2[i][j]=Rmutation1[i][j];

                     std::cout <<"\nRmutation1new["<< i <<"]["<< j <<"]="<< Rmutation1[i][j];

              }

 

 

 

       return items3;

}

//////////////////// End-Fmutationmath1.h\\\\\\\\\\\\\\\\\\\\\\\\

پیاده سازی تابع اصلی حل مسئله تساوی ساده ریاضی به کمک تابع math1:

در تابع اصلی ابتدا مقادیر اولیه مانند تعداد تکرار ،تعریف کروموزوم و ... تعیین می شوند. پس از آن یک جمعیت اولیه به صورت تصادفی انتخاب می شود. و در نهایت با توجه به عملگر های انتخاب، تقاطع و جهش و ارزیابی به تعداد تکرار تعریف شده ادامه پیدا می کند. لازم به توضیح است در هر تکرار بعد از عملگر جهش عملیات ارزیابی به کمک Fchromosomemath1 برای بدست آوردن تابع هدف انجام می شود تا میزان بهبود یا عدم بهبود عملیات مشخص گردد.

 

////////////////////math1.h\\\\\\\\\\\\\\\\\\\\\\\\

// ConsoleApplication1.cpp : Defines the entry point for the console application.

#include"stdafx.h"

#include"stdafx.h"

#include"iostream"

#include"stdlib.h"

#include"time.h"

#include"Kelidestan_Header.h"

#include"Fchromosomemath.h"

#include"Fselectmath1.h"

#include"Fcrossmath1.h"

#include"Fmutationmath1.h"

#include"Fchromosomemath1.h"

#include<stdio.h>

#include"math.h"

#include<cstdio>

#include<memory.h>

#include<stdio.h>

#include<string.h>

usingnamespace std;

#defineIter 50;

 

intmain()

{

 

       //int Iter = 50;

       //clrscr();

       int p = 0;

       int q = 30;

       int i, j;

       int F0[6][4] = { 0 };

      

       for (i = 0; i < 6; i++)

              for (j = 0; j < 4; j++)

                     //arra[i][j] = {0};

                     cout <<"\nF0["<< i <<"]["<< j <<"]="<< F0[i][j];

       structmystruct1

       {

              intF[50][6];

              intchromosome[6][4];

              floatpr[6];

              floatFitness[6];

              float Total = 0;

       };

       //mystruct1 mystruct;

       structmystruct1mystruct,mystructcross4,mystructmutation5;

 

       //mystruct.F = { 0 };

       memset(mystruct.F, 0, sizeofmystruct.F);

       for (i = 0; i < 50; i++)

              for (j = 0; j < 4; j++)

                     //arra[i][j] = { 0 };

                     cout <<"\nF["<< i <<"]["<< j <<"]="<<mystruct.F[i][j];

       memset(mystruct.chromosome, 0, sizeof(mystruct.chromosome));

       for (i = 0; i < 6; i++)

              for (j = 0; j < 4; j++)

                     cout <<"\nchromosome["<< i <<"]["<< j <<"]="<<mystruct.chromosome[i][j];

       memset(mystruct.pr, 0, sizeof(mystruct.pr));

       for (i = 0; i < 6; i++)

              cout <<"\npr["<< i <<"]="<< mystruct.pr[i];

       memset(mystruct.Fitness, 0, sizeof(mystruct.Fitness));

       for (i = 0; i < 6; i++)

       {

       cout <<"\nFitness["<< i <<"]="<<mystruct.Fitness[i] <<"\t";

       cout <<"\nTotal["<<i<<"]="<<mystruct.Total;

       }

      

       float x;

       intA[6][4];

       srand(time(0));

       for (j = 0; j < 6; j++)

              for (i = 0; i < 4; i++)

              {

                     A[j][i] = rand() % (q - p);

                     mystruct.chromosome[j][i] = A[j][i];

                     cout <<"\n y"<<"["<< j <<"]"<<"["<< i <<"]"<<"="<<mystruct.chromosome[j][i];

              }

       //End Initail population create in the stage

       //target function create by structure

 

 

 

       int a = 47;

       cout <<"\naaaa="<< a;

       int number_1 = My_Function_1(a);

       cout <<"\n";

       printf("%d \n", number_1);

 

       int number_2 = My_Function_2();

       printf("%d \n", number_2);

 

 

       intadd[2] = { 7, 145 };

      

     

       int *F;

 

       F = Fchromosomemath1(mystruct.chromosome);

       mystruct.F[0][0] = *(F + 0);

       mystruct.F[0][1] = *(F + 1);

       mystruct.F[0][2] = *(F + 2);

       mystruct.F[0][3] = *(F + 3);

       mystruct.F[0][4] = *(F + 4);

       mystruct.F[0][5] = *(F + 5);

       cout <<"\nF[0][0]="<<mystruct.F[0][0] <<"\t"<<"F[0][1]="<<mystruct.F[0][1] <<"\t"<<"F[0][2]="<<mystruct.F[0][2] <<"\t"<<"F[0][3]="<<mystruct.F[0][3] <<"\t"<<"F[0][4]="<<mystruct.F[0][4] <<"\t"<<"F[0][5]="<<mystruct.F[0][5] <<"\t";

      

       intaverage[50] = { 0 };

       ////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\//////////////////////////////////////////////

       for (int Iteration = 0; Iteration < 50; Iteration++)

       {

              //start ...................select operation

 

              structmystruct100 mystruct2;

              mystruct2 = Fselectmath1(mystruct.Total, mystruct.F, mystruct.chromosome);

              for (j = 0; j < 6; j++)

              {

                     cout <<endl;

                     for (i = 0; i < 4; i++)

                           cout <<"chromosome"<<"["<< j <<"]"<<"["<< i <<"]"<<"="<< mystruct2.chromosome11[j][i] <<"\t";

                     cout <<"\n";

              }

              structmystruct1 mystruct3;

              memcpy(mystruct3.chromosome, mystruct2.chromosome11, sizeof(mystruct3.chromosome));

 

              for (j = 0; j < 6; j++)

              {

                     cout <<endl;

                     for (i = 0; i < 4; i++)

                           cout <<"chromosome3"<<"["<< j <<"]"<<"["<< i <<"]"<<"="<< mystruct3.chromosome[j][i] <<"\t";

                     cout <<"\n";

              }

              //END....................End select operation

      

              //start ............................................... operation crossover

              floatcross_rate = 0.25;

 

              structmystruct200 mystruct4;

              mystruct4 = Fcrossmath1(cross_rate, mystruct3.chromosome);;

              for (i = 0; i < 6; i++)

              {

                     cout <<endl;

                     for (j = 0; j < 4; j++)

                           cout <<"crosschromosome"<<"["<< i <<"]"<<"["<< j <<"]"<<"="<< mystruct4.newchromosome1[i][j] <<"\t";

                     cout <<"\n";

              }

              memcpy(mystructcross4.chromosome, mystruct4.newchromosome1, sizeof(mystructcross4.chromosome));

              for (i = 0; i < 6; i++)

              {

                     cout <<endl;

                     for (j = 0; j < 4; j++)

                           cout <<"crosschromosome4"<<"["<< j <<"]"<<"["<< i <<"]"<<"="<< mystructcross4.chromosome[i][j] <<"\t";

                     cout <<"\n";

              }

 

              //End..................................................operation crossover

              //start...............................................................................mutation operation

              floatmutation_rate = 0.1;

              structmystruct300 mystruct5;

              intTotal_gen = (sizeof mystructcross4.chromosome) / sizeof(int);

              cout <<"\n tttttttttttttttttttttt"<<Total_gen;

              mystruct5 = Fmutationmath1(mutation_rate, mystructcross4.chromosome, Total_gen);

 

              //End...............................................................................mutation operation

              //start................evaluation of chromosomes then a iteration

              structmystruct400 mystruct6;

              mystruct6 = Fchromosomemath400(mystruct5.newchromosome2);

              for (int i = 0; i < 6; i++)

                     cout <<"\nIteration="<< Iteration <<"\t F["<< i <<"] = "<< mystruct6.F400[i];

             

              for (int i = 0; i < 6; i++)

                     average[Iteration] += mystruct6.F400[i];

              cout <<"\nIteration="<< Iteration <<"\t average"<<Iteration<<" F[ i] = "<< average[Iteration]/6;

 

 

              //End................evaluation of chromosomes then a iteration

       }

       ////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\//////////////////////////////////////////////

       for (int i = 0; i <50;i++)

              cout <<"\nIteration="<< i <<"\t average"<< i <<" F[ i] = "<< average[i]/6;

 

       cin.get();

       return 0;

}

//////////////////// End-math1.h\\\\\\\\\\\\\\\\\\\\\\\\

در شکل 2 نمونه اجرا در محیط Visual studio C++ برای 50 بار تکرار برای حل مسئله نشان داده شده است.

شکل 2: نمونه اجرا مسئله ساده ریاضی در محیط Visual studio C++

پس از این عملیات و پایان تعداد تکرار با بدست آوردن میانگین راه حل های یک جمعیت (average of iteration i)و میزان تکرار (Iteration=50) به عنوان محور افقی نمودار به صورت شکل 3 بدست می آید. که در آن میزان بهبود یا عدم بهبود هر جمعیت در هر تکرار به نمایش در آمده است.

شکل 3: میانگین کروموزوم ها در هر مرحله با تعداد تکرار 50 برای حل مسئله ساده ریاضی

 [1]. http://cdn.persiangig.com/download/2wctetN12Z/1_GA.pdf/dl.