-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnit.cpp
More file actions
131 lines (101 loc) · 3.43 KB
/
nit.cpp
File metadata and controls
131 lines (101 loc) · 3.43 KB
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
#include "nit.h"
Nit::Nit(MouseList generation, MouseList nova_generacija, QColor islandColor)
:population(generation)
,new_population(nova_generacija)
, islandColor_(islandColor)
{
mutation_rate=0.05;
iteracija=1;
qRegisterMetaType<Jedinka>("Jedinka");
qRegisterMetaType<MouseList>("MouseList");
}
void Nit::run(){
if(iteracija==50000){
emit zavrsioSam();
return;
}
selekcija();
if(islandColor_==Qt::blue)
qDebug()<<"najbolji u generaciji "+QString::number(iteracija) + " na plavom ostrvu je "+QString::number(population.at(0)->getFitness());
else if(islandColor_==Qt::yellow)
qDebug()<<"najbolji u generaciji "+QString::number(iteracija) + " na zutom ostrvu je "+QString::number(population.at(0)->getFitness());
else if(islandColor_==Qt::green)
qDebug()<<"najbolji u generaciji "+QString::number(iteracija) + " na zelenom ostrvu je "+QString::number(population.at(0)->getFitness());
iteracija++;
}
void Nit::selekcija()
{
for(int i=0;i<6;i++){
Mouse* m=new Mouse(population[0]->getColor(), "/home/dara/Desktop/Mice/input.txt");
m->setGenotype(population[i]->getGenotype());
new_population.append(m);
}
int i=6;
while (i<population.size()) {
int prvi=turnir();
int drugi=turnir();
ukrstanje(population[prvi], population[drugi]);
i+=2;
}
mutacija();
std::sort(std::begin(new_population), std::end(new_population),[](Mouse* x, Mouse* y){return x->za_sortiranje()<y->za_sortiranje();});
qreal max_fit=new_population.first()->getFitness();
qreal min_fit=new_population.last()->getFitness();
for(auto m: new_population)
m->changeAcordingToNeighbours(min_fit, max_fit);
emit saljemoNovuGeneraciju(new_population);
population.swap(new_population);
new_population.clear();
}
int Nit::turnir()
{
std::vector<int> indeksi(6);
for(int i=0; i<6; i++)
indeksi.push_back(std::experimental::randint(6, population.size()));
int k=indeksi[0];
for(int i=1; i<6; i++){
if(population[i]->getFitness()>population[k]->getFitness())
k=i;
}
return k;
}
void Nit::ukrstanje(Mouse* jedan, Mouse* drugi)
{
Mouse* md1 =new Mouse(jedan->getColor(), "/home/dara/Desktop/Mice/input.txt");
Mouse* md2=new Mouse (jedan->getColor(), "/home/dara/Desktop/Mice/input.txt");
Genotype dete1=jedan->getGenotype();
Genotype dete2=drugi->getGenotype();
int point = std::experimental::randint(0, dete1.gene.size()-1);
double t;
for(int i=0; i<point; i++){
t = dete1.gene[i];
dete1.gene[i] = dete2.gene[i];
dete2.gene[i] = t;
}
md1->setGenotype(dete1);
md2->setGenotype(dete2);
new_population.push_back(md1);
new_population.push_back(md2);
}
void Nit::mutacija()
{
std::default_random_engine generator;
std::uniform_real_distribution<float> distribution(0.0,1.0);
for(auto jedinka: new_population){
qreal x = generisiRandom(0, 1);
if(x<mutation_rate){
Genotype dete1=jedinka->getGenotype();
int point = rand()%dete1.gene.length();
dete1.gene[point] = generisiRandom(dete1.lower[point], dete1.upper[point]);
}
}
}
qreal Nit::generisiRandom(double lower, double upper)
{
qreal p=lower+(upper-lower)*(qrand()%1000/1000.0);
if(p<=lower)
p=lower;
else if(p>=upper)
p=upper;
return p;
}