-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathanalizaPetle.r
136 lines (117 loc) · 4.31 KB
/
analizaPetle.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
library('plot.matrix')
#potrzebne do liczenia średniej liczby potrzebnych generacji
liczbaTestow=100
sumaGeneracji=0
#wyświetlanie
wyswietlacTesty=FALSE
wyswietlacWynikiTestow=FALSE
#zapisane wyniki z kazdego testu
wynikiTestow=matrix(ncol=liczbaTestow)
#do szukania optymalnych prawdopodobieństw
LICZBApARAM=13
prawdopMutacji= c(0, 0.01, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.99, 1)
prawdopKrzyz= c(0, 0.01, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.99, 1)
najlepszaPara = c(1,1)
#zapisane średnie liczby potrzebnych generacji dla rownych prawdopodobienstw mutacji i krzyzowania
wynikiDlaParametrow=matrix(nrow=LICZBApARAM, ncol=LICZBApARAM)
fitness <-function (obiekt)
{
#tu zawarte jest wlasciwe kodowanie genu i jego ocena
#kod genu, zawartosc skladnikow w recepcje na sok cytrynowy
#[1]: sol
#[2]: cukier
#[3]: cytryna
#[4]: jajko
#[5]: woda
#[6]: cebula
#[7]: jablko
#wlasciwy przepis - sol + cukier + cytryna - jajko + woda - cebula - jablko
#jezeli odpowiednie geny w chromosomie beda mialy wartosc 0 a inne 1, to najlepsze
#dopasowanie do tej reguly, da wynik funkcji oceny = 3 (dlaczego?)
ocena = -obiekt[1] + obiekt[2] + obiekt[3] - obiekt[4] + obiekt[5] - obiekt[6]- obiekt[7]
#ocena dopasowania przepisu do rzeczywystej recepty:
return (ocena);
}
wyswietlac=FALSE
liczbaobiektow=3
liczbagenow=7
liczbageneracji=100
obiekty=matrix(nrow=liczbaobiektow, ncol=liczbagenow) #populacja, uwaga na typy zmiennych
#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,] = (runif(liczbagenow)<=0.5)*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))
{
if(fitness(obiekty[best,])<fitness(obiekty[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)
{
for(j in c(1:liczbagenow))
{
#krzyzowanie - losowo podmieniaj gen j na gen z objektu najlepszego
if(runif(1)<=prawdopKrzyz[krzyzTest])
obiekty[i,j]=obiekty[best,j]
#Mutacja losowa
if(runif(1)<=prawdopMutacji[mutTest]) #ten zapis oznacza, ze 1/2 genow sa zmieniane
obiekty[i,j]=(runif(1)<=0.5)*1
}
}
if(wyswietlac) print(obiekty[i,])
}
if(wyswietlac) print(sprintf("Fitness: %d",fitness(obiekty[best,])))
if (fitness(obiekty[best,])==3)
{
if (wyswietlacTesty)
{
print(sprintf("generacja %d",g))
print(obiekty)
print(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')