已锁定- -| 回首页 | 2005年索引 | - -Floyd算法1源程序

遗传算法源程序

关键词遗传算法    源程序    数学模型                                          

遗传算法源程序附件:

#include<iostream.h>

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

 

#define MaxGen       30

#define chrom_length 4

#define PopSize     20

#define Upper_Num     5

#define Down_Num      6

#define Point_Num     11

#define INFINITY      9999

#define pc     0.6

#define pm      0.05  

#define E  2.78        

 

double d=2,l=10;

double weight=0.5;

int gen;

 

struct individual{

   int chrom[chrom_length];

   double value;

   double fitness;

};

struct Point{

   double x;

   double y;

}m_point[Point_Num]={{0,0},{d,0},{2*d,0},{3.5*d,0},{5*d,0},

   {2*d,l},{3*d,l},{4*d,l},{0,l+d},{d,l+d},{5*d,l+d}};

 

double best=INFINITY;

int Best[chrom_length];

struct individual population[PopSize];

double Upper_Array[Upper_Num][35]={

4,3,2,3,4,4,3,1,3,4,2,1,0,1,2,3.5,5,17,15,15,14,12,13,13,15,9,10,11,12,13,13,11,13,10,12,5,4,3,4,5,5,4,2,2,3,3,2,1,0,1,2.5,4,16,14,14,13,11,12,12,14,8,9,10,11,12,12,10,12,9,11,6,5,4,5,4,6,5,3,3,2,4,3,2,1,0,1.5,3,15,13,13,17,10,11,11,13,7,8,9,10,11,11,9,11,8,10,

   7.5,6.5,5.5,6.5,5.5,7.5,6.5,4.5,4.5,3.5,5.5,4.5,3.5,2.5,

   1.5,0,1.5,13.5,11.5,11.5,10.5,8.5,9.5,9.5,11.5,5.5,6.5,7.5,8.5,9.5,9.5,7.5,9.5,6.5,8.5,9,8,7,6,5,9,8,6,6,5,7,6,5,4,3,1.5,0,12,10,10,9,7,8,8,10,4,5,6,7,8,8,6,8,5,7

};

double Down_Array[Down_Num][12]={

   0,2,4,4,3,2,3,4,5,8.47214,8,6,

   2,0,2,5,4,3,2,3,4,9.47214,9,7,

   4,2,0,6,5,4,3,2,3,10.47214,10,8,

   4,5,6,0,1,2,3,4,5,4.47214,4,2,

   3,4,5,1,0,1,2,3,4,5.47214,5,3,

   5,4,3,5,4,3,2,1,0,9.47214,9,7

};

 

int murr(int n){

   int i,sum=1;

   for(i=n;i>0;i--)

      sum*=i;

   return sum;

}

 

double min(double x,double y){

   return (x>y?y:x);

}

double length(double x1,double y1,double x2,double y2){

   return (sqrt(pow((x1-x2),2)+pow((y1-y2),2)));

}

double max(double x,double y){

   return(x>y?x:y);

}

void Gener_Init(){//初始化

   int i,j;

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

   {

 

      do{

      for(j=0;j<chrom_length;j+=2)

         population[i].chrom[j]=rand()%5;

      }while(population[i].chrom[0]==population[i].chrom[2]);

      do{

      for(j=1;j<chrom_length;j+=2)

         population[i].chrom[j]=rand()%6;

      }while(population[i].chrom[1]==population[i].chrom[3]);

   }

}

 

void Add_Value(){//目标函数

   int i,j,t1,t2,t3,t4;

   double Umin_Value,Dmin_Value;

   double l1,l2;

   for(i=0;i<PopSize;i++){

      Umin_Value=0;  Dmin_Value=0;

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

       Umin_Value+=min(Upper_Array[population[i].chrom[0]][j],

           Upper_Array[population[i].chrom[2]][j]);

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

       Dmin_Value+=min(Down_Array[population[i].chrom[1]][j],

           Down_Array[population[i].chrom[3]][j]);

      t1=population[i].chrom[0];

      t2=population[i].chrom[1]+5;

      t3=population[i].chrom[2];

      t4=population[i].chrom[3]+5;

      l1=length(m_point[t1].x,

                m_point[t1].y,

                m_point[t2].x,

                m_point[t2].y);

      l2=length(m_point[t3].x,

                m_point[t3].y,

                m_point[t4].x,

                m_point[t4].y);

      population[i].value=weight*(Umin_Value+Dmin_Value)+(1-weight)*(l1+l2)*100;

   }

}

void selection(){//选择

   int i,index;

   double p,temp=0,total=0;

   double cfitness[PopSize];

   struct individual newpopulation[PopSize];

   for(i=0;i<PopSize;i++){

      temp=max(population[i].value,temp);

       total+=population[i].value;

   }

   temp+=100;

   for(i=0;i<PopSize;i++){

      population[i].fitness=(temp-population[i].value)/(PopSize*temp-total);

      cfitness[i]=population[i].fitness;

      }

   for(i=1;i<PopSize;i++)

      cfitness[i]+=cfitness[i-1];

   for(i=0;i<PopSize;i++){

      p=rand()%1000/1000.0;

      index=0;

      while(p>cfitness[index])

         index++;

      newpopulation[i]=population[index];

   }

   for(i=0;i<PopSize;i++){

      population[i]=newpopulation[i];

   }

}

