資源簡介
使用C++編寫的遺傳算法,代碼量200行左右,供大家學(xué)習(xí)研究,互相交流。
代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
using?namespace?std;
#define?SIZE?20//染色體長度,根據(jù)實(shí)際情況改寫
typedef?bitset?Chromosome;
typedef?vector?Population;
typedef?vector?MatingPool;
void?cross(MatingPool&?pool?double?crossRate)
{
default_random_engine?e(time(0));
uniform_real_distribution?rand_r(0?1);
uniform_int_distribution?rand_p(1?SIZE?-?1);
for?(int?i?=?0;?i? {
if?(rand_r(e)?<=?crossRate)
{
int?pos?=?rand_p(e);
Chromosome?temp?=?pool[i]?>>?pos?<>?(SIZE?-?pos);
pool[i?+?1]?=?pool[i?+?1]?>>?pos?<>?(SIZE?-?pos);
pool[i]?=?temp;
}
}
}
void?mutate(Population&?population?double?mutationRate)
{
default_random_engine?e(time(0));
uniform_real_distribution?rand_r(0?1);
uniform_int_distribution?rand_p(1?SIZE?-?1);
for?(int?i?=?0;?i? {
if?(rand_r(e)?<=?mutationRate)
{
population[i].flip(rand_p(e));
}
}
}
double?parse(Chromosome?chromo)
{
double?value?=?chromo.to_ullong();
value?/=?(1?< value?*=?3.141592654;
return?value;
}
//價(jià)值函數(shù),根據(jù)實(shí)際情況改寫
double?value_of(Chromosome?chromo)
{
double?value?=?cos(parse(chromo));
return?1?/?value?/?value;
}
void?Scale(vector&?values)
{
vector?temp;
for?(int?i?=?0;?i? {
int?rank?=?values.size();
for?(int?j?=?0;?j? {
if?(i?==?j)?continue;
if?(values[i]? }
temp.push_back(rank);
}
values.swap(temp);
}
void?Init(Population&?population?int?popSize)
{
popSize?=?popSize?>>?1?<1;
default_random_engine?e(time(0));
uniform_int_distribution?b(0?1);
for?(int?i?=?0;?i? {
Chromosome?chromo;
for?(int?i?=?0;?i? {
chromo.set(i?b(e));
}
population.push_back(chromo);
}
}
void?selection(Population?population?vector?values?MatingPool&?pool)
{
Scale(values);
int?size?=?population.size();
for?(int?i?=?1;?i? default_random_engine?e(time(0));
uniform_real_distribution?rand(0?values[size?-?1]);
for?(int?i?=?0;?i?
評論
共有 條評論