📄 population.cc
字号:
// ################################################################################
//
// name: population.cc
//
// author: Martin Pelikan
//
// purpose: functions for manipulation with the populations of strings and
// the strings themselves
//
// last modified: February 1999
//
// ################################################################################
#include <stdio.h>
#include <string.h>
#include "population.h"
#include "random.h"
#include "memalloc.h"
#include "fitness.h"
// ================================================================================
//
// name: allocatePopulation
//
// function: allocates memory for a population and sets its size and string
// length parameters
//
// parameters: population...which population to allocate memory for
// N............the number of strings for a population to contain
// n............the length of strings
//
// returns: (int) 0
//
// ================================================================================
int allocatePopulation(Population *population, long N, int n)
{
long i;
// set the size of the population and the string length
population->N = N;
population->n = n;
// allocate memory for strings
population->x = (char**) Calloc(N,sizeof(char*));
for (i=0; i<N; i++)
population->x[i] = (char*) Calloc(n,sizeof(char));
// allocate memory for the array of fitness values
population->f = (float*) Calloc(N,sizeof(float));
// get back
return 0;
};
// ================================================================================
//
// name: freePopulation
//
// function: frees the memory used by a population
//
// parameters: population...which population to free memory used by
//
// returns: (int) 0
//
// ================================================================================
int freePopulation(Population *population)
{
long i;
// free the memory used by strings
for (i=0; i<population->N; i++)
Free(population->x[i]);
Free(population->x);
// free the memory used by the array of fitness values
Free(population->f);
// get back
return 0;
};
// ================================================================================
//
// name: generatePopulation
//
// function: generates all strings in a population at random with uniform
// distribution
//
// parameters: population...which population to generate
//
// returns: (int) 0
//
// ================================================================================
int generatePopulation(Population *population)
{
long i;
int j;
// generate bit by bit
for (i=0; i<population->N; i++)
for (j=0; j<population->n; j++)
if (drand()<0.5)
population->x[i][j]=0;
else
population->x[i][j]=1;
// get back
return 0;
};
// ================================================================================
//
// name: evaluatePopulation
//
// function: evaluates fitness for all strings in a population
//
// parameters: population...which population to evaluate
//
// returns: (int) 0
//
// ================================================================================
int evaluatePopulation(Population *population)
{
long i;
// evaluate each individual
for (i=0; i<population->N; i++)
population->f[i] = getFitnessValue(population->x[i],population->n);
// get back
return 0;
};
// ================================================================================
//
// name: computeUnivariateFrequencies
//
// function: compute the frequencies of 1's on all positions in a population;
// does not allocate memory for them-it has to be allocated already
//
// parameters: population...which population to compute the frequencies for
// p1...........the array of resulting frequencies
//
// returns: (int) 0
//
// ================================================================================
int computeUnivariateFrequencies(Population *population, float *p1)
{
long i;
int k;
long *count1;
// allocate memory for the counts
count1 = (long*) Calloc(population->n,sizeof(long));
// compute univariate counts
for (k=0; k<population->n; k++)
count1[k]=0;
for (i=0; i<population->N; i++)
for (k=0; k<population->n; k++)
if (population->x[i][k])
count1[k]++;
// compute the frequencies
for (k=0; k<population->n; k++)
p1[k]=(float) count1[k]/population->N;
// free the memory used by the counts
Free(count1);
// get back
return 0;
};
// ================================================================================
//
// name: copyIndividual
//
// function: copy a given string into a particular spot in a population
//
// parameters: population...the population where to put the copied string
// where........the position in a population where to put the string
// x............the string to copy (put into the population)
// f............the fitness of the copied string (if known)
//
// returns: (int) 0
//
// ================================================================================
int copyIndividual(Population *population, long where, char *x, float f=0)
{
// copy the individual's chromosome
memcpy(population->x[where],x,population->n);
// copy the fitness value
population->f[where] = f;
// get back
return 0;
};
// ================================================================================
//
// name: swapIndividuals
//
// function: swaps specified two strings in a population
//
// parameters: population...the population where to swap the specified string
// first........a position of the first string to swap
// second.......a position of the second string to swap
//
// returns: (int) 0
//
// ================================================================================
int swapIndividuals(Population *population, long first, long second)
{
char *auxX;
float auxF;
// allocate memory for an auxilary string
auxX = (char*) Malloc(population->n);
// swap the strings
memcpy(auxX,population->x[first],population->n);
memcpy(population->x[first],population->x[second],population->n);
memcpy(population->x[second],auxX,population->n);
// swap the fitness values
auxF = population->f[first];
population->f[first] = population->f[second];
population->f[second] = auxF;
// free the memory used by an auxilary string
Free(auxX);
// get back
return 0;
};
// ================================================================================
//
// name: printIndividual
//
// function: prints out a specified string to a stream
//
// parameters: out..........the stream to print the string to
// x............the string to print
// i............the string length
//
// returns: (int) 0
//
// ================================================================================
int printIndividual(FILE *out, char *x, int n)
{
int k;
// print it out
for (k=0; k<n; k++)
fprintf(out,"%u",x[k]);
// get back
return 0;
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -