Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- % Algorytm mrowkowy poszukiwania minimalnej sciezki
- %
- clear
- nazwa_pliku = 'labirynt3.bmp'
- liczba_przejsc = 1000;
- liczba_krokow_max = 100;
- %fer_max = 15;
- %indx = 1;
- % liczba_mowek = ... % liczba mrowek idacych rownolegle
- % fp = ... % stala ilosc feromonu w kazdym polu;
- % n = ... % wspolczynnik nacisku selekcyjnego (im wiekszy, tym wieksze prawd. wyboru kierunku z wieksza iloscia feromonu)
- % par = ... % wspolczynik parowania feromonu (zmniejszenie feromonu na kazde przejscie)
- sledzenie = 0; % tryb sledzenia ilosci feromonu i dlugosci sciezki
- t = imread(nazwa_pliku);
- imagesc(t);
- mapa_kol = [[1:256];[1:256];[1:256]]'/256;
- colormap(mapa_kol);
- title(sprintf('labirynt %s nacisnij klawisz ...',nazwa_pliku));
- pause
- [lwierszy lkolumn] = size(t);
- % zakladamy, ze start odbywa sie ze srodka pierwszej kolumny, meta jest na srodku ostatniej kolumny
- start = [ceil(lwierszy/2),1]
- meta = [ceil(lwierszy/2),lkolumn]
- f = zeros(lwierszy,lkolumn); % tablica feromonu
- for i=1:liczba_przejsc
- krok = 1;
- pole = start;
- pole_pop = start;
- sciezka = [];
- while (krok < liczba_krokow_max)&&((pole(1) ~= meta(1))||(pole(2) ~= meta(2)))
- X=[];
- % wyznaczenie dostepnych pol, w ktore mozna wejsc:
- % zakladamy, ze mrowka nie moze wyjsc poza plansze, nie moze
- % wejsc na sciane oraz nie cofa sie na pole z ktorego przyszla
- % (chyba ze nie ma innej mozliwosci)
- pola_dost = [];
- ilosci_fer = [];
- if (pole(2) > 1) && (t(pole(1),pole(2)-1)==1) && (pole(2)-1 ~= pole_pop(2))
- pola_dost = [pola_dost ; pole-[0 1]];
- ilosci_fer = [ilosci_fer f(pole(1),pole(2)-1)];
- end
- if (pole(2) < lkolumn) && (t(pole(1),pole(2)+1)==1) && (pole(2)+1 ~= pole_pop(2))
- pola_dost = [pola_dost ; pole+[0 1]];
- ilosci_fer = [ilosci_fer f(pole(1),pole(2)+1)];
- end
- if (pole(1) > 1) && (t(pole(1)-1,pole(2))==1) && (pole(1)-1 ~= pole_pop(1))
- pola_dost = [pola_dost ; pole-[1 0]];
- ilosci_fer = [ilosci_fer f(pole(1)-1,pole(2))];
- end
- if (pole(1) < lwierszy) && (t(pole(1)+1,pole(2))==1) && (pole(1)+1 ~= pole_pop(1))
- pola_dost = [pola_dost ; pole+[1 0]];
- ilosci_fer = [ilosci_fer f(pole(1)+1,pole(2))];
- end
- liczba_dost = length(ilosci_fer);
- if liczba_dost == 0
- p = pole;
- pole = pole_pop; % cofniecie sie do pola poprzedniego, jesli brak innych dostepnych pol
- pole_pop = p;
- else
- pole_pop = pole; % pole poprzednie (by do niego ponownie nie wejsc)
- % .............. TUTAJ NALEZY WYBRAC NOWE POLE ...........
- % pole =
- random = randi(1000);
- fer_max=-10;
- znalazl=true;
- while(znalazl)
- znalazl=true;
- if random<i
- for j=1:liczba_dost
- if((ilosci_fer(j) > fer_max))
- fer_max = ilosci_fer(j);
- indx = j;
- end
- end
- else
- indx = randi(liczba_dost);
- end
- pole = pola_dost(indx,:);
- for ite=1:length(X)
- if X[ite]==pole
- znalazl=false;
- end
- end
- X = [ X pole ];
- end
- % zeby nie bylo bledu - wybor pole pierwszego z brzegu
- end
- sciezka(krok,:) = pole; % wpisanie pola do sciezki
- krok = krok + 1;
- end % while po krokach mrowki
- if (pole(1) == meta(1))&&(pole(2) == meta(2)) % jesli koncowym polem jest meta
- % usuwanie petli (moze byc lub nie):
- while i <= length(sciezka(:,1))
- pole = sciezka(i,:);
- for j=length(sciezka(:,1)):-1:i+1
- if (sciezka(j,1)==pole(1))&&(sciezka(j,2)==pole(2))
- sciezka(i+1:j,:) = [];
- break;
- end
- end
- i = i+1;
- end
- % ............... TUTAJ NALEZY ZMODYFIKOWAC TABLICE FEROMONU
- % f =
- for a = 1:length(sciezka)
- f(sciezka(a, 1), sciezka(a,2)) = f(sciezka(a, 1), sciezka(a,2)) + 1 / length(sciezka); %/ <tutaj jakas liczba, ja mam 6> * length(ścieżka);
- end
- end
- if sledzenie
- imagesc(1-f/max(max(f))*0.9);
- mapa_kol = [[1:256];[1:256];[1:256]]'/256;
- sciezka_max;
- title(sprintf('pozostaly feromon, dlugosc sciezki = %d',dlugosc_sciezki))
- pause(0.1);
- end
- f=f*0.9;
- end
- %fig = figure;
- imagesc(1-f/max(max(f))*0.9);
- mapa_kol = [[1:256];[1:256];[1:256]]'/256;
- sciezka_max;
- title(sprintf('pozostaly feromon, dlugosc sciezki = %d',dlugosc_sciezki))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement