Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- % Szukanie minimum funkcji - algorytm genetyczny
- clear;
- liczba_rozw = 1000 ; % liczba osobnikow (rozwiazan) w populacji
- liczba_epok = 1000;
- pkrz = 0.57; % prawdopodobienstwo krzyzowania
- pmut = 0.83; % prawdopodobienstwo mutacji
- wsp_selekcji = 0.1; % nacisk selekcyjny
- liczba_param = 2; % liczba parametrow funkcji
- L = liczba_rozw;
- N = liczba_param;
- Droga=[];
- Popul = rand(N,L)*100-50; % losowanie populacji dla L osobnikow (rozwiazan)
- minimum = 10e40; % poczatkowa wartosc rekordu
- format long; % duza liczba miejsc po przecinku
- tic % poczatek pomiaru czasu
- for ep=1:liczba_epok
- Funkcja = fun10(Popul(1,:),Popul(2,:)); % wartosc funkcji dla kazdego rozwiazania (funkcje wskazuje prowadzacy)
- for i=1:L
- if Funkcja(i) > 0
- Ocena(i) = 10e-22;
- else
- Ocena(i) = Funkcja(i) * (-100);
- end
- end% ocena > 0 i tym wieksza, im lepsze rozwiazanie
- [min1 Imin] = min(Funkcja);
- if minimum > min1 % sprawdzenie rekordu
- minimum = min1;
- Rekord = Popul(:,Imin);
- Droga = [Droga ; Rekord']; % umieszczenie wspolrzednych na liscie
- sprintf('w epoce %d rekord = %f w punkcie %s \n',ep,min1,num2str(Rekord'))
- end
- % Reprodukcja ...
- Popul = rep_rul(Popul,Ocena);
- % Krzyzowanie ...
- for i=1:L
- if rand()*2 > 1
- if rand() <= pkrz
- tmp = Popul(1,i);
- it = floor(rand()*L)+1;
- Popul(1,i) = Popul(1,it);
- Popul(1,it) = tmp;
- end
- else
- if rand() <= pkrz
- tmp = Popul(2,i);
- it = floor(rand()*L)+1;
- Popul(2,i) = Popul(2,it);
- Popul(2,it) = tmp;
- end
- end
- end
- % Mutacja ...
- for i=1:L
- if rand() <= pmut
- if rand()*2 > 1
- Popul(1,i) = Popul(1,i) + (rand()-0.5)*2;
- else
- Popul(2,i) = Popul(2,i) + (rand()-0.5)*2;
- end
- end
- end
- end
- disp('czas poszukiwan [s]:')
- toc % koniec pomiaru czasu
- % Rysowanie funkcji:
- [X Y] = meshgrid(-10:0.1:10,-10:0.1:10); % siatka punktow na plaszczyznie dwuwymiarowej
- V = [ -1.75 -1.5 -1 0 1 2 3 4 5]; % wysokosci poziomic
- [cs h] = contour(X,Y,fun10(X,Y),V); % wykres - mapa
- clabel(cs,h); % etykiety poziomic
- hold on % rysuj na istniejacym rysunku
- % Rysowanie rekordowych punktow:
- plot(Droga(:,1)',Droga(:,2)'); % przejscia pomiedzy rekordami
- plot(Droga(:,1)',Droga(:,2)','ro'); % rekordowe punkty oznaczone czerwonymi kolkami
- title('Kolejne rekordy (w czerwonych kolkach)');
- for i=1:length(Droga(:,1)') % etykiety (numery) rekordow
- text(Droga(i,1)', Droga(i,2)', int2str(i), ...
- 'fontsize', 8);
- end
- hold off;
Advertisement
Add Comment
Please, Sign In to add comment