Runtime error occur in vc

Discussion in 'C++' started by Baby Lion, Mar 29, 2007.

  1. Baby Lion

    Baby Lion Guest

    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.x;
    double disY = cities[a].y -cities.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.dist = members.Dis();
    }
    double Generation::CalcMiniDis()
    {
    double s =members[0].dist;
    for(int i=0;i<msize;i++)
    {
    if(s>members.dist) s=members.dist;
    }
    this->miniS= s;
    return s;
    }

    void Generation::printBoard()
    {
    cout<<endl;
    for(int i=0;i<msize;i++)
    cout<<board<< " ";
    cout<<endl;
    }
    void Generation::bianyi()
    {
    for(int i=1;i<Generation::msize;i++)
    {
    this->members.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 = a.bytes;}
    }
    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<<" ";}
    cout<<endl;
    }

    void Member::diyidai() //µÚÒ»´úµÄmembers
    {
    int i,j;
    for( i=0;i<Member::Length;i++)
    {bytes = i;}
    for( i=0;i<Member::Length;i++)
    { j = random()%Member::Length; swap<char>(bytes,bytes[j]);}
    //
    cout<<endl;
    for(i=0;i<Member::Length;i++)
    { cout<<(int)bytes<<" ";}
    cout<<endl;
    }
    Member::Member()
    {
    bytes = new char[Member::Length];
    }
    void Generation::printAllDis()
    {
    cout<<endl;
    for(int i=0;i<Generation::msize;i++)
    cout<<members.dist<<" ";
    cout<<endl;
    }
    inline double Member::Dis()
    {
    double s = 0 ;
    for(int i=0;i<Length-1;i++)
    { double temp = dis[bytes*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.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.bytes;
    child->members = this->members[j];
    cout<<i<<endl;
    }
    return *child;
    }
    Member& Member::eek: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=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::p = 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::printBoard()
    {
    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::printAllDis()
    {
    cout<<endl;
    for(int i=0;i<Generation::msize;i++)
    cout<<members[i].dist<<" ";
    cout<<endl;
    }
    inline double Member::Dis()
    {
    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::eek: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::p = 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;
    }


    }[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/b][/b][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
    Baby Lion, Mar 29, 2007
    #1
    1. Advertising

  2. Baby Lion

    Baby Lion Guest

    // 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
    Baby Lion, Mar 29, 2007
    #2
    1. Advertising

  3. 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
    =?UTF-8?B?RXJpayBXaWtzdHLDtm0=?=, Mar 29, 2007
    #3
  4. Baby Lion

    David Harmon Guest

    On 29 Mar 2007 11:07:10 -0700 in comp.lang.c++, "Baby Lion"
    <> wrote,
    > for(;i<=x2;i++,j++)
    > { Abytes[j]=a.bytes;Bbytes[j]=a.bytes;


    That second a.bytes looks suspicious.

    The whole program is impossible to understand.
    Please re-write it so that everything is clear and straightforward.
    David Harmon, Mar 29, 2007
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Miguel Dias Moura
    Replies:
    4
    Views:
    437
    Hans Kesting
    May 6, 2004
  2. David zhu
    Replies:
    1
    Views:
    2,967
    David Zhu
    Aug 19, 2004
  3. mimi
    Replies:
    4
    Views:
    5,735
  4. Jack zhao

    run java web start occur error

    Jack zhao, Nov 4, 2003, in forum: Java
    Replies:
    1
    Views:
    403
    Andrew Thompson
    Nov 4, 2003
  5. hu
    Replies:
    8
    Views:
    395
    John Bode
    Jun 19, 2006
Loading...

Share This Page