有没有高手达人把下面的c++写的遗传算法改成c#啊!(急用啊)

软件和网站开发以及相关技术探讨
回复
头像
westlifelz
帖子: 31
注册时间: 2007-03-25 14:18
来自: 温州大学
联系:

有没有高手达人把下面的c++写的遗传算法改成c#啊!(急用啊)

#1

帖子 westlifelz » 2007-04-05 20:13

代码: 全选

#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++;
   }
}
上次由 westlifelz 在 2007-04-05 20:53,总共编辑 1 次。
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#2

帖子 bones7456 » 2007-04-05 20:17

先把你的格式弄好啊!
关注我的blog: ε==3
头像
westlifelz
帖子: 31
注册时间: 2007-03-25 14:18
来自: 温州大学
联系:

#3

帖子 westlifelz » 2007-04-05 20:56

我刚才修改了一下,主要刚才复制黏贴的时候格式弄乱了,请高手们将就一下吧
头像
titainium
帖子: 689
注册时间: 2006-12-02 12:25

#4

帖子 titainium » 2007-04-06 22:02

偶只会c++,谢了啊。
Titainium
Runner
帖子: 183
注册时间: 2006-10-04 23:16

#5

帖子 Runner » 2007-04-06 22:54

貌似除了数组声明和cout以外没什么好改的嘛,
楼主会C++的话,学C#肯定不会觉得复杂的。
头像
westlifelz
帖子: 31
注册时间: 2007-03-25 14:18
来自: 温州大学
联系:

#6

帖子 westlifelz » 2007-04-07 13:36

感觉改得好痛苦啊,像struct这些是改成类好还是什么头都大了
wkt
帖子: 849
注册时间: 2006-09-07 22:51
联系:

#7

帖子 wkt » 2007-04-07 13:55

你最好把你的意图说一下!!
否则,看代码时,还要想你要干什么??
说意图后 ,看时就只需对照
头像
stlxv
论坛版主
帖子: 8275
注册时间: 2006-05-03 0:39
来自: المريخ

#8

帖子 stlxv » 2007-04-10 12:26

很简单地

#define改成const static
struct改成class
然后把所有的包括在同一个类里面,相应该怎么改就怎么改

你的程序怎么有表情图表?
PHP是最好的语言!不服来战!
头像
westlifelz
帖子: 31
注册时间: 2007-03-25 14:18
来自: 温州大学
联系:

#9

帖子 westlifelz » 2007-04-10 16:34

好谢谢!偶试下
回复