Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %xy=pobieranieDanych;
- %load('kwiatek.mat');
- load('tarcza.mat');
- %liczba miast
- nmiast=size(xy,1);
- %macierz odleglosci miedzy miastami
- odleglosci = zeros(nmiast, nmiast);
- for i=1:nmiast
- for j=1:nmiast
- odleglosci(i,j) = sqrt((xy(i,1)-xy(j,1))^2 + (xy(i,2)-xy(j,2))^2);
- end
- end
- %liczba osobnikow w populacji
- nosobnikow = 80;
- pMut = 0.5;%UZUPEŁNIJ %p-wo mutacji
- pCross = 0.3;%UZUPEŁNIJ %p-wo krzyżowania
- %inicjalizacja populacji
- pop = zeros(nosobnikow,nmiast);
- for n=1:nosobnikow
- pop(n,:)=randperm(nmiast); %każdy osobnik to losowa trasa
- end
- newpop = zeros(size(pop));
- maxepochs = 10000;
- historia = zeros(1,maxepochs);
- %wyświetlenie dwóch okien obok siebie
- h1 = gcf;
- set(h1,'Units','normalize');
- outerpos = get(h1,'OuterPosition');
- outerpos(1) = (1-2*outerpos(3))/2;
- set(h1,'OuterPosition',outerpos);
- h2 = figure;
- set(h2,'Units','normalize');
- outerpos(1) = (1-2*outerpos(3))/2+outerpos(3);
- set(h2,'OuterPosition',outerpos);
- showInterval = 50;
- %główna pętla algorytmu
- for epoka=1:maxepochs
- %ocena
- dlugosciTras = zeros(1,nosobnikow); %sumowanie wartosci z macierzy tras
- for i=1:nosobnikow
- for j=1:(nmiast-1)
- dlugosciTras(i)=dlugosciTras(i)+odleglosci(pop(i,j),pop(i,j+1));
- end
- dlugosciTras(i)=dlugosciTras(i)+odleglosci(pop(i,j+1),pop(i,1));
- end
- %znalezienie i zapisanie najlepszej trasy (dla elitaryzmu)
- [historia(epoka),bestidx] = min(dlugosciTras);
- besttrasa = pop(bestidx,:);
- %selekcja turniejowa (lub ruletkowa) %k=populacja
- for i=1:nosobnikow
- idx=randi(nosobnikow);
- idx2=randi(nosobnikow);
- if(dlugosciTras(idx)<dlugosciTras(idx2))
- newpop(i,:)=pop(idx,:);
- else
- newpop(i,:)=pop(idx2,:);
- end
- end
- %UZUPEŁNIJ TUTAJ (newpop uzupełniona wyselekcjonowanymi osobnikami z pop)
- %krzyzowanie
- for n = 1:ceil(pCross*nosobnikow/2)
- %[newpop(2*n-1,:), newpop(2*n,:)] = ...
- orderedCrossover(newpop(2*n-1,:), newpop(2*n,:), nmiast);
- end
- %mutacje
- %mutacja rodzaj 1 (switching)
- %np. [1 2 3 4 5 6] -> [1 5 3 4 2 6]
- for i=1:ceil(pMut*nosobnikow)
- idx=randi(nmiast);
- idx2=randi(nmiast);
- tmp=newpop(i,idx);
- newpop(i,idx)=newpop(i,idx2);
- newpop(i,idx2)=tmp;
- end
- %UZUPEŁNIJ TUTAJ
- %mutacja rodzaj 2 (inversion) %fliplr
- %np. [1 2 3 4 5 6] -> [1 5 4 3 2 6]
- %UZUPEŁNIJ TUTAJ
- %mutacja rodzaj 3 (translation) %przesuwanie
- %np. [1 2 3 4 5 6] -> [1 5 6 2 3 4]
- %UZUPEŁNIJ TUTAJ
- %zmiana pokolenia
- pop = newpop;
- %elitaryzm
- pop(nosobnikow,:) = besttrasa;
- if mod(epoka,showInterval) == 0
- %wyswietlenie najlepszego (trasa)
- %wyczyszczenie poprzedniej trasy
- set(0,'CurrentFigure',h1)
- clf(h1);
- %narysowanie nowej
- plot(xy(:,1),xy(:,2),'ro');
- line([xy(besttrasa,1)' xy(besttrasa(1),1)],[xy(besttrasa,2)' xy(besttrasa(1),2)])
- axis([0 10 0 10])
- set(0,'CurrentFigure',h2)
- plot(historia(1:epoka))
- title('Zmiana długości trasy najlepszego osobnika w kolejnych populacjach.');
- xlabel('Epoka');
- ylabel('Długość trasy');
- pause(0.01)
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement