Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Runtime error occur in vc

Reply
Thread Tools

Runtime error occur in vc

 
 
Baby Lion
Guest
Posts: n/a
 
      03-29-2007
hi,everyone ,
one Runtime error occur when running , maybe it's about assigning
memory .
I need your help , thanks.
It's about the travelling sellman problem .

//#include "stdafx.h"

//TSP问题的解法
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include "assert.h"
#include "iostream"
using namespace std;
struct city{
double x,y;};
city * cities;
double * dis;
double random1()//返回[0,1)之间的double
{
return ((double)rand())/RAND_MAX;
}
/*
template <class T>
void swap( T& a, T& b)

{ T c = a; a = b; b=c;}*/
int random()
{ return rand();}
inline double distance(int CityCnt, char a, char b)
{
double disX = cities[a].x -cities[b].x;
double disY = cities[a].y -cities[b].y;
return sqrt(disX*disX+disY*disY);
}

class Generation;
class Member{
public:
char * bytes;//染色体
double dist;
static int Length ; // to denote using how many bytes
static double p; //变异概率
Member(const Member &a) ;
Member();
~Member();
void bianyi();
double Adaptablity (double miniS); //告诉这一代的最短路径,求Adaptability
void diyidai();
void birth(Generation& g);
double Dis();
Member& operator=(Member& x);
};
class Generation {
public:
static int msize; // mn means MemberSize(种群的大小)
int GCount; //记录现在处于第几代
double * board; //轮盘
static double p; // 变异机会
class Member * members; //个体数组
double miniS;//当前代的最短路程
double CalcMiniDis();
void PrintAllDis();
void CalcDis();
void setBoard(); //设置论盘
void PrintBoard();
void jiaocha(Member & a, Member & b); //交叉
void bianyi();//个体变异
void FG();
Generation& birth();

~Generation(){ delete [] board; delete[] members;}
Generation(){
board = new double[msize];
members = new Member[msize];
}
};
void Generation::CalcDis()
{
for(int i=0;i<msize;i++)
members[i].dist = members[i].Dis();
}
double Generation::CalcMiniDis()
{
double s =members[0].dist;
for(int i=0;i<msize;i++)
{
if(s>members[i].dist) s=members[i].dist;
}
this->miniS= s;
return s;
}

void Generation:rintBoard()
{
cout<<endl;
for(int i=0;i<msize;i++)
cout<<board[i]<< " ";
cout<<endl;
}
void Generation::bianyi()
{
for(int i=1;i<Generation::msize;i++)
{
this->members[i].bianyi();
}
}

Member::~Member()
{
delete []bytes;
}
Member::Member(const Member &a)
{
this->bytes = new char[Length];
for(int i =0 ;i<Member::Length;i++)
{ this->bytes[i] = a.bytes[i];}
}
void Member::bianyi() //变异
{
double p1=random1();
while (p1<p)
{
int x1 = rand()%Member::Length; int x2 = rand()%Member::Length;
swap<char>(bytes[x1],bytes[x2]);
p1 = random1();
}
//
cout<<endl;
for(int i=0;i<Member::Length;i++)
{ cout<<(int)bytes[i]<<" ";}
cout<<endl;
}

void Member::diyidai() //第一代的members
{
int i,j;
for( i=0;i<Member::Length;i++)
{bytes[i] = i;}
for( i=0;i<Member::Length;i++)
{ j = random()%Member::Length; swap<char>(bytes[i],bytes[j]);}
//
cout<<endl;
for(i=0;i<Member::Length;i++)
{ cout<<(int)bytes[i]<<" ";}
cout<<endl;
}
Member::Member()
{
bytes = new char[Member::Length];
}
void Generation:rintAllDis()
{
cout<<endl;
for(int i=0;i<Generation::msize;i++)
cout<<members[i].dist<<" ";
cout<<endl;
}
inline double Member:is()
{
double s = 0 ;
for(int i=0;i<Length-1;i++)
{ double temp = dis[bytes[i]*Member::Length+bytes[i+1]];
s+=temp;
}
s+= dis[bytes[0]*Member::Length+bytes[Member::Length]];
this->dist = s;
return s;
}
inline double Member::Adaptablity(double miniS)//计算适应度 //为总路程的平方的倒数
{ double s =this->dist;
s -= 0.9 * miniS; s*=s;
return 1000000/s;
}