void  Crossing(){//

   int i,j;//

   int index[PopSize],temp,point;

   double p;

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

      index[i]=i;

   for(i=0;i<PopSize;i++){

      point=rand()%(PopSize-i);

      temp=index[i];

      index[i]=index[point+i];

      index[point+i]=temp;

   }

   for(i=0;i<PopSize;i+=2){

      p=rand()%1000/1000.0;

      if(p<pc){

         point=rand()%2;

         if(point==0)

             for(j=0;j<chrom_length;j+=2)

          {

             temp=population[index[i]].chrom[j];

             population[index[i]].chrom[j]

                =population[index[i+1]].chrom[j];

             population[index[i+1]].chrom[j]=temp;

          }

         else

         for(j=1;j<chrom_length;j+=2)

          {

             temp=population[index[i]].chrom[j];

             population[index[i]].chrom[j]

                =population[index[i+1]].chrom[j];

             population[index[i+1]].chrom[j]=temp;

          }

      }

   }

}

void Muta_Opeator(){//

   int i,j,s,q;

   double p;

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

      for(j=0;j<chrom_length;j++){

         p=rand()%1000/1000.0;

         if(p<pm){

             q=rand()%4;

         switch(q){

         case 0:  

             s=rand()%5;

             while(s==population[i].chrom[2])

                s=rand()%5;

               population[i].chrom[q]=s;

               break;

         case 1:

             s=rand()%6;

             while(s==population[i].chrom[3])

                s=rand()%6;

               population[i].chrom[q]=s;

               break;

         case 2:

             s=rand()%5;

             while(s==population[i].chrom[0])

                s=rand()%5;

               population[i].chrom[q]=s;

               break;

         case 3:

             s=rand()%6;

             while(s==population[i].chrom[1])

                s=rand()%6;

               population[i].chrom[q]=s;

               break;

          }

      }

   }

}

void print(){

   int i,temp=-1;

   double average,sum=0;

   cout<<endl;

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

      sum+=population[i].value;

   average=sum/PopSize;

   for(i=0;i<PopSize;i++){

      if(best>=population[i].value){

         best=population[i].value;

         temp=i;

      }

   }

   if(temp!=-1){

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

      Best[i]=population[temp].chrom[i];

   }

   cout<<"Generation="<<gen<<"  Average="<<average

      <<"  Best_Value="<<best<<endl;

   cout<<"Best_Chrom";

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

      cout<<Best[i]<<" ";

   cout<<endl;

}

void main(){

   int q=5,k;

   double p[35],sum;

   int i,j;

   do{

     for(i=0;i<35;i++){

       k=rand()%(3*q);

       p[i]=pow(q,k)*pow(E,-1*q)/(murr(k));

       sum+=p[i];}

   }while(sum==1.0);

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

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

         Upper_Array[i][j]*=p[j];       

      do{

      for(i=0;i<12;i++){

       k=rand()%(3*q);

       p[i]=pow(q,k)*pow(E,-1*q)/(murr(k));

       sum+=p[i];}

   }while(sum==1.0);

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

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

         Down_Array[i][j]*=p[j];

   gen=0;

   Gener_Init();

   while(gen<MaxGen){

        Add_Value();

      print();

      selection();

      Crossing();

      Muta_Opeator();

   //   print();

      gen++;

   }

}

【作者: xixiawen】【访问统计:】【2005年12月10日 星期六 15:43】【 加入博采】【打印

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=3833712

博客手拉手

JOHNSON算法的源程序 xixiawen
立井机械化数学模型 xixiawen
“遗传规划”与“遗传算法”的不同点 海天
股票分析 数学模型 xixiawen
SNS:六度的简单数学模型 ame1981

回复

- 评论人:anonymous   2006-08-10 23:44:41   

其实我这里有个文章是讲遗传算发的思想的可以看看对于每一个题目都是不同的但是思想是一样的所以要考虑在怎么样子的情况下适应性比较好而不是进入蚂蚁算法最好能得到最优解不然是只是局部最优的

- 评论人:83   2006-08-10 11:39:31   

使用罚函数时,适应值函数为:,,为与进化代数相关的罚因子,为进化代数,为第个约束有关的违约值,为违约数目,和为调节惩罚值大小的参数,请问这些参数如何取值,对应不同的实际情况是否取不同的值呢?

- 评论人:西夏文   2006-08-09 19:10:54   西夏文的博客  

要给出一个参数制定在哪个时候确定跳出去了优化了

- 评论人:hyzhang83   2006-08-08 15:07:27   hyzhang83的博客  

不太明白,在计算适应度函数那一块要是用罚函数法的话怎么写呢,不知道罚函数怎么确定。

- 评论人:西夏文   2006-07-04 16:34:44   西夏文的博客  

