Thread: Error when trying to run program

  1. #1
    Registered User
    Join Date
    Apr 2006
    Posts
    10

    Error when trying to run program

    I keep getting a stack fault error when trying to run my GA. It compiles fine. No idea what is causing it. Im using borland C++ 5.02.
    Here is my code:

    Code:
    #include <iostream.h>
    #include <fstream.h>
    #include <cstring.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    #include <ctype.h>
    
    
    #define  Population 100
    #define  Dimension 3
    #define  Chrome_Length 5
    #define  Lval 1.5
    #define  Mval 10
    #define Crossover_Rate 700
    #define Mutation_Rate  100
    #define Lifecycle 100
    #define file "C:\\Average.csv"
    
    
    
    //Function Prototypes
    
    
    void Random_Number_Generator(int MAX, float Numbers[Population][Dimension]);
    //genrates poulation
    void Binary_Conversion(int Binary[Population][Chrome_Length*Dimension],float 
    Positivenumberss[Population][Dimension]);
    //conversion for decimal into binary
    void Positive_Conversion (float Numbers[Population][Dimension],float 
    Positivenumberss[Population] [Dimension]);
    //converts initial population into positive numbers
    void Calculate_Fitness(float Numbers[Population][Dimension],float 
    fitness[Population]);
    //calculates the fitness of the population
    void Select_Parents(int Binary [Population][Chrome_Length*Dimension],float 
    fitness[Population],float total,
    int parents [Population] [Chrome_Length * Dimension], int children 
    [Population][Chrome_Length*Dimension]);
    //selects the parents
    void Crossover (int children [Population] [Chrome_Length * Dimension]);
    //Crossover function
    void Mutation (int children [Population] [Chrome_Length * Dimension]);
    //Mutation function
    void Decimal_Converter(int children [Population] [Chrome_Length * 
    Dimension], float Numbers2 [Population] [Dimension]);
    // converts children to decimal
    void Negative_Conversion(float Numbers2 [Population][Dimension],float Numbers [Population][Dimension]);
    //conversion for decimal numbers into negative numbers
    float Average_Fitness(float fitness [Population]);
    // calculates the average fitness
    float Fittest_Chrome(float fitness [Population]);
    // searches for the fittest chromasome
    
    
    
    
    
    void main()
    {
      float Numbers [Population][Dimension];
    // array called numbers to store the population
    float Numbers2 [Population] [Dimension];
    // array to store decimal numbers that need to be converted to negative
      int Binary [Population][Chrome_Length*Dimension];
    // two dimesional array called binary
      int MAX=pow(2,Chrome_Length)-1;
    // calculates the maximum value of a given Chrome_Length. Value is 2^cl -1
      float Positivenumberss[Population][Dimension];
    // array to store decimal numbers to be converted to binary
      float Fitness[Population];
    // an array for the fitness values
      float Total = 0;
    // variable used in calculating the total fitness
      int Parents [Population] [Chrome_Length*Dimension];
    // two dimensional array to store parents selected for breeding
      int Children [Population] [Chrome_Length*Dimension];
    // two dimensioanl array to store children bread from selected parents
      float Average;
    // variable for the average fitness of a population
      float Fittest;
    // variable for the fittest chromasome
      int n = 1;
    // variable used to count the number of generations
    
    
           cout.setf(ios::fixed);
    // function that tells the compiler to output numbers to the screen using fixed point notation
           cout.setf(ios::showpoint);
    // function that tells the compiler to always show the decimal point when outputting floating point numbers
           cout.precision(1);
    // sets the number of decimal places of floating point numbers
           srand ( time(NULL) );
    // seeds the random number generator using the system clock
           Random_Number_Generator(MAX,Numbers);
    // call to the function that generates the initial population
    
           ofstream outfile(file, ios::app);
    // specifies that when ouputing data to csv file, the file should be ammended and not overwritten
           outfile<<"Generation"<<','<<"Average Fitness"<<','<<"Fittest Chromasome"<<endl;
    // outputs three column headings to the csv file
           outfile<<endl;
    
    
              for (int i=0;i<Lifecycle; i++)
    // loop that sets the numbers of time the GA will go though it's lifecycle
              {
    
                Binary_Conversion(Binary,Positivenumberss);
    // function that converts decimal numbers into binary
                Calculate_Fitness(Numbers,Fitness );
    // function that measures the fitness of the members of the population
                Select_Parents(Binary,Fitness,Total,Parents,Children);
    // function that selects the parents for breeding
                Crossover(Children);
    // function that performs  Crossover
                Mutation(Children);
    // function that performs Mutation
                Decimal_Converter(Children,Numbers2);
    // function that converts binary numbers into decimal
    	    Positive_Conversion(Numbers,Positivenumberss);
    // function that converts negative decimal into positive numbers
                Negative_Conversion(Numbers2,Numbers);
    // function that converts positve decimal numbers back into negative
                outfile<<n<<',';
    // writes the value of counter n to the csv file
                Average = Average_Fitness(Fitness);
    // sets the variable average equal to the value returned by the average fitness
                outfile<<Average<<',';
    // writes the value of average to the csv file
                Fittest = Fittest_Chrome(Fitness);
    // sets the varialbe fittest to equal the value returned by the fittest chromasome
                outfile<<Fittest<<endl;
    // writes the value of fittest to the csv file
                n++;
    //increments the variable n by one
              }
    }
    
    
    
    //Function inplementations
    
    void Random_Number_Generator(int MAX, float Numbers[Population][Dimension])
    {
      float random; // declaring float variable random
    
         for (int i=0;i<Population; i++)
         {
            for (int j=0;j<Dimension;j++)
            {
              random = (rand()%MAX)*1.00; // generate a random number between 0 and MAX
              random=random /Mval;  // divide the random number by Mval
              random=random -Lval;  // take Lval away from the random number
              Numbers[i][j] = random; //stores the random number in the numbers array
            }
         }
    }
    
    
    void Positive_Conversion (float Numbers[Population][Dimension],float Positivenumberss[Population] [Dimension])
    {
      float decimal;  // declare float variable decimal
    
         for (int i=0;i<Population; i++) // for each of the population
         {
            for (int j=0; j<Dimension;j++) // for each dimension
            {
              decimal = Numbers[i][j]; // decimal equals the value [i] [j] in the numbers array
              decimal=decimal + Lval;  // add Lval to the value decimal
              decimal=decimal * Mval; // multiply decimal by Mval
              Positivenumberss[i][j]= decimal; // set the value at position [i] [j] in the Positivenumberss array equal to the value of decimal
            }
         }
    }
    
    
    void Binary_Conversion(int Binary[Population][Chrome_Length*Dimension],float Positivenumberss[Population][Dimension])
    {
      int decci; //declaring integer variable
    
         for (int i=0; i<Population; i++)
         {
           int pos=0; // declaring integer pos and initialising it to zero
    
             for (int d =0; d < Dimension; d++)
             {
                decci = Positivenumberss[i][d]; // set decci equal to the value at position [i] [d] in the Positivenumberss array
    
                   for (int j = 0; j < Chrome_Length; j++) // for each bit in the chromasome
                   {
                     int CurrSigBit = pow (2,(Chrome_Length -j-1)); // declare an integer CurrSigBbit and set its value equal to 2^(cl-1)
    
                     if(CurrSigBit <= decci) // if the value of CurrSigBit is less than or equal to decci
                      {
                       Binary[i][pos] = 1;  // set the [i] [pos] position in the binary array to a 1
                       decci = decci - CurrSigBit; // minus CurrSigBit from decci
                      }
                      else
                      {
                      Binary [i]  [pos] = 0; // else set the [i] [pos] position in the binary array to a 0
                      }
                   pos++;  // increment the pos variable by one
                   }
             }
         }
    }
    
    
    
    void Calculate_Fitness(float Numbers[Population][Dimension],float fitness[Population])
    {
       float total; // declare a float variable total
    
         for (int j=0;j<Population; j++) // for each of the population
         {
           total = 0; // set value of total to zero
    
             for (int i=0;i<Dimension; i++) // for each dimension
             {
              total=total + pow (Numbers [j][i],2); // add the square of the value at position [j] [i] in the Numbers array to total
             }
    
           1000/(total+1);
           fitness[j]=10000/(total+1); // setting the value at position [j] in the fitness array to equal
           cout<<fitness[j]<<"INDIVIDUAL FITNESS VALUES"; // outputs the value in the fitness array to the screen
           cout<<endl; // start outputting data to the screen on a new line
         }
    }
    
    
    
    void Select_Parents(int Binary [Population][Chrome_Length*Dimension] , float fitness[Population],
    float total,int parents [Population] [Chrome_Length * Dimension], int children [Population][Chrome_Length*Dimension])
    {
       float random_number;  // declaring a float variable random_number
       long int score;  // declaring a long integer variable score
       float temp;  // declaring a float variable temp
    
         for (int j=0;j<Population; j++) // for each of the population
         {
           total = total+ fitness[j]; // add the value a position [j] in the fitness aray to total
         }
    
       cout<<endl;   // output blank space to screen
       cout<<" Total Fitness = " <<total<<endl; // outputs the value of total to the screen
    
             for (int i=0;i<Population; i++)  // for each of the population
             {
               temp=rand()%RAND_MAX; // setting the variable temp equal to a random number between 0 and RAND_MAX (the compilers maximum
               random_number = (temp/RAND_MAX) * total;  // setting the value of random_number equal to (temp divided by RNAD_MAX) multiplied by the value of total
               cout<<" The Random Number Is "<<random_number<<endl;  // ouputs the random number to the screen
               score =0; // sets the value of score to zero
    
                  for (int j=0;j<Population; j++) // for each member of the population
                  {
                    score = score + fitness[j]; // add the value in the [j]th position in the fitness array to score
                    cout<<score; // output the value of score
                    cout<<endl;  // output on new line
    
                      if (random_number<score) // if the value random_number less that the value score
                      {
               			  for (int k=0;k<Chrome_Length * Dimension;k++) // for each bit in the child
                				{
                              parents [i] [k] =  Binary [j][k]; // set the value at position [i] [k] in the parents array to the value at position [j] [k] in the binary array
                              children [i] [k] = Binary [j] [k]; // set the value at position [i] [k] in the children array to the value at position [j] [k] in the binary array
                            }
                         j = (Population) +1; // set the value of j to Population plus one
                         cout<<endl; // output data on new line
                      }
                  }
             }
    }
    
    
    void Crossover (int children [Population] [Chrome_Length * Dimension])
    {
      float random_number; // declaring float variable random_number
      float randy; // declaring float variable randy
      int temp;  // declaring integer variable temp
      int crosspoint = Chrome_Length * Dimension -2; // declaring crosspoint and setting value to Chrome_Length multiplied by dimension minus two
    
      srand ( time(NULL) ); // seeding the random number generator
    
    
         for (int i=0; i< Population; i= i+2) // for every pair in population
            {
              random_number = (rand()%1000)*1.00; // set the value of random_number equal to a random number between 0 and 1000 multiplied by one
              cout<<random_number<<" R"<<" i "<< i<<endl; // output random_number and i to the screen and then start anew line
    
                if(random_number <= Crossover_Rate) // if random_number is less than or eqaul to the Crossover_Rate
                  {
                    randy = (rand()%crosspoint)*1.00; // set the value of randy to a random number between 0 and crosspoint
                    cout<<randy<<" Randy";  // output the value of randy to the screen
                    cout<<endl;  // start a new line
    
                       for (int k=randy;k<Chrome_Length*Dimension;k++) // for the pair chosen above
                       {
                          temp = children [i] [k]; // set the value of temp to the value in the children array at position [i] [k]
                          children [i] [k] = children [i+1] [k]; // set the value at position [i] [k] in the children array equal to the value at position [i+1] [k] in the children array
                          children [i+1] [k] = temp; // set the value at position [i+1] [k] in the children array equal to temp
                       }
                  }
            }
    }
    
    
    void Mutation (int children [Population] [Chrome_Length * Dimension])
    {
      float random;  // declare float variable random
    
      srand ( time(NULL) );  // seed the random number generator
    
    
         for ( int i =0; i<Population; i++) // for each of the population
         {
              for ( int j=0; j<Chrome_Length*Dimension; j++) // for each bit in a child
              {
                 random = (rand()%1000); // set random equal to a random number between 0 and 1000
    
                    if ((random <= Mutation_Rate) && (children [i] [j] ==0))
    // if random is less than or equal to the Mutation_Rate and at position [i] [j] in the children array is a 0
                     {
                       children [i] [j] =1;
    // set at position [i] [j] in the children array to a 1
                     }
    
                    else if ((random <= Mutation_Rate) && (children [i] [j]==1))
    // else if the value of random is less than or equal to Mutation_Rate and the bit at position [i] [j] in the children array is a 1
                     {
                       children [i] [j] = 0;
        // set the bit at position [i] [j] in the children array to a 0
                     }
              }
         }
    }
    
    
    void Decimal_Converter(int children [Population] [Chrome_Length*Dimension], float Numbers2 [Population] [Dimension])
    
    {
    
      for(int i = 0; i < Population; i++) // for each of the population
      {
    
         int pos = 0;  // declare and set the integer variable position to zero
    
            for(int k = 0; k < Dimension; k++) // for each dimension
            {
               int n = 1;  // declare and set an integer variable n to 1
               float Score = 0;  // declare and set a float variable score to 0
               float number;  // declare a float variable number
    
    			    for(int j = pos; j < Chrome_Length + pos; j++) // for each binary bit
       		    {
             	    if(children[i][j] == 1) // if the bit at position [i] [j] in the children array is a 1
                 {
                 number = pow(2,(Chrome_Length - n)); // set the value of number equal to 2^(Chrome_Length-n)
                 Score = Score + number;    // add number to the value of score
                 }
    
                 n++;  // increment the value of n by one
    
       		    }
    
              Numbers2[i][k] = Score; // set the value at position [i] [k] in the array Numbers2 equal to the value of score
              pos = pos + Chrome_Length; // add the value of Chrome_Length to pos
    
           }
      }
    }
    
    
    void Negative_Conversion(float Numbers2 [Population][Dimension],float Numbers [Population][Dimension])
    
    {
      float decimal; // delcare floar variable decimal
      cout<<endl; // start new line on screen
    
        for (int i=0;i<Population; i++) // for each of the population
        {
          for (int j=0; j<Dimension;j++) // for each dimension
          {
            decimal = Numbers2[i][j]; // set the value of deciaml equal to the value at posiyion [i [j] in the Numbers2 array
            decimal = (decimal / Mval) - Lval;  // divide the value of deciaml by Mval then subtract Lval
            Numbers2[i][j]=decimal;  // set the value at position [i] [j] in the Numbers2 array equal to the value of decimal
            Numbers [i] [j] = Numbers2 [i] [j];  // set the value at position [i] [j] in the numbers array equal to the value at position [i] [j] in the Numbers2 array
          }
        }
    }
    
    
    
    float Average_Fitness(float fitness [Population]) // function definition for Average_Fitness
    {
      float total=0; // declaring float variable total equal to zero
      float average; // declaring float variable average
    
         for (int j=0;j<Population; j++) // for each of the population
         {
          total = total + fitness[j]; // add the value at position [j] in fitness array to total
         }
    
          average = total/Population;
        // set the value of average to the value of total divided by the value of Population
          cout<<" Total Fitness: "<<total; // output the value of total to the screen
          cout<<"Average Fitness: "<<average; // output the value of average to the screen
    
      return average; // return the value of average to the main function
    }
    
    
    float Fittest_Chrome(float fitness [Population]) // function declaration for Fittest_Chrome
    {
      float fittest = 0;  // declaring a float variable fittest and setting it to 0
    
         for(int i = 0; i < Population; i++) // for each member of the population
         {
       	  if(fitness[i] > fittest) // if the value at position [i] in the fitness array is greater than the value of fittest
             {
          	fittest = fitness[i]; // set the value of fittest equal to the value at position [i] in the fitness array
             }
         }
      cout<<" Fittest Chromasome: "<<fittest; // output the value of fittest to the screen
    
      return fittest; // return the value of fittest to the main function
    }

  2. #2
    Reverse Engineer maxorator's Avatar
    Join Date
    Aug 2005
    Location
    Estonia
    Posts
    2,318
    void main() is bad

    Lowercase #defined values are confusing.
    Last edited by maxorator; 05-27-2007 at 11:09 AM.
    "The Internet treats censorship as damage and routes around it." - John Gilmore

  3. #3
    Registered User
    Join Date
    Apr 2006
    Posts
    10
    Well thats the way i've been taught. Didn't really help with my problem though...

  4. #4
    Registered User
    Join Date
    May 2006
    Posts
    903
    Your code abuses defines, has the wrong include files (standard header files in C++ do not have the .h extension) and also abuses comments. You have so many comments that I can't even read your code.

    Edit: Could you pinpoint the line causing the error ? Use your debugger and put break points everywhere you think may lead to a segmentation fault. Step through all of them and find the function that causes the problem.

  5. #5
    Registered User
    Join Date
    Apr 2006
    Posts
    10
    I have no idea what the problem is. This is the error message i get:

    Application error.

    PROJ000 cause a stack fault in module PROJ0000.EXE at 0002:0040.

    Choose to close. PROJ000 will close.



    There are no errors when compiling, just when trying to run.

  6. #6
    Registered User
    Join Date
    May 2006
    Posts
    903
    Could you pinpoint the line causing the error ? Use your debugger and put break points everywhere you think may lead to a segmentation fault. Step through all of them and find the function that causes the problem.
    This is what I've written in my edit before your post.

  7. #7
    Registered User
    Join Date
    May 2007
    Posts
    88
    In addition to what Desolation said (I ditto all of that), just at a glance it looks like your functions are doing too much. Divide and ye shall conquer.

    >Well thats the way i've been taught.

    Change "void" to "int". Problem solved.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Program Plan
    By Programmer_P in forum C++ Programming
    Replies: 0
    Last Post: 05-11-2009, 01:42 AM
  2. Client-server system with input from separate program
    By robot-ic in forum Networking/Device Communication
    Replies: 3
    Last Post: 01-16-2009, 03:30 PM
  3. Re-doing a C program to run in Win2000 or XP
    By fifi in forum C Programming
    Replies: 5
    Last Post: 08-17-2007, 05:32 PM
  4. Replies: 3
    Last Post: 07-11-2005, 03:07 AM
  5. plz help me run this program!!!
    By galmca in forum C Programming
    Replies: 8
    Last Post: 02-01-2005, 01:00 PM