void Generation::FG() //FirstGeneration
{
for(int i = 0; i<Generation::msize;i++)
members[i].diyidai();
}
Generation& Generation::birth()
{
Generation * child = new Generation();
for(int i=0;i<msize;i++)
{
double p1 = random1();
int j;
for(j=0;j<Generation::msize && this->board[j]<p1;j++);
//delete[] child->members[i].bytes;
child->members[i] = this->members[j];
cout<<i<<endl;
}
return *child;
}
Member& Member:perator=(Member& x) //
{
if(this->bytes != NULL) delete[] this->bytes;
if(NULL==(this->bytes = new char[Member::Length])) cout<<"memory
error";
for(int i=0;i<Member::Length;i++)
this->bytes[i]=x.bytes[i];
return *this;
}
void Generation::jiaocha(Member &a,Member &b) //交叉
{
//
cout<<"positionxxx"<<endl;
cout<<endl;
for(int p=0;p<Member::Length;p++) cout<<(int)b.bytes[p]<<" ";
cout<<endl;
bool *flagA=new bool[Member::Length];
bool *flagB=new bool[Member::Length];
memset(flagA,0,sizeof(flagA));
memset(flagB,0,sizeof(flagB));
char * Abytes = new char[Member::Length];
char * Bbytes = new char[Member::Length];
for(int i=0;i<Member::Length;i++)
{Abytes[i]=a.bytes[i];Bbytes[i]=b.bytes[i];}
int x1 = random()%Member::Length;
int x2 = random()%Member::Length;
if(x1>x2) swap<int>(x1,x2);
i=x1;int j=0;
for(;i<=x2;i++,j++)
{ Abytes[j]=a.bytes[i];Bbytes[j]=a.bytes[i];
flagA[Abytes[j]]=true; flagB[Bbytes[j]]=true;}
int j1=j,j2=j;
for(int k=0;k<Member::Length;k++)
{
char temp = b.bytes[k];
if(flagA[temp]==false) Abytes[j1++] =temp;
} assert(j1==Member::Length);
for(k=0;k<Member::Length;k++)
{
char temp = a.bytes[k];
if(flagB[temp]==false) Bbytes[j2++] = temp;
} assert(j2==Member::Length);
delete[] a.bytes;
delete[] b.bytes;
a.bytes = Abytes; b.bytes = Bbytes;
delete [] flagA; delete [] flagB;

}
void Generation::setBoard()
{ double s = 0;
for(int i=0;i<msize;i++)
{ s+=members[i].Adaptablity(this->miniS); board[i]=s;}
for(i=0;i<msize;i++)//normalize
{ board[i]/=board[msize-1];}
}
//DEL void Generation::Init()
//DEL {
//DEL
//DEL }

int Member::Length=0;
double Member: = 0.1;
int Generation::msize = 10;
void main()
{
freopen("f:\\oliver30.txt","r",stdin);
srand((int)time(0));
int CntCity,i,j;
cin>>CntCity;
Member::Length = CntCity;
cities = new city[CntCity];
double temp;
for( i=0;i<CntCity;i++)
{ cin>>temp>>cities[i].x>>cities[i].y>>temp;}
for(i=0;i<CntCity;i++)
{cout<<cities[i].x<<" "<<cities[i].y<<endl;}
dis = new double[CntCity*CntCity]; //done
for(i=0;i<CntCity;i++)
{
for(j=0;j<CntCity;j++)
{ dis[i*CntCity+j]= distance(CntCity,(char)i,(char)j);
cout<<dis[i*CntCity+j]<<" ";}cout<<endl;
}

Generation * g1 = new Generation(),gt;
g1->FG();g1->CalcDis();g1->CalcMiniDis();
g1->setBoard();g1->PrintAllDis();g1->PrintBoard();

for(i=0;i<=100;i++)
{
Generation * g2 = &(g1->birth());
for(j=0;j<Generation::msize/2;j++)
{g2->jiaocha(g2->members[i],g2->members[i+Generation::msize]);}
g2->CalcDis();
g2->CalcMiniDis();
g2->setBoard();
g2->PrintAllDis();
g2->PrintBoard();
cout<<g1->miniS<<endl;
delete g1;
cout<<" xxxxxxxxxxxx"<<endl;
g1 = g2;
}


}







//#include "stdafx.h"

//TSP问题的解法
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include "assert.h"
#include "iostream"
using namespace std;
struct city{
double x,y;};
city * cities;
double * dis;
double random1()//返回[0,1)之间的double
{
return ((double)rand())/RAND_MAX;
}
/*
template <class T>
void swap( T& a, T& b)

{ T c = a; a = b; b=c;}*/
int random()
{ return rand();}
inline double distance(int CityCnt, char a, char b)
{
double disX = cities[a].x -cities[b].x;
double disY = cities[a].y -cities[b].y;
return sqrt(disX*disX+disY*disY);
}

class Generation;
class Member{
public:
char * bytes;//染色体
double dist;
static int Length ; // to denote using how many bytes
static double p; //变异概率
Member(const Member &a) ;
Member();
~Member();
void bianyi();
double Adaptablity (double miniS); //告诉这一代的最短路径,求Adaptability
void diyidai();
void birth(Generation& g);
double Dis();
Member& operator=(Member& x);
};
class Generation {
public:
static int msize; // mn means MemberSize(种群的大小)
int GCount; //记录现在处于第几代
double * board; //轮盘
static double p; // 变异机会
class Member * members; //个体数组
double miniS;//当前代的最短路程
double CalcMiniDis();
void PrintAllDis();
void CalcDis();
void setBoard(); //设置论盘
void PrintBoard();
void jiaocha(Member & a, Member & b); //交叉
void bianyi();//个体变异
void FG();
Generation& birth();

~Generation(){ delete [] board; delete[] members;}
Generation(){
board = new double[msize];
members = new Member[msize];
}
};
void Generation::CalcDis()
{
for(int i=0;i<msize;i++)
members[i].dist = members[i].Dis();
}
double Generation::CalcMiniDis()
{
double s =members[0].dist;
for(int i=0;i<msize;i++)
{
if(s>members[i].dist) s=members[i].dist;
}
this->miniS= s;
return s;
}

void Generation:rintBoard()
{
cout<<endl;
for(int i=0;i<msize;i++)
cout<<board[i]<< " ";
cout<<endl;
}
void Generation::bianyi()
{
for(int i=1;i<Generation::msize;i++)
{
this->members[i].bianyi();
}
}

Member::~Member()
{
delete []bytes;
}
Member::Member(const Member &a)
{
this->bytes = new char[Length];
for(int i =0 ;i<Member::Length;i++)
{ this->bytes[i] = a.bytes[i];}
}
void Member::bianyi() //变异
{
double p1=random1();
while (p1<p)
{
int x1 = rand()%Member::Length; int x2 = rand()%Member::Length;
swap<char>(bytes[x1],bytes[x2]);
p1 = random1();
}
//
cout<<endl;
for(int i=0;i<Member::Length;i++)
{ cout<<(int)bytes[i]<<" ";}
cout<<endl;
}

void Member::diyidai() //第一代的members
{
int i,j;
for( i=0;i<Member::Length;i++)
{bytes[i] = i;}
for( i=0;i<Member::Length;i++)
{ j = random()%Member::Length; swap<char>(bytes[i],bytes[j]);}
//
cout<<endl;
for(i=0;i<Member::Length;i++)
{ cout<<(int)bytes[i]<<" ";}
cout<<endl;
}
Member::Member()
{
bytes = new char[Member::Length];
}
void Generation:rintAllDis()
{
cout<<endl;
for(int i=0;i<Generation::msize;i++)
cout<<members[i].dist<<" ";
cout<<endl;
}
inline double Member:is()
{
double s = 0 ;
for(int i=0;i<Length-1;i++)
{ double temp = dis[bytes[i]*Member::Length+bytes[i+1]];
s+=temp;
}
s+= dis[bytes[0]*Member::Length+bytes[Member::Length]];
this->dist = s;
return s;
}
inline double Member::Adaptablity(double miniS)//计算适应度 //为总路程的平方的倒数
{ double s =this->dist;
s -= 0.9 * miniS; s*=s;
return 1000000/s;
}




void Generation::FG() //FirstGeneration
{
for(int i = 0; i<Generation::msize;i++)
members[i].diyidai();
}
Generation& Generation::birth()
{
Generation * child = new Generation();
for(int i=0;i<msize;i++)
{
double p1 = random1();
int j;
for(j=0;j<Generation::msize && this->board[j]<p1;j++);
//delete[] child->members[i].bytes;
child->members[i] = this->members[j];
cout<<i<<endl;
}
return *child;
}
Member& Member:perator=(Member& x) //
{
if(this->bytes != NULL) delete[] this->bytes;
if(NULL==(this->bytes = new char[Member::Length])) cout<<"memory
error";
for(int i=0;i<Member::Length;i++)
this->bytes[i]=x.bytes[i];
return *this;
}
void Generation::jiaocha(Member &a,Member &b) //交叉
{
//
cout<<"positionxxx"<<endl;
cout<<endl;
for(int p=0;p<Member::Length;p++) cout<<(int)b.bytes[p]<<" ";
cout<<endl;
bool *flagA=new bool[Member::Length];
bool *flagB=new bool[Member::Length];
memset(flagA,0,sizeof(flagA));
memset(flagB,0,sizeof(flagB));
char * Abytes = new char[Member::Length];
char * Bbytes = new char[Member::Length];
for(int i=0;i<Member::Length;i++)
{Abytes[i]=a.bytes[i];Bbytes[i]=b.bytes[i];}
int x1 = random()%Member::Length;
int x2 = random()%Member::Length;
if(x1>x2) swap<int>(x1,x2);
i=x1;int j=0;
for(;i<=x2;i++,j++)
{ Abytes[j]=a.bytes[i];Bbytes[j]=a.bytes[i];
flagA[Abytes[j]]=true; flagB[Bbytes[j]]=true;}
int j1=j,j2=j;
for(int k=0;k<Member::Length;k++)
{
char temp = b.bytes[k];
if(flagA[temp]==false) Abytes[j1++] =temp;
} assert(j1==Member::Length);
for(k=0;k<Member::Length;k++)
{
char temp = a.bytes[k];
if(flagB[temp]==false) Bbytes[j2++] = temp;
} assert(j2==Member::Length);
delete[] a.bytes;
delete[] b.bytes;
a.bytes = Abytes; b.bytes = Bbytes;
delete [] flagA; delete [] flagB;

}
void Generation::setBoard()
{ double s = 0;
for(int i=0;i<msize;i++)
{ s+=members[i].Adaptablity(this->miniS); board[i]=s;}
for(i=0;i<msize;i++)//normalize
{ board[i]/=board[msize-1];}
}
//DEL void Generation::Init()
//DEL {
//DEL
//DEL }

int Member::Length=0;
double Member: = 0.1;
int Generation::msize = 10;
void main()
{
freopen("f:\\oliver30.txt","r",stdin);
srand((int)time(0));
int CntCity,i,j;
cin>>CntCity;
Member::Length = CntCity;
cities = new city[CntCity];
double temp;
for( i=0;i<CntCity;i++)
{ cin>>temp>>cities[i].x>>cities[i].y>>temp;}
for(i=0;i<CntCity;i++)
{cout<<cities[i].x<<" "<<cities[i].y<<endl;}
dis = new double[CntCity*CntCity]; //done
for(i=0;i<CntCity;i++)
{
for(j=0;j<CntCity;j++)
{ dis[i*CntCity+j]= distance(CntCity,(char)i,(char)j);
cout<<dis[i*CntCity+j]<<" ";}cout<<endl;
}

Generation * g1 = new Generation(),gt;
g1->FG();g1->CalcDis();g1->CalcMiniDis();
g1->setBoard();g1->PrintAllDis();g1->PrintBoard();

for(i=0;i<=100;i++)
{
Generation * g2 = &(g1->birth());
for(j=0;j<Generation::msize/2;j++)
{g2->jiaocha(g2->members[i],g2->members[i+Generation::msize]);}
g2->CalcDis();
g2->CalcMiniDis();
g2->setBoard();
g2->PrintAllDis();
g2->PrintBoard();
cout<<g1->miniS<<endl;
delete g1;
cout<<" xxxxxxxxxxxx"<<endl;
g1 = g2;
}


}

 
Reply With Quote
 
 
 
 
Baby Lion
Guest
Posts: n/a
 
      03-29-2007
// this is the oliver30.txt file
30
0 4.1 9.4 1
1 3.7 8.4 2
2 5.4 6.7 1
3 2.5 6.2 3
4 0.7 6.4 1
5 0.2 9.9 0
6 6.8 5.8 2
7 7.1 4.4 1
8 5.4 6.2 0
9 8.3 6.9 2
10 6.4 6 1
11 1.8 5.4 0
12 2.2 6 1
13 8.3 4.6 0
14 9.1 3.8 1
15 2.5 3.8 3
16 2.4 4.2 0
17 5.8 6.9 0
18 7.1 7.1 0
19 7.4 7.8 0
20 8.7 7.6 1
21 1.8 4 0
22 1.3 4 2
23 8.2 7 1
24 6.2 3.2 1
25 5.8 3.5 0
26 4.5 2.1 0
27 4.1 2.6 1
28 4.4 3.5 0
29 0.4 5 1

 
Reply With Quote
 
 
 
 
=?UTF-8?B?RXJpayBXaWtzdHLDtm0=?=
Guest
Posts: n/a
 
      03-29-2007
On 2007-03-29 20:07, Baby Lion wrote:
> hi,everyone ,
> one Runtime error occur when running , maybe it's about assigning
> memory .
> I need your help , thanks.
> It's about the travelling sellman problem .


Run it through the debugger.

--
Erik Wikstr枚m
 
Reply With Quote
 
David Harmon
Guest
Posts: n/a
 
      03-29-2007
On 29 Mar 2007 11:07:10 -0700 in comp.lang.c++, "Baby Lion"
<(E-Mail Removed)> wrote,
> for(;i<=x2;i++,j++)
> { Abytes[j]=a.bytes[i];Bbytes[j]=a.bytes[i];


That second a.bytes looks suspicious.

The whole program is impossible to understand.
Please re-write it so that everything is clear and straightforward.


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Why occur the mistake in runtime about strtok()? hu C Programming 8 06-19-2006 01:53 PM
how to close sqldatareader when error occur mimi ASP .Net 4 07-21-2005 07:12 PM
"fatal error CS0042" occur while compilling project David zhu ASP .Net 1 08-19-2004 09:46 AM
Show 4 Records that occur more often...and how often they occur. Miguel Dias Moura ASP .Net 4 05-06-2004 03:40 PM
run java web start occur error Jack zhao Java 1 11-04-2003 12:52 PM



Advertisments