什么也不能解决啊

- 评论人:蔓延   2006-06-29 16:10:20   

这个遗传算法目的是解决什么啊?

- 评论人:西夏文   2006-06-15 00:17:59   西夏文的博客  

这里的程序是没有错误的,只是对于某个特殊的题目的,不是对于其他的题目,所以我也不会给出什么答案的,至于写程序吗?是不可能的,因为不太可能再次接触那个算法了

- 评论人:西夏文   2006-06-15 00:14:20   西夏文的博客  

评论人:一品冰红茶 2006-06-14 15:18:50  
有没有人有《遗传算法在旅行商问题》的源程序啊!有请于我联系

帮帮忙!!!!谢谢
可能会写,但是不会那么精神去写的

- 评论人:西夏文   2006-06-15 00:13:31   西夏文的博客  

直接赋值啊

- 评论人:一品冰红茶   2006-06-14 15:18:50   

有没有人有《遗传算法在旅行商问题》的源程序啊!有请于我联系

帮帮忙!!!!谢谢

- 评论人:一品冰红茶   2006-06-14 15:15:35   

有没有人有《遗传算法在旅行商问题》的源程序啊!有请于我联系

- 评论人:vfdff   2006-06-11 00:06:31   

double Upper_Array[Upper_Num][35]={


4,3,2,3,4,4,3,1,3,4,2,1,0,1,2,3.5,5,17,15,15,14,12,13,13,15,9,10,11,12,13,13,11,13,10,12,5,4,3,4,5,5,4,2,2,3,3,2,1,0,1,2.5,4,16,14,14,13,11,12,12,14,8,9,10,11,12,12,10,12,9,11,6,5,4,5,4,6,5,3,3,2,4,3,2,1,0,1.5,3,15,13,13,17,10,11,11,13,7,8,9,10,11,11,9,11,8,10,


7.5,6.5,5.5,6.5,5.5,7.5,6.5,4.5,4.5,3.5,5.5,4.5,3.5,2.5,


1.5,0,1.5,13.5,11.5,11.5,10.5,8.5,9.5,9.5,11.5,5.5,6.5,7.5,8.5,9.5,9.5,7.5,9.5,6.5,8.5,9,8,7,6,5,9,8,6,6,5,7,6,5,4,3,1.5,0,12,10,10,9,7,8,8,10,4,5,6,7,8,8,6,8,5,7


};这个定义的有问题

- 评论人:xixiawen   2006-06-02 10:58:48   

不会吧,你这么简单的不会吗?那你还怎用复杂的东西编程!其实那个用MATLAB就可以解决了,干什么一定要遗传算法呢?

- 评论人:唯我独坏   2006-06-01 21:28:22   

作者 你能不能帮我解决一下这个遗传算法问题:
用遗传算法求解f(x)=x*cosx+2的最大值

- 评论人:西夏文   2006-05-25 23:36:27   西夏文的博客  

在这里有哪个题目的,需要的话留下联系方式,我尽力帮助了!
在网站里面有遗传算法的思想!
每一个题目的揭发是把相同的
所以要自己去想

- 评论人:西夏文   2006-05-25 23:33:07   西夏文的博客  

需要的见其他的思想算法,如有需要,留下联系方式,我会尽力解答

- 评论人:西夏文   2006-05-25 23:25:55   西夏文的博客  

那好的,我上传一下遗传算法的思想,就是在未来的选择,选择最优秀的种子,在不断的选择之中,可以用模拟退火去选择最优的解,但是只是局部最优,不一定是最好的结果!

- 评论人:至诚致远   2006-05-25 20:40:56   

请问这个算法的题目是什么啊,能指点下吗

- 评论人:xixiawen   2006-05-24 21:46:42   

其实那是我在建摸的时候对一到题目的算法,希望你只要理解意思,不要全部的看就知道了,遗传算法是一种结构,也是长用的算法,但是很落后!所以在整整比赛的时候不要用!

- 评论人:xixiawen   2006-05-24 21:46:04   

其实那是我在建摸的时候对一到题目的算法,希望你只要理解意思,不要全部的看就知道了,遗传算法是一种结构,也是长用的算法,但是很落后!所以在整整比赛的时候不要用!

- 评论人:greatbird007   2006-05-20 20:44:47   greatbird007的博客  

作者的算法很清晰,不过我能看懂每个函数干吗用,却始终不明白该算法在解决什么问题,希望作者明示.

- 评论人:xixiawen   2006-04-14 18:49:36   

很多时候都是在一瞬间想出来,就是那些程序

- 评论人:小高   2006-04-13 12:11:11   

想知道这个程序的题目是什么?能指点一下吗?有急用,谢谢

- 评论人:xiaxiawen   2006-04-11 22:52:37   

自己去想啊

- 评论人:xixiawen   2006-03-17 19:25:57   

这个好像在这个网站里面有题目的。

- 评论人:84微笑的鱼   2006-03-17 18:07:44   

请问这个算法的题目是什么啊,能指点下吗

验证码:   
评论内容: