-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenetyczneWlasnePetleRep.r
142 lines (122 loc) · 4.42 KB
/
genetyczneWlasnePetleRep.r
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
132
133
134
135
136
137
138
139
140
141
142
library('plot.matrix')
#potrzebne do liczenia średniej liczby potrzebnych generacji
liczbaTestow=10
sumaGeneracji=0
#wyświetlanie
wyswietlacTesty=FALSE
wyswietlacWynikiTestow=FALSE
#zapisane wyniki z kazdego testu
wynikiTestow=matrix(ncol=liczbaTestow)
#do szukania optymalnych prawdopodobieństw
LICZBApARAM=5
prawdopMutacji= c(0.1, 0.3, 0.5, 0.7, 0.9)
prawdopKrzyz= c(0.1, 0.3, 0.5, 0.7, 0.9)
najlepszaPara = c(1,1)
#zapisane średnie liczby potrzebnych generacji dla rownych prawdopodobienstw mutacji i krzyzowania
wynikiDlaParametrow=matrix(nrow=LICZBApARAM, ncol=LICZBApARAM)
source('gra.r')
fitness <-function (obiekt)
{
return (gra(obiekt));
}
wyswietlac=FALSE
liczbaobiektow=80
liczbagenow=22
liczbageneracji=1000
obiekty=matrix(nrow=liczbaobiektow, ncol=liczbagenow) #populacja, uwaga na typy zmiennych
oceny=c(ncol=liczbagenow)
#losowa inicjalizacja populacji
set.seed(as.integer(Sys.time()))
najmniejszaSrednia = liczbageneracji
for (mutTest in c(1:LICZBApARAM))
{
for (krzyzTest in c(1:LICZBApARAM))
{
for (t in c(1:liczbaTestow))
{
#*****************************************************************************
for(i in c(1:liczbaobiektow))
{
#wype-nij losowymi wartosciami
obiekty[i,] = floor(4*runif(liczbagenow))+1
}
for(g in c(0:liczbageneracji))
{
if(wyswietlac) print(sprintf("generacja %d",g))
#Ocena
best=1 #zawiera indeks wyznaczajacy pozycje najlepszego objektu w populacji
for(i in c(1:liczbaobiektow))
{
oceny[i] = fitness(obiekty[i,])
if(fitness(obiekty[best,])<oceny[i])
{
best=i
}
}
#Reprodukcja (podejscie Elitarne) z Mutacja
for(i in c(1:liczbaobiektow))
{
#nie krzyzuj najlepszego (best) sie z soba samym
if(i!=best)
{
#jeśli dużo punktów, to znaczy, że początek jest dobrze
zacznij=1
if (oceny[i]>=100) zacznij=8
else if (oceny[i]>=50) zacznij=4
for(j in c(zacznij:liczbagenow))
{
#krzyzowanie - losowo podmieniaj gen j na gen z objektu najlepszego
if(runif(1)<=prawdopKrzyz[krzyzTest])
{
obiekty[i,j]=obiekty[best,j]
if (j+1 <= liczbagenow && runif(1)<=0.2)
obiekty[i,j+1]=obiekty[best,j+1]
}
#Mutacja losowa
if(runif(1)<=prawdopMutacji[mutTest]) #ten zapis oznacza, ze XX genow sa zmieniane
{
if (j+1 <= liczbagenow && runif(1)<=0.2)
obiekty[i,j] = obiekty[i,j+1]
else
obiekty[i,j]=floor(4*runif(1))+1
}
}
}
if(wyswietlac) print(obiekty[i,])
}
if(wyswietlac) print(sprintf("Fitness: %d",fitness(obiekty[best,])))
if (fitness(obiekty[best,])>=150)
{
if (wyswietlacTesty)
{
print(sprintf("generacja %d",g))
#print(obiekty)
print(best)
print(obiekty[best,])
}
break
}
}
#*****************************************************************************
wynikiTestow[t]=g
sumaGeneracji=sumaGeneracji+g
}
sredniaTestow=sumaGeneracji/liczbaTestow
wynikiDlaParametrow[mutTest,krzyzTest]=sredniaTestow
if (wyswietlacWynikiTestow)
{
print("Liczby generacji, po których osiągnięto sukces dla kolejnych testów:")
print(wynikiTestow)
}
print(sprintf("Test: %d Prawd Mut: %f Prawd Krzyz: %f Średnia liczba potrzebnych generacji: %f",(mutTest-1)*LICZBApARAM+krzyzTest ,prawdopMutacji[mutTest], prawdopKrzyz[krzyzTest], sredniaTestow))
if (sredniaTestow<=najmniejszaSrednia)
{
najmniejszaSrednia=sredniaTestow
najlepszaPara=c(mutTest, krzyzTest)
}
sumaGeneracji=0
}
}
print(sprintf("Najlepsze wyniki (%f generacji) osiągnięto dla Prawd Mut: %f Prawd Krzyz: %f",najmniejszaSrednia, prawdopMutacji[najlepszaPara[1]], prawdopKrzyz[najlepszaPara[2]]))
par(mar=c(5.1, 4.1, 4.1, 4.1))
plot(wynikiDlaParametrow, xlab='Index prawdopodobieństwa mutacji', ylab='Index prawdopodobieństwa krzyżówki')