哪位高人帮忙看看这段程序是哪儿出现了问题呀?
十一前一个选修课上,老师讲了个遗传算法,同时让我们谈谈遗传算法在生活中的应用,并要交篇论文(貌似现在的老师都爱我们交论文),于是上网选了篇论文,确定了大致的题材,写了个程序。
但是这个程序最终没能正确的在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




