CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  模式及实现

哪位高人帮忙看看这段程序是哪儿出现了问题呀?

楼主riverbeast()2006-10-04 13:10:55 在 C/C++ / 模式及实现 提问

十一前一个选修课上,老师讲了个遗传算法,同时让我们谈谈遗传算法在生活中的应用,并要交篇论文(貌似现在的老师都爱我们交论文),于是上网选了篇论文,确定了大致的题材,写了个程序。  
   
  但是这个程序最终没能正确的在VC++6.0中通过,尽管没有错误和警告。调试了很长时间依然没能发现问题所在(5555   水平不够呀!)。  
  十一后就要交论文了,程序没通过可不好办哪!!!  
   
  哪位高人帮忙看看,小弟拜托哪!  
   
  代码在网上看的不方便,希望各路高手留下一个邮箱,小弟跟你们把网上找到的论文、我写的代码和说明一并发过去,谢了谢了!  
   
   
  //Genetic_Algorithms.h  
   
  #include<iostream>  
  using   namespace   std;  
   
  class   Customer  
  {  
  public:  
  unsigned   sex;  
  unsigned   age;  
  unsigned   education_degree;  
  unsigned   marriage;  
  private:  
  double   Owe_Money_Frequency;  
  public:  
  int   Number_As_Credit();  
  Customer(unsigned   s=1,unsigned   a=1,unsigned   edu=1,unsigned   marry=1,double   Owe_Money=0.0)  
  :sex(s),age(a),education_degree(edu),marriage(marry),Owe_Money_Frequency(Owe_Money)  
  {};  
  };  
   
  int   Customer::Number_As_Credit()  
  {  
  int   num=(int)(Owe_Money_Frequency*17+4);    
  return   num;  
  }  
   
   
  //String_Type.h  
  #include<iostream>  
  using   namespace   std;  
   
  static   const   int   kAllocSize=20;  
   
  class   String  
  {  
  public:  
  String();  
  ~String();  
  int&   operator[](int   x);  
  String&   operator=(String&   str);  
  int   operator==(String&   str);  
  void   resize(int   newSize);  
   
  int*   mElems;  
  int   mSize;  
  };  
   
  String::String()  
  {  
  mSize=kAllocSize;  
  mElems=new   int[mSize];  
  }  
   
  String::~String()  
  {  
  delete   []   mElems;  
  }  
   
  void   String::resize(int   newSize)  
  {  
  int*   newElems=new   int[newSize];  
  for(int   i=0;i<newSize;i++)  
  newElems[i]=mElems[i];  
  mSize=newSize;  
  delete   []   mElems;  
  mElems=newElems;  
  }  
   
  int&   String::operator   [](int   x)  
  {  
  if(x<0)  
  //抛出一个异常,我在这里使用的是系统预定义的抛出错误函数;  
  throw   out_of_range("   ");  
  if(x>=mSize)  
  resize(x+kAllocSize);  
  return   mElems[x];  
  }  
   
  String&   String::operator   =(String&   str)  
  {  
  if(this==&str)   return   *this;  
  delete   this->mElems;  
  if(this->mSize!=str.mSize)  
  {  
  this->mSize=str.mSize;  
  this->resize(str.mSize);  
  }  
  // this->mElems=str.mElems;(这个语句写错了!不可以将指针直接指向它!BUG所在呀!)  
   
  for(int   i=0;i<(this->mSize);i++)  
  this->mElems[i]=str.mElems[i];  
  return   *this;  
  }  
   
  int   String::operator   ==(String&   str)  
  {  
  int   num=0;  
  for(int   i=0;i<15;i++)  
  {  
  if(this->mElems[i]==str.mElems[i])  
  num++;  
  }  
   
  if(num==15)   return   1;  
  else   return   0;  
  }  
   
   
   
  //Genetic_Main.cpp  
  #include"Genetic_Algorithms.h"  
  #include"String_Type.h"  
  #include<stdlib.h>  
  #include<time.h>  
  using   namespace   std;  
   
  void   Crossover(String   credit1,String   credit2,String&   credit)  
  {  
  credit=credit1;  
  //(此程序中,String类型变量总共只需用到15位,所以开始替换的位数只能是从2到15)  
  srand((unsigned)time(NULL));  
  int   i=rand()%14;int   j;  
   
  for(j=i+1;j<15;j++)  
  credit[j]=credit2[j];  
  }  
   
  void   Mutation(String   credit1,String&   credit)  
  {  
  credit=credit1;  
  srand((unsigned)time(NULL));  
  int   i=rand()%15;int   j;  
   
  if(i<2)   j=1;  
  else   if(i<7)   j=2;  
  else   if(i<13)j=3;  
  else   j=4;  
   
  switch(j)  
  {  
  case   1:credit[i]=rand()%3+1;break;  
  case   2:credit[i]=rand()%6+1;break;  
  case   3:credit[i]=rand()%8+1;break;  
  case   4:credit[i]=rand()%4+1;break;  
  }  
  }  
   
  //计算信用度参数credit和实际的信用度资料的差别程度,我选用的是以平方之和来表示偏差  
  int   Availability(String   credit)  
  {  
  //客户具体信息请看"程序说明.txt"  
  Customer   people[10]={Customer(1,1,2,2,0.2),Customer(1,2,6,1,0.3),Customer(1,3,4,1,0.2),Customer(1,4,3,1,0.1),Customer(1,5,2,1,0.4),Customer(2,1,2,2,0.1),Customer(2,2,6,1,0.2),Customer(2,3,4,1,0.2),Customer(2,4,3,1,0.1),Customer(2,5,2,1,0.5)};  
   
  int   num[10]={0,0,0,0,0,0,0,0,0,0};  
  int   available=0;  
  for(int   i=0;i<10;i++)  
  num[i]=credit[people[i].sex-1]+credit[people[i].age+1]+credit[people[i].education_degree+6]+credit[people[i].marriage+12];  
  for(i=0;i<10;i++)  
  available+=(num[i]-people[i].Number_As_Credit())*(num[i]-people[i].Number_As_Credit());  
   
  return   available;  
  }  
   
  void   Insert_Sort(String*   credit)  
  {  
  //使用直接插入排序将credit演化池中信用度参数排序,最后是按照Availability从小到大排列;  
  //Availability越小越好;  
  int   i,j,k;  
  String   x;  
  for   (i=1;i<60;i++)  
  {  
  x=credit[i];  
   
  for   (j=0;(Availability(credit[i])>Availability(credit[j]))   &&   (j<i);j++);  
  for   (k=i;k>j;k--)  
  credit[k]=credit[k-1];  
  credit[j]=x;  
  }  
  }  
   
   
  String   Get_Init_Credit_Using_GA()  
  {  
  //这将作为演化池,每个演化池中有30个信用参数对  
  String   str_Credit[60];  
   
  const   double   Crossover_Frequency=0.85;  
  const   double   Mutation_Frequency=0.15;  
   
  srand((unsigned)time(NULL));  
  int   i,j;  
  for(i=0;i<30;i++)  
  {  
  str_Credit[i][0]=rand()%3+1;  
  str_Credit[i][1]=rand()%3+1;  
  }  
  for(i=0;i<30;i++)  
  {  
  for(j=2;j<7;j++)   str_Credit[i][j]=rand()%6+1;  
  }  
  for(i=0;i<30;i++)  
  {  
  for(j=7;j<13;j++)   str_Credit[i][j]=rand()%8+1;  
  }  
  for(i=0;i<30;i++)  
  {  
  for(j=13;j<15;j++)   str_Credit[i][j]=rand()%4+1;  
  }  
   
  int   m,n;  
  int   available_num=0,num=0;  
  String   credit,cred[30];  
  while(available_num<=5)  
  {  
  for(i=30;i<60;i++)  
  {  
  if(((rand()%100+1)/100)<=Crossover_Frequency)  
  {  
  m=rand()%30;n=rand()%30;  
  Crossover(str_Credit[m],str_Credit[n],cred[i-30]);  
  str_Credit[i]=cred[i-30];  
  }  
  else  
  {  
  m=rand()%30;  
  Mutation(str_Credit[m],cred[i-30]);  
  str_Credit[i]=cred[i-30];  
  }  
  }  
   
  Insert_Sort(str_Credit);  
   
  if(num==0)   credit=str_Credit[0];  
  else  
  {  
  if(str_Credit[0]==credit)   available_num++;  
  else   available_num=0;  
  }  
  }  
   
  return   credit;  
  }  
   
  int   main()  
  {  
  String   Available_Init_Credit=Get_Init_Credit_Using_GA();  
  for(int   i=0;i<15;i++)  
  cout<<Available_Init_Credit.mElems[i];  
  cout<<endl;  
  return   0;  
  }  
   
   
  问题点数:20、回复次数:1Top

1 楼riverbeast()回复于 2006-10-04 15:15:07 得分 0

啊哈   解决了   错误被搞定了!爽哪!尽管我并不确定的知道问题出在哪……呵呵呵Top

相关问题

关键词

得分解答快速导航

  • 帖主:riverbeast

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo