Aug 6, 2010 at 4:01am UTC
I'm learning genetic algorithms and have started writing a program to test some stuff out. Right now all the program does is seed a struct and push it into a vector. Any clue as to what is causing this linking error. I'm usually visual express 2008.
error LNK2019: unresolved external symbol impCrtDbgReportW referenced in function "public: struct gastruct & thiscall std::vector<struct gastruct,class std::allocator<struct gastruct> >::operator[](unsigned int)" (??A?$vector@Ugastruct@@V?$allocator@Ugastruct@@@std@@@std@@QAEAAUga_struct@@I@Z)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
#include "SDL.h"
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <time.h>
#include <math.h>
define GA_POPSIZE 2048 // ga population size
define GA_MAXITER 16384 // maximum iterations
define GA_MUTATIONRATE .05f // mutation percentage rate
define GA_TARGET 60 // top fitness
define GA_MOVES 80 // movement points
using namespace std;
struct ga_struct {
string str;
unsigned int fitness;
float matingPossiblity;
};
typedef vector<ga_struct> ga_vector;
void init_population(ga_vector &population) {
int tsize = GA_MOVES * 3;
int psize = GA_POPSIZE;
for (int i = 0; i < psize; i++)
{
ga_struct citizen;
citizen.fitness = 0;
citizen.matingPossiblity = 0.0f;
citizen.str.erase();
for (int j = 0; j < tsize; j++)
citizen.str.at(j) = (rand() % 2) + 48;
population.push_back(citizen);
}
}
void calc_fitness(ga_vector &population) {
// do nothing
}
void sort_fitness(ga_vector &population) {
// do nothing
}
void mutate(ga_vector &member) {
int tsize = GA_MOVES * 3;
int psize = GA_POPSIZE;
double mutation = GA_MUTATIONRATE * 100.0;
int random = 0;
for (int j = 0; j < psize; j++)
{
for (int i = 0;i < tsize; i++)
{
random = (rand() % 100) + 1;
if (random < mutation)
{
if (member[j].str.at(i) == '0' )
member[j].str.at(i) = '1' ;
else
member[j].str.at(i) = '0' ;
}
}
}
}
void mate(ga_vector &population) {
// do nothing at this time
}
void draw_best(ga_vector &population) {
// do nothing at this time
}
int main( int argc, char * args[] ) {
//Start SDL
SDL_Init(SDL_INIT_VIDEO);
srand(unsigned (time(NULL)));
ga_vector pop_alpha;
ga_vector *population;
init_population(pop_alpha);
population = &pop_alpha;
// game loop
for ( int i = 0; i < GA_MAXITER; i++)
{
calc_fitness(*population);
sort_fitness(*population);
draw_best(*population);
// if((*population)[0].fitness == 100)
// break;
mate(*population);
mutate(*population);
}
// move between best fitness screen
//Quit SDL
SDL_Quit();
return 0;
}
Thank you for any help and thank you for at least reading over it.
Last edited on Aug 6, 2010 at 2:07pm UTC
Aug 6, 2010 at 6:08am UTC
Well, all your includes/defines are missing a # in front of them, but I don't think that's the problem...also, I would suggest using a const
variable as opposed to a define for your constants.
If it's not that then I have no idea what it is.
Aug 6, 2010 at 2:02pm UTC
It's not the #includes. Thank you for reading over it tho. I edited the code area to make it more readable. Quite a bit was lost when I copied it to here.
Dillu333 is a bot.
Last edited on Aug 6, 2010 at 2:15pm UTC
Aug 7, 2010 at 2:56am UTC
In your init_population function,
turn this -> citizen.str.erase();
into this -> citizen.str.resize(tsize);
EDIT: Though, this has nothing to do with your linker error... hahaha
Last edited on Aug 7, 2010 at 3:19am UTC
Aug 7, 2010 at 4:25am UTC
Two questions r0shi. I understand what resize is doing, but why do it that way? Also, which way is faster when it complies and runs?