Professional Documents
Culture Documents
Notatki AiSD Mat
Notatki AiSD Mat
Notatki AiSD Mat
Notatki z wykładów powstały, aby ułatwić studentom pracę nad zestawem zadań w trybie
zdalnej edukacji lub regularnego przygotowywania się do zajęć, co w rezultacie pozwoli osiągnąć
efekty kształcenia i wydajniej doskonalić swoją wiedzę w zadanym przedmiocie. Gorąco zachę-
camy studentów uczęszczających na wykład i zajęcia laboratoryjne do wydrukowania ninieszych
”notatek z wykładów” i wykorzystania ich w trakcie zajęć właśnie jako notatnik, z którym można
łatwiej i lepiej sporządzać notatki z zajęć.
1 Plan wykładów
• Zasady zaliczenia • Algorytm N
• Tablice • Kodowanie
• Kodowanie Huffmana
• Stosy
• Kodowanie Shannona-Fano
• Kolejki
• Algorytm Rivesta-Shamira-Adlemana
• Listy
• Sortowanie przez wstawianie
• Grafy
• Sortowanie bąbelkowe
• Drzewa
• Sortowanie szybkie
• Kopce
• Sortowanie przez kopcowanie
• Algorytmy grafowe
• Sortowanie przez scalanie
• Problem komiwojażera
• Heurystyka
• Algorytm Dijkstry • Algorytm Genetyczny
• Algorytm A* • Ewolucja różnicowa
• Algorytm Floyda-Warshalla • Algorytm Kukułki
• Wyszukiwanie wzorca • Algorytmy roju
1
• Algorytm mrówkowy • Algorytm świetlika
2 Warunki zaliczenia
Do zaliczenia wymagane jest uzyskanie conajmniej 41 punktów, w tym 30% z każdej grupy zadań
sprawdzające dane efekty kształcenia.
• Kolokwium zaliczeniowe na wykładzie 40 punktów
• Kolokwium praktyczne na laboratoriach 20 punktów
• Zadania z listy w języku Python lub C 30 punktów. Do każdego algorytmu student oddaje:
implementacje + schemat blokowy
• Aktywność i dodatkowe zadania 10 punktów
Gdzie znaleźć listy z zadaniami? Platforma Zdalnej Edukacji Wydziału Matematyki Sto-
sowanej Politechniki Śląskiej (https://platforma.polsl.pl/rms/).
3 Notatki z wykładów
Zmienne to podstawowe typy danych (takie jak liczby czy znaki) są przechowywane w zmien-
nych, czyli w wydzielonym miejscu w pamięci zapisane w postaci bitowej.
Struktury danych to uformowane zbiory złożone z pewnych typów danych, które układane
są w pewien, sprecyzowany sposób. Przykładem jest tablica, stos czy lista.
2
Algorytm częściowo poprawny
Własność stopu
∀i ∈ I, A|i. (2)
Algorytm poprawny A będzie algorytmem poprawnym gdy jest zarówno częściowo poprawny
i posiada własność stopu.
Zapis algorytmu
Przykład
Użytkownik wprowadza współczynniki równania kwadratowego (ax2 + bx + c = 0, gdzie
a, b, c, x1 , x2 ∈ R), a program wyświetla rozwiązanie.
3
Kod w zadanym języku
double delta = b * b - 4 * a * c;
if (delta > 0) {
r1 = (-b - Math.Sqrt(delta)) / (2 * a);
r2 = (-b + Math.Sqrt(delta)) / (2 * a);
Console.WriteLine("Rownanie ma dwa rozwiazania rowne "
+ r1 + " oraz " + r2);
}
else if (delta == 0) {
r1 = -b / (2 * a);
Console.WriteLine("Rownanie ma jedno, podwojne
rozwiazanie rowne " + r1);
}
else
Console.WriteLine("Rownanie nie ma rozwiazan
w dziedzinie rzeczywistej.");
Start
Wyświetl prośbę o podanie współczynników
Pobierz wartości współczynnik a, b i c
Oblicz wartość ∆ zgodnie z równaniem (3)
if ∆ > 0 then
Oblicz pierwiastki używając równania (4)
Wyświetl wynik
else
if ∆ == 0 then
Oblicz pierwiastki używając równania (5)
Wyświetl wynik
else
Wyświetl komunikat o braku pierwiastków w R
end
end
Stop
4
Schemat blokowy to grficzny zapis kolejnych operacji Cztery podstawowe elementy konwencji
graficznej
• sekwencyjne,
• iteracyjne,
• rekurencyjne.
• dziel i zwyciężaj,
• programowanie dynamiczne,
5
• metoda zachłanna,
• programowanie liniowe,
• wyszukiwanie wyczerpujące
• heurystyka.
• Notacja O – funkcja złożoności T (n) jest rzędu f (n), czyli T (n) = O(f (n)) jeżeli
• Notacja Θ – funkcja złożoności T (n) jest rzędu f (n), czyli T (n) = Θ(f (n)) jeżeli
• Notacja Ω – funkcja złożoności T (n) jest rzędu f (n), czyli T (n) = Ω(f (n)) jeżeli
Obliczmy złożoność czasową dla algorytmu liczącego iloczyn liczb całkowitych z przedziału
{1, n}, gdzie n jest zadane przez użytkownika.
T (n) = t6 (n + 1) + t7 .
Na podstawie T (n) stwierdzamy, że algorytm ma liniową złożoność.
6
Krok Operacja Czas wykonania
1 Wyświetl komunikat 1 · t1
2 Wczytaj liczbę n 1 · t2
3 k:=1 1 · t3
4 i:=0 1 · t3
5 jeżeli i == n przejdź do kroku 8 (n + 1) · t4
6 i++ n · t3
7 k*=i n · t3
8 Wyświetl k 1 · t1
9 Koniec 1 · t5
Realokacja pamięci wykorzystywana jest, gdy potrzebne jest zwiększenie wymiaru tablicy.
Stos to dynamiczna struktura liniowo uporządkowanych danych, w której mamy dostęp jedynie
do ostatniego elementu (wierzchołka stosu). Zapisywanie i pobieranie danych jest wykonywane
za pomocą strategii np. Last In – First Out (LIFO).
7
Stosy kojarzone są ze stertą książek, z którą jedyne, co możemy zrobić to położyć na szczy-
cie nową książkę lub zdjąć jedną z góry (aby sterta się nie zawaliła, jesli wyjmiemy z dołu).
Przykładowe zastosowania stosów
• przechowywanie rejestrów,
Odwotna Notacja Polska (ONP) to sposób notacji wyrażeń algebraicznych, w którym naj-
pierw zapisujemy operandy, następnie odpowiednio operatory. Jest to tzw. zapis postfiksowy.
Uwaga: W ONP nie używa się nawiasów, co jest dobrym rozwiązaniem upraszaczającym ob-
liczenia dla komputerów. Dlatego też stosuje się ją w kompilatorach języków wyższego rzędu.
ONP wykorzystuje stosy
Implementacja stosu
struct stos {
i n t r o z m i a r ; // maksymalny r o z m i a r s t o s u
i n t gora ;
i n t ∗ elementy ;
};
s t r u c t s t o s ∗ NowyStos ( i n t pojemnosc ) {
s t r u c t s t o s ∗ wskaznik =( s t r u c t s t o s ∗ ) m a l l o c ( s i z e o f ( s t r u c t s t o s ) ) ;
wskaznik−>r o z m i a r=pojemnosc ;
wskaznik−>g o r a =−1;
wskaznik−>elementy =( i n t ∗ ) m a l l o c ( s i z e o f ( i n t ) ∗ pojemnosc ) ;
r e t u r n wskaznik ;
}
Ilość elementów w stosie
i n t S i z e ( s t r u c t s t o s ∗ wskaznik ) {
r e t u r n wskaznik−>g o r a +1;
}
8
Czy stos jest pusty?
i n t IsEmpty ( s t r u c t s t o s ∗ wskaznik ) {
r e t u r n wskaznik−>g o r a==−1;
}
Czy stos jest pełen?
i n t I s F u l l ( s t r u c t s t o s ∗ wskaznik ) {
r e t u r n wskaznik−>g o r a == wskaznik−>rozmiar −1;
}
Nowy element x na szczyt stosu
v o i d Push ( s t r u c t s t o s ∗ wskaznik , i n t nowyElement ) {
i f ( i s F u l l ( wskaznik ) ) p r i n t f ( ” s t o s j e s t p e l e n \n ” ) ;
e l s e wskaznik−>elementy[++wskaznik−>wskaznik ]= nowyElement ;
}
Kolejka FIFO (First In – First Out) nazywamy dynamiczną strukturę liniowo uporządko-
wanych danych, w której mamy dostęp do elementów na początku i na końcu. Możemy usuwać
elementy z początku kolejki, a dodawać na końcu.
Intuicyjnie kojarzone są ze zwykłą kolejką ludzi, np. studentów do dziekanatu czy kolejkę do
kasy w hipermarkecie.
Kolejka priorytetowa to kolejka, w której każdy element ma swój priorytet, względem któ-
rego jest ustawiony. Im wyższy priorytet, tym bliżej początku kolejki.
Przykładem takiej kolejki jest kolejka w sklepie, gdzie kobiety w ciąży mają pierwszeństwo.
Podobnie jak stos, kolejka ma pewną pojemność. Jednakże, przepełnienie nie powoduje tak
dużych problemów – nadwymiarowy element jest wstawiany w miejsce najwcześniejszego. Im-
plementacja tej struktury danych korzysta z buforu cyklicznego. Technicznie, taki bufor jest
implementowany jako tablica z dwoma wskaźnikami lub zmiennymi indeksującymi. W kolejce
priorytetowej każdy element posiada dodatkową wartość nazywaną kluczem, który odpowiada
za ważność tego elementu. Umiejscowienie danego obiektu w kolejce zależy od klucza, a więc
dodatkowo będzie potrzebny mechanizm przeszukiwania lub sortowania.
Uwaga: Odnośnik do pierwszego rekordu nazywamy korzeniem listy, natomiast wskaźnik ostat-
niego elementu jest pusty.
Rodzaje list
9
2. Listy dwukierunkowe – każdy element posiada wskaźnik zarówno do swojego poprzednika,
jak i następnika, co pozwala na przeprowadzanie przeszukiwania w obu kierunkach.
3. Listy cykliczne – pierwszy element listy jest następnikiem ostatniego, dzięki czemu tworzy
się cykl. Listy cykliczne mogą być jednokierunkowe albo dwukierunkowe.
4. Listy z wartownikiem – lista, która zawiera dodatkowy element zwany wartownikiem, który
jest niewidoczny dla programisty stosującego tę strukturę. Wspomniany obiekt występuje
w pustej liście.
Uwaga: Definicja grafu skierowanego dopuszcza krawędzie postaci (v, v) nazywane pętlami.
Stopień wierzchołka jest cechą każdego wierzchołka v ∈ V , oznaczany jako degG (v). Stopień
charakteryzuje się ilością krawędzi dochodzących do tego wierzchołka.
Reprezentacja grafu dla zadanego grafu nieskierowanego G = (V, E), gdzie V = {1, 2, . . . , n}
i E = {e1 , e2 , . . . , em } ma
1. Postać graficzną,
2. Macierz sąsiedztwa A = A(G) ∈ Mn×n (Z)
(
0, i, j ∈
/E
Aij = (9)
1, i, j ∈ E
10
Reprezentacja grafu dla zadanego grafu skierowanego G = (V, E), gdzie V = {1, 2, . . . , n} i
E = {e1 , e2 , . . . , em } ma
1. Postać graficzna,
Cykl to droga zamknięta, czyli jeśli D = (v0 , e1 , v1 , e2 , . . . , ek , vk ) będzie drogą w grafie, wtedy
jeżeli v0 = vk , to D nazywamy cyklem (lub drogą zamkniętą).
Spójność to cecha graf niezorientowanego G = (V, E), jeżeli dla każdych dwóch wierzchołków
u, v ∈ V istnieje droga o końcach i u i v.
Acykliczność w grafie jest jeśli nie będzie istniał w nim żaden cykl.
11
Drzewo to dynamiczna struktura danych, która składa się z węzłów, w których przechowy-
wane są dane i krawędzi, wyrażających zależności między poszczególnymi węzłami. Drzewo jest
szczególnym przypadkiem grafu (jeżeli jest to graf acykliczny i spójny).
• Rodzic – węzeł, który jest w relacji z co najmniej jednym węzłem znajdującym się niżej od
niego w strukturze.
• Węzeł wewnętrzny – węzeł, który posiada zarówno rodzica, jak i co najmniej jedno dziecko.
• Ścieżka – ciąg węzłów w0 , w1 , . . . , wk takich, że wi jest dzieckiem węzła wi−1 . Długość takiej
ścieżki jest równa k.
• Poziom węzła (głębokość węzła) – długość ścieżki (ilość krawędzi) prowadzącej od korzenia
do tego węzła.
• Wysokość drzewa – maksimum z poziomów węzłów. (Wysokość drzewa pustego wynosi -1.)
• Stopień drzewa – maksimum ze stopni węzłów. (Stopień drzewa pustego wynosi -1.)
Własności:
1. Z każdego węzła istnieje dokładnie jedna ścieżka prowadząca do dowolnego innego węzła.
3. Każdy węzeł, który nie jest korzeniem posiada dokładnie jednego rodzica.
12
• Stopień drzewa jest równy 2.
Binary Search Tree Drzewem przeszukiwań binarnych nazywamy drzewo binarne, w którym
węzły są oznaczone etykietami (przypisane są klucze), a wśród nich można wprowadzić relację
mniejszości.
Musi być spełniona własność drzewa BST, czyli dowolny węzeł jest niemniejszy od swojego
lewego dziecka i niewiększy od swojego prawego dziecka.
• Element najmniejszy w takim drzewie znajdziemy, jeśli w trakcie przechodzenia niżej za-
wsze będziemy wybierać lewą krawędź.
• Element największy w takim drzewie znajdziemy, jeśli w trakcie przechodzenia niżej zawsze
będziemy wybierać prawą krawędź.
Wstawianie nowego elementu jako algorytm szukania miejsca dla nowego elementu można
przedstawić w krokach.
4. Proces powtarzamy tak długo, aż znajdziemy wolne miejsce (brak kolejnego węzła lub
liścia) dla nowego elementu.
Uwaga: Analogiczne jest przeszukiwanie drzewa. Co ważne, własność drzewa BST daje pew-
ność, że szukanego elementu nie ma w poddrzewie, którym się nie zajmujemy.
Binary Space Partitioning Tree Drzewa Binarnego Podziału Przestrzeni, czyli drzewa bi-
narne wykorzystywane do podziału (np. na sektory) przestrzeni 3D lub płaszczyzn 2D (trakto-
wanych jako rzuty ścian na płaszczyznę) są rozwinięciem praktycznym drzew BST.
13
Kopiec (heap) to specjalny rodzaj drzewa binarnego T = (V, E, r) z kluczami. Każdy wierz-
chołek jest nie większy niż jego poprzednik. Z tego warunku powstają własności
Kopiec zupełny to kopiec i drzewo binarne w jednym. Wszystkie poziomy tego kopca są
całkowicie zapełnione z wyjątkiem co najwyżej ostatniego, który jest spójnie wypełniony od
lewej strony.
Kopce jako struktury danych mają zastosowanie w
Drzewo Decyzyjne jest indukcyjną metodą podejmowania decyzji. Zbudowane jest z węzłów,
gałęzi i liści. Węzły są rozumiane jako testy na danych atrybutach, gałęzie to wyniki testu, a
liście etykiety klas.
14
Kryterium stopu Załóżmy, że drzewo jest konstruowane w sposób rekurencyjny. Zaczynamy
od korzenia i przemieszczamy się w dół podejmując decyzję czy tworzyć kolejny liść czy nie. Jeśli
nasze kryterium będzie spełnione, stworzymy liść i na podstawie podzbioru ustalamy etykietę.
W drugim przypadku, tworzymy węzeł i wybieramy test.
1. Jeśli podzbiór zawiera przykłady należące tylko do jednej klasy
2. Podzbiór jest pusty
3. Znacząca większość pochodzi z jednej klasy (generalizacja)
4. Zbiór testów jest pusty
Problem komiwojażera określa się gdy mamy zadany zbiór miast. Komiwojażer planuje
odwiedzić każde miasto w pobliżu, ale dokładnie raz. Dodatkowo, po odwiedzeniu ostatniego
miasta, chce wrócić do aktualnego (czyli do punktu wyjścia). Problem polega na znalezieniu jak
najkrótszej trasy pomiędzy wszystkimi miastami, ale tak, aby w każym mieście, komiwojażer
pojawił się tylko raz i swoją wędrówkę zakończył w pierwszym z nich.
Algorytm Dijkstry został zaproponowany przez Edsgera Dijkstrę służy do znajdowania naj-
krótszej ścieżki w grafie. Algorytm zakłada, że koszt na krawędziach grafu jest liczbą dodatnią.
15
Algorithm 2 Algorytm Dijkstry
Start
Tworzymy dwa zbiory wierzchołków – Q i S
while zbiór Q nie jest pusty do
Wybieramy ze zbioru Q wierzchołek u o najmniejszej wartości d(u)
Wierzchołek u usuwamy ze zbioru Q
Wierzchołek u dodajemy do zbioru S
Dla każdego sąsiada w ∈ Q wierzchołka u
if d(w) > d(u) + t(ewu ) then
obliczamy koszt przejścia do wierzchołka w jako
end
Następnie, wierzchołek u staje się poprzednikiem w, czyli p(w) = u
end
Stop
u 0 1 2 3 4 5
d(u) 0 3 4 6 3 5
p(u) −1 0 1 5 0 4
Algorytm A* został opisany już w 1968 roku przez Petera Harta, Nilsa Nilssona i Bertmama
Raphaela. Idea jest oparta na algorytmie Dijkstry. Algorytm poszukuje ścieżki pomiędzy dwoma
wierzchołkami w taki sposób, aby zminimalizować funkcję
gdzie g(v) jest to droga pomiędzy wierzchołkiem początkowym, a aktualnym v (czyli suma kosz-
tów na krawędziach), a h(v) to przewidywana droga od v do docelowego wierzchołka.
16
Algorithm 3 Algorytm A*
Start
Tworzymy dwa zbiory wierzchołków – Q i S
while zbiór Q nie jest pusty do
Wybieramy ze zbioru Q wierzchołek u o najmniejszej wartości d(u)
Wierzchołek u usuwamy ze zbioru Q
Wierzchołek u dodajemy do zbioru S
Dla każdego sąsiada w ∈ Q wierzchołka u sprawdamy sąsiadów
gdzie g(v) jest to droga pomiędzy wierzchołkiem początkowym, a aktualnym v (czyli suma
kosztów na krawędziach), a h(v) to przewidywana droga od v do docelowego wierzchołka
end
Stop
(
i, jeśli (i, j) ∈ E
p0 [i, j] = (17)
0, w przeciwnym wypadku
17
Algorithm 4 Algorytm Floyda-Warshalla
Input: Graf skierowany z wagami G = (V, E)
Output: Macierze d i p
Start
Definiujemy macierze d0 i p0
i=0
foreach u ∈ V do
foreach v ∈ V, v 6= u do
foreach w ∈ V, w 6= u, v do
l = di [v, u] + di [u, w]
if l < di [v, w] then
di+1 [v, w] = l
pi+1 [v, w] = pi [u, w]
end
else
di+1 [v, w] = di [v, w]
pi+1 [v, w] = pi [v, w]
end
end
end
i++
end
Zwróć ostatnie wyznaczone di i pi
Stop
1
3 4 5
5 7
4
2 1
1 2 1
6
2 7 6
3
d0 1 2 3 4 5 6 7 p0 1 2 3 4 5 6 7
1 0 1 5 ∞ ∞ ∞ ∞ 1 0 1 1 0 0 0 0
2 ∞ 0 2 ∞ ∞ ∞ ∞ 2 0 0 2 0 0 0 0
3 ∞ ∞ 0 ∞ ∞ ∞ ∞ 3 0 0 0 0 0 0 0
4 7 ∞ ∞ 0 1 ∞ ∞ 4 4 0 0 0 4 0 0
5 ∞ ∞ ∞ ∞ 0 1 ∞ 5 0 0 0 0 0 5 0
6 2 ∞ ∞ 4 ∞ 0 ∞ 6 6 0 0 6 0 0 0
7 6 ∞ ∞ ∞ ∞ 3 0 7 7 0 0 0 0 7 0
18
pary wierzchołków v, w ∈ V różnych od u i sprawdzamy, czy d0 [v, u] + d0 [u, w] < d0 [v, w].
• v=4
– w=2
Sprawdzamy odległości
d1 1 2 3 4 5 6 7 p1 1 2 3 4 5 6 7
1 0 1 5 ∞ ∞ ∞ ∞ 1 0 1 1 0 0 0 0
2 ∞ 0 2 ∞ ∞ ∞ ∞ 2 0 0 2 0 0 0 0
3 ∞ ∞ 0 ∞ ∞ ∞ ∞ 3 0 0 0 0 0 0 0
4 7 8 12 0 1 ∞ ∞ 4 4 1 1 0 4 0 0
5 ∞ ∞ ∞ ∞ 0 1 ∞ 5 0 0 0 0 0 5 0
6 2 3 7 4 ∞ 0 ∞ 6 6 1 1 6 0 0 0
7 6 7 11 ∞ ∞ 3 0 7 7 1 1 0 0 7 0
• Dla v = 1 rozważymy tylko przypadek w = 3, ponieważ nie istnieje żadna odkryta droga
z 2 do innych wierzchołków. Sprawdzamy, że
To oznacza, że znaleźliśmy drogę z 1 do 3, która jest krótsza niż wcześniej znana. Zapisujemy
jej długość d2 [1, 3] = 3 i ustalamy wartość p2 [1, 3] = p1 [2, 3] = 2. Na rysunku kolorem
czerwonym zaznaczona jest „stara” droga z wierzchołka 1 do 3, a na niebiesko nowo odkryta,
lepsza droga.
19
• Powtarzamy rozumowanie dla pozostałych wierzchołków v. Macierze d2 i p2 wyznaczone
w tym kroku przedstawia tablica.
d2 1 2 3 4 5 6 7 p2 1 2 3 4 5 6 7
1 0 1 3 ∞ ∞ ∞ ∞ 1 0 1 2 0 0 0 0
2 ∞ 0 2 ∞ ∞ ∞ ∞ 2 0 0 2 0 0 0 0
3 ∞ ∞ 0 ∞ ∞ ∞ ∞ 3 0 0 0 0 0 0 0
4 7 8 10 0 1 ∞ ∞ 4 4 1 2 0 4 0 0
5 ∞ ∞ ∞ ∞ 0 1 ∞ 5 0 0 0 0 0 5 0
6 2 3 5 4 ∞ 0 ∞ 6 6 1 2 6 0 0 0
7 6 7 9 ∞ ∞ 3 0 7 7 1 2 0 0 7 0
d 1 2 3 4 5 6 7 p 1 2 3 4 5 6 7
1 0 1 2 ∞ ∞ ∞ ∞ 1 0 1 2 0 0 0 0
2 ∞ 0 2 ∞ ∞ ∞ ∞ 2 0 0 2 0 0 0 0
3 ∞ ∞ 0 ∞ ∞ ∞ ∞ 3 0 0 0 0 0 0 0
4 4 5 7 0 1 2 ∞ 4 6 1 2 0 4 5 0
5 3 4 6 5 0 1 ∞ 5 6 1 2 6 0 5 0
6 2 3 5 4 5 0 ∞ 6 6 1 2 6 4 0 0
7 5 6 8 7 8 3 0 7 6 1 2 6 4 7 0
Z macierzy d możemy odczytać jaka jest długość najkrótszej drogi z 7 do 3 (d[7, 3] = 8). W
celu jej odtworzenia wykorzystamy macierz p w następujący sposób:
• Szukamy drogi 7−? − 3.
• Odczytujemy p[7, 3] = 2, stąd najlepsza droga z 7 do 3 przechodzi przez wierzchołek 2,
więc ma postać 7−? − 2 − 3.
• Teraz szukamy najlepszego sposobu na dostanie się z 7 do 2. Odczytujemy p[7, 2] = 1, a
więc szukamy drogi 7−? − 1 − 2 − 3.
• p[7, 1] = 6. Odkrywamy kolejny wierzchołek na trasie 7−? − 6 − 1 − 2 − 3.
• p[7, 6] = 7, co oznacza, że najlepszym połączeniem między 7 a 6 jest krawędź łącząca te
wierzchołki. Odtworzyliśmy więc całą najlepszą drogę z 7 do 3 w postaci 7 − 6 − 1 − 2 − 3.
Droga ta została oznaczona kolorem niebieskim.
1
3 4 5
5 7
4
2 1
1 2 1
6
2 7 6
3
20
Wyszukiwanie wzorca jest klasycznym problemem przetwarzania tekstów. Problem ten wy-
stępuje również w biologii (wyszukiwanie pewnych kombinacji genów) czy data mining (problemy
klasyfikacji). Załóżmy, że definiujemy go przy użyciu danych wejściowych:
• tekst – tablica T wymiaru n, gdzie każdy element należy do alfabetu, czyli T [i] ∈ Σ,
i ∈ {0, 1, . . . , n − 1},
Algorytm N (z ang. naive czyli naiwny ) jest najprostszym algorytmem tego typu. Złożo-
ność tego algorytmu jest równa Θ((n−m+1)m). Idea polega na porównywaniu każdego elementu
z tekstu ze wzorcem i jego przesuwanie do przodu.
Algorithm 5 Algorytm N
Start
Pobierz tekst T
Pobierz wzorzec P
n := length(T )
m := length(P )
i := 0
for i < n − m do
j := 0
For (j < m) if (T [i + j] = P [j]) then
if (i + j == m − 1) then
Wypisz wzorzec
j++
i++
end
Stop
21
Algorytm Karpa-Rabina podobnie jak dla algorytmu N, czas działania ma określany jako
pesymistyczny i wynosi tyle samo, czyli Θ((n − m + 1)m), a w innej notacji O(n2 ). Alfabet
traktujemy jako zbiór liczb (o zadanej podstawie d) i tak je porównujemy. W efekcie, tekst
będzie jedną, n-elementową liczbą. W obliczeniach najczęściej wykorzystujemy funkcję kodującą.
i++
end
Stop
f (u2 ) = u1 0, (18)
f (abaab2 ) = f (010012 ) = (0 · 24 + 1 · 23 + 0 · 22 + 0 · 21 + 1 · 20 )1 0 = 9.
Tekst: abaaba
+++++
Wzorzec: 9
Porównanie: 9 ? 9 - tak
f (abaab2 ) = f (010012 ) = 9
22
Algorithm 7 Algorytm Boyer-Moore
Start
Pobierz tekst T
Pobierz wzorzec P
n := length(T )
m := length(P )
i := m − 1
for (i > n − 1) do
j := m − 1
for (j < m − 1) do
if (P [j] == T [i]) then
if (j == 0) then
Wypisz wzorzec
else
j−−
i−−
end
else
i+ = m − M in(j, 1 + last[T [i]])
j =m−1
end
end
end
Stop
Odległość Levenshteina jest miarą odmienności skończonych ciągów znaków. Oznacza naj-
mniejszą liczbę działań prostych, przeprowadzająca jeden ciąg znaków w drugi.
23
Kodowanie i dekodowanie to przyporządkowanie wybranym elementom jakiegoś innego al-
fabetu np.: binarnego. Dekodowanie jest procesem odwrotnym do kodowania.
• Dzielimy zbiór S na dwa podzbiory w taki sposób, aby różnica sum prawdopodobieństw
między nimi była jak najmniejsza. Pierwszemu zbiorowi przydziel wartość 0, a drugiemu
1.
• Teraz, każdy ze zbiorów rozpatrujemy osobno i ponownie dzielimy dwa podzbiory i przy-
pisujemy 0 i 1. Każdy ze zbiorów dzielimy do momentu otrzymania zbiorów jednoelemen-
towych.
Znak
a 0
i 1 0
s 1 1 0
d 1 1 1
• Tworzymy listę drzew binarnych, które w węzłach będą miały dwie wartości – symbol i
prawdopodobieństwo.
• Dopóki liści jest więcej niż jedno drzewo, powtarzamy następujące operacje
24
Szyfrowanie i deszyfrowanie wykorzystuje się dwa klucze
3. nadawca szyfruje dane (bądź wiadomość) dzięki kluczowi publicznemu i wysyła zaszyfro-
waną wiadomość do odbiorcy,
• generowanie kluczy,
• szyfrowanie/deszyfrowanie.
25
• obliczamy wartość funkcji Eulera dla n przy pomocy
Obliczamy wartość n = 11 · 13 = 143 i funkcję Eulera z tej liczby ϕ(143) = (13 − 1)(11 − 1) =
120.
Znajdujemy wartość d z równania 7d mod 120 ≡ 1. Wynikiem tego jest liczba d = 103.
3. Ponieważ największy element znajduje się już na końcu ciągu procedura porównania od-
bywa się dla n − 1 elementów pierwotnego ciągu.
26
Sortowanie bąbelkowe to jeden z ważniejszych algorytmów ze względu na jego sposób dzia-
łania. Różnica polega jednak na tym, że zamiana elementów dokonana zostaje w poszczególnej
iteracji poprzez wszystkie sąsiednie elementy. Nie zamieniamy, tak jak poprzednio jedynie ele-
mentu ostatniego w ciągu ze znalezionym największym. Porównujemyze sobą kolejne elementy
w każdej rozpatrywanej parze. Znalezioną wartość ekstremalną przesuwamy w ustalonym kie-
runku. Następnie porównujemy elementy w kolejnej utworzonej parze szukając największego i
przesuwając go na koniec. Takie porównania wykonujemy, do końca ciągu aż element największy
znajdzie się na ostatnim miejscu.
27
Sortowanie quick sort polega na wyborze elementu środkowego w badanym ciągu. Następ-
nie układamy wszystkie elementy mniejsze od środkowego z lewej strony i jednocześnie wszystkie
elementy większe lub równe elementowi środkowemu z prawej jego strony.
28
Sortowanie merge sort polega na porównaniu elementów na szczycie stosów i wstawianiu ich
do innej tablicy. Otrzymujemy w ten sposób uporządkowany ciąg zawierający wszystkie elementy
obu ciągów ułożone w porządku hierarchicznym. Popatrzmy na działanie tego algorytmu na
przykładzie dwu uporządkowanych stosów.
Heurystyka 1 (gr. heuresis – odnaleźć, odkryć, heureka – znalazłem) jest to metoda znajdowa-
nia rozwiązań, dla której nie ma gwarancji znalezienia rozwiązania optymalnego, a często nawet
prawidłowego. Heurystyki to algorytmy służące do rozwiazywania problemów optymalizacyjnych
lub innych, gdzie algorytm rozwiązujący jest zbyt kosztowny lub gdy jest nieznany. Często uży-
wamy modelu heurystycznego opartego o wzorce ze świata zwierząt lub roślin.
1
https://pl.wikipedia.org/wiki/Heurystyka
29
N
X
fdeJong1 (x) = x2i , (23)
i=1
30
w zbiorze [−5, 5]. Gradient tej funkcji przyjmuje postać:
∂f ∂f 1 3 1
∇f = , = 4x − 32x + 5 , 4y 3 − 32y + 5 .
∂x ∂y 2 2
Przyjmiemy, że w każdej iteracji będzie 5 punktów przybliżających minimum i λ = 0.01.
Po zakończeniu zwracamy najlepsze przybliżenie z ostatniej iteracji. W przykładzie wyliczone
wartości będą zaokrąglane do 0.001.
1. Losujemy pierwsze przybliżenia (x0i , yi0 ), i = 1, . . . , 5 i obliczamy wartości funkcji f i gra-
dientu funkcji w tych punktach (3 pierwsze wiersze tabeli). Dla przykładu, dla punktu
(x01 , y10 ) = (3, 5) obliczamy wartość funkcji f (x01 , y10 ) = 101, oraz gradient funkcji
∇f (x01 , y10 ) = [8.5, 172.5].
2. Wyznaczamy nowe punkty x1i , yi1 w oparciu o gradienty w odpowiednich punktach. Dla
punktu (x11 , y11 ) ten proces wygląda następująco:
• Obliczamy λ∇f (x01 , y10 ) = [0.085, 1.725]
• Wyznaczamy współrzędne x11 = 3 − 0.085 = 2.915 i y11 = 5 − 1.725 = 3.275
3. Liczymy wartość funkcji f w nowych punktach (f (x11 , y11 ) = −44.687).
4. Porównujemy nowe wartości funkcji z odpowiadającymi starymi. Jeśli nowa wartość jest
mniejsza od poprzedniej, to nowy punkt zostanie uwzględniony w kolejnej iteracji. W na-
szym przypadku f (x01 , y10 ) = 101 > f (x11 , y11 ) = −44.687, więc nowy punkt przechodzi dalej.
W tabeli 1 znajdują się pośrednie wartości dla pozostałych punktów.
x01 y10 x02 y20 x03 y30 x04 y40 x05 y50
(x0i , yi0 )
3 5 3 3 0 5 1 -2 3 -3
f (x0i , yi0 ) 101 -48 125 -34 63
∂f ∂f ∂f ∂f ∂f ∂f ∂f ∂f ∂f ∂f
∇f (x0i , yi0 ) ∂x ∂y ∂x ∂y ∂x ∂y ∂x ∂y ∂x ∂y
8.5 172.5 8.5 8.5 2.5 172.5 -11.5 18.5 8.5 -3.5
λ∇f (x0i , yi0 ) 0.085 1.725 0.085 0.085 0.025 1.725 -0.115 0.185 0.085 -0.035
x11 y11 x12 y21 x13 y31 x14 y41 x15 y51
(x1i , yi1 )
2.915 3.275 2.915 2.915 -0.025 3.275 1.115 -2.185 2.915 -2.965
f (x1i , yi1 ) -44.687 -49.178 -20.165 -38.645 -63.688
x11 y11 x12 y21 x13 y31 x14 y41 x15 y51
(x1i , yi1 )
2.915 3.275 2.915 2.915 -0.025 3.275 1.115 -2.185 2.915 -2.965
f (x1i , yi1 ) -44.687 -49.178 -20.165 -38.645 -63.688
∂f ∂f ∂f ∂f ∂f ∂f ∂f ∂f ∂f ∂f
∇f (x1i , yi1 ) ∂x ∂y ∂x ∂y ∂x ∂y ∂x ∂y ∂x ∂y
5.399 20.353 5.399 5.399 2.9 20.353 -12.568 16.597 5.399 -2.192
λ∇f (x1i , yi1 ) 0.054 0.204 0.054 0.054 0.029 0.204 -0.126 0.166 0.054 -0.022
x21 y12 x22 y22 x23 y32 x24 y42 x25 y52
(x2i , yi2 )
2.861 3.071 2.861 2.861 -0.054 3.071 1.241 -2.351 2.861 -2.943
f (x2i , yi2 ) -48.124 -49.661 -23.452 -42.847 -63.969
31
Algorytm Gentyczny został stworzony przez Johna Hollanda w 1973. Główną ideą było
stworzenie programu komputerowego rozwiązującego problemy w sposób podobny do naturalnego
procesu ewolucji. Zastosowano ewolucję populacji składającej się z pewnej liczby osobników, w
której każda osoba miała ustawiony binarny kod genetyczny odpowiedający chromosomom w
organizmach oraz operacje, które zachodzą podczas biologicznego procesu ewolucji: mechanizm
przekształcania kodów binarnych - dziedziczenie, mutacje i selekcje.
Pierwszym krokiem GA jest inicjalizacja, która polega na ustaleniu wielkości populacji,
kodowaniu chromosomów i funkcji kryterialnej z zestawem ograniczeń. Elementy początkowej
populacji znajdujemy w sposób losowy.
Kolejnym krokiem jest reprodukcja. Osobnik xi jest przenoszony do następnego pokolenia
z prawdopodobieństwem, które rośnie wraz z wyższym poziomem funkcji kryterialnej f (xi ). Dla
wybranej grupy w populacji P t określamy zmienną losową pr przez
p (xt ) = f (xti )
r i xti . (26)
t
x ∈P t
i
Losowa zmienna jest próbkowana kilka razy i wprowadzana jest funkcja rozkładu prawdopodo-
bieństwa rozmnażania
i
X
Pr (xti ) = pr (xti ). (27)
j=1
Następnie pobierana jest losowa liczba α ∈ (0, 1). Jeśli xi jest zgodne z założeniem
to jest reprodukowane. Reprodukcja jest kontrolowana przez operator genetyczny, który tworzyć
zróżnicowaną populację. Operatory klasyczne to mutacje i krzyżowanie.
Mutacja to proces zmiany chromosomów, na przykład dodanie losowego rzeczywistego ξ ∈
(0, 1)
xit+1 mutated = xti + ξ. (29)
Wartości wektora λ, którego długość jest równa liczbie osobników w populacji, są wybierane
losowo. Każdy chromosom jest zmutowany, jeśli
λi < pm , (30)
32
Algorithm 9 Algorytm Genetyczny
t = 0: Stwórz populację początkową
while t ¬ generation do
foreach wektor xi z populacji X do
Sortuj populację według funkcji kryterialnej
Losuj prawdopodobienstwo mutacji wektorów i mutuj (29)
Krzyżuj wektory (31)
if f (wektorpopulacji) < f (rezerwowy) then
zmień
end
else
pozostaw
end
end
Nowa iteracja t = t + 1
end
gdzie η ∈ [0, 1] jest losową liczbą. Po krzyżowaniu następuje porównanie dopasowania „starych”
i „nowych” osobników. Te o wyższych wartościach funkcji F dołączą do kolejnego pokolenia.
Selekcja osobników do reprodukcji odbywać się będzie metodą ruletki. Każdemu elementowi
aktualnej populacji zostanie przyporządkowany fragment przedziału [0, 1] tym większy, im więk-
sze jest jego przystosowanie. Następnie, aż do wytworzenia nowej populacji o tej samej liczebności
co populacja początkowa, będą losowane liczby α, β ∈ [0, 1] i w zależności do którego kawałka
przedziału trafią, te osobniki zostaną wzięte do reprodukcji (ten sam osobnik może zostać wy-
losowany wielokrotnie w tej samej iteracji). Na wybranych osobnikach będziemy przeprowadzać
operacje mutacji i krzyżowania. Po wytworzeniu nowego pokolenia przechodzimy do kolejnej
iteracji.
33
i 1 2 3 4
x0i (-0.25, -0.95, 0.82) (3.69, 0.94, -3.16) (-2.26, 4.93, -1.13) (3.92, -4.29, 1.75)
F (x0i ) 73.36 50.51 44.31 38.17
λ0i 0.36 0.6 0.82 1
3. Dla jednego z rodziców losujemy liczby γ1 , γ2 , γ3 ∈ [0, 1]. Jeśli γk < pc , to k−ta współrzędna
zostanie zmutowana. Wynikiem losowania jest γ1 = 0.42, γ2 = 0.84, γ3 = 0.79, a więc żadna
ze współrzędnych nie zostanie zmutowana.
Losujemy γ1 , γ2 , γ3 ∈ [0, 1] dla drugiego rodzica. Wynik losowania: γ1 = 0.67, γ2 = 0.17, γ3 =
0.17, a więc drugi rodzic również nie zostanie zmutowany.
4. W związku z tym, że do reprodukcji został wylosowany dwa razy ten sam element, a jego
współrzędne nie zostały zmutowane, w wyniku krzyżowania otrzymamy dokładnie te same
elementy. Dołączają one zatem do następnego pokolenia P 1 .
6. Losujemy γ1 = 0.25, γ2 = 0.05, γ3 = 0.51, więc druga współrzędna x01 zostanie zmutowa-
na przed krzyżowaniem. Losujemy ξ = −0.14, czyli xm 1 = (−0.25, −0.95 − 0.14, 0.82) =
(−0.25, −1.09, 0.82).
Dla x03 wylosowano γ1 = 0.58, γ2 = 0.08, γ3 = 0.11, oraz ξ = −0.1
stąd xm3 = (−2.26, 4.93 − 0.1, −1.13) = (−2.26, 4.83, −1.13).
7. Przechodzimy do krzyżowania xm m
1 z x3 . Losujemy η = 0.95. Mamy:
xk1 = (−0.25 + 0.95(−2.26 + 0.25), −1.09 + 0.95(4.83 + 1.09), 0.82 + 0.95(−1.13 − 0.82))
8. Porównujemy dopasowanie:
9. W populacji P 1 mamy już 4 elementy, więc (jeśli warunek stopu nie został spełniony)
rozpoczynamy kolejną epokę.
10. Po zakończeniu działania programu zwracamy element o największej wartości funkcji do-
pasowania. Tabela 4 przedstawia populację po kilku pierwszych iteracjach.
34
x0i (-0.25,-0.95,0.82) (3.69,0.94,-3.16) (-2.26,4.93,-1.13) (3.92,-4.29,1.75)
P0
F (x0i ) 73.36 50.51 44.31 38.17
x1i (-0.35,-0.79,0.72) (-0.25,-0.95,0.82) (-2.26,4.93,-1.13) (-2.26,4.93,-1.13)
P1
F (x1i ) 73.74 73.36 44.31 44.31
x2i (-0.77,0.56,0.32) (-0.35,-0.79,0.72) (-0.35,-0.79,0.72) (-0.25,-0.95,0.82)
P2
F (x2i ) 74 73.74 73.74 73.36
x3i (-0.77,0.56,0.32) (-0.77,0.56,0.32) (-0.02,-1.14,0.72) (-0.02,-1.14,0.72)
P3
F (x3i ) 74 74 73.18 73.18
...
x5i 0 (-0.09,0.08,0.11) (-0.09,0.08,0.1) (-0.11,0.08,0.09) (-0.14,0.08,0.06)
P 50
F (x5i 0) 74.9745 74.9744 74.9726 74.9692
Ewolucja Różnicowa została wprowadzona przez Storn i Price w 1997. Algorytm jest heu-
rystycznym podejściem do minimalizowania nieliniowych i nierozróżnialnych funkcji przestrzeni
ciągłej. Algorytm opiera się :
1. N P - wielkość populacji,
3. CR - prawdopodobienstwo krzyżowania.
Działa na populacji X osobników xi , gdzie i = 1, ..., N P i xi = [x1i , x2i , ..., xDi ]T . Najpierw
tworzymy losowo populację xi G , gdzie G = 1 jest liczbą osób w populacji.
Mutacja to losowe permutacje wektorów xi poprzez różnicowanie dwóch wektorów z popu-
lacji X skalując je przez stałą wartość. Dla każdego wektora xi G generujemy zmutowany wektor
vi G
vi G+1 = xr1 G + F · (xr2 G − xr3 G ), (32)
o losowych indeksach r1, r2, r3 ∈ {1, 2, . . . , N P } oraz r1 6= r2 6= r3 6= i, F ∈ [0, 2] jest stałą
rzeczywistą.
Krzyżowanie to mieszanie losowych elementów wektora macierzystego xi G oraz wektora
vi G+1 po mutacji
(
G+1
vji if rndj < CR or j = di
uG+1
ji = G , j = 1, . . . , D, (33)
xji if rndj > CR and j 6= di
gdzie CR ∈ [0, 1] jest stałą krzyżowania, rndj jest jednolitym generatorem liczb losowych ∈ [0, 1]
oraz di ∈ 1, 2, . . . , D jest losowym indeksem.
Algorytm Kukułki został wprowadzony przez Yang and Deb w 2009. CS jest bardzo sku-
teczną techniką optymalizacji bezgradientowej, w której stosujemy rozkład Gaussa. Algorytm
symuluje zachowanie kukułek, które mają szczególny model rozmnażania. Kukułka leci i szuka
gniazda, by złożyć jajo. Wybiera gniazdo, gdzie są już jaja. Kukułki składają jajo i odlatują.
Kiedy gospodarze wracają do domu albo pozbywają się jaja intruza, albo po prostu akceptują
nową sytuację.
35
Algorithm 10 Ewolucja Różnicowa
t = 0: Stwórz populację początkową xG i
while t ¬ generation do
foreach wektor xG i z populacji X do
Mutuj viG (32)
Krzyżuj wektory (33)
if f (uG+1
i ) < f (xG
i ) then
G+1 G+1
xi = ui –zmień
end
else
xiG+1 = xGi –pozostaw
end
end
Nowa iteracja t = t + 1
end
Proces poszukiwania gniazda dla jaj jest modelowany i stosowany jako algorytm CS, gdzie
zakładamy:
1. Kukułka to po prostu xi .
5. Hosty mogą stwierdzić jajo intruza z prawdopodobieństwem 1 − pα ∈ h0, 1i i pozbyć się go.
W tym przypadku nowa kukułka jest umieszczana losowo.
W każdym pokoleniu modelujemy wybór miejsca, w którym kukułka składa jajo. Ten ruch
wykorzystuje koncepcję błądzenia losowego, co umożliwia wyszukiwanie w różnych przestrze-
niach.
36
Algorithm 11 Algorytm Kukułki
t = 0: Stwórz populację początkową
while t ¬ generation do
Przemieść kukułki (34), (35)
Decyzja czy ptaki odkryły jajo intruza (36)
Posortuj punkty według wartości wunkcji kryterialnej
Wybierz najlepsze, a resztę zastąp losowo
Nowa iteracja t = t + 1
end
gdzie H(xt+1
i )to decyzja ptaków tzn. jaja kukułki, pα ∈ h0, 1i prawdopodobieństwo pozostania
jaja.
Algorytm kukułki zaprezentujemy na przykładzie minimalizacji funkcji Rastragina
f (x, y) = 20 + x2 − 10 cos(2πx) + y 2 − cos(2πy)
na zbiorze [−10, 10] × [−10, 10]. Przyjmiemy następujące wartości parametrów: δ = 1, γ =
1, pα = 0.6. Dodatkowo, by nie tracić najlepszych rozwiązań, w tym przykładzie ustalimy, że
wyrzucone mogą zostać tylko dwa najgorsze jajka. W każdej iteracji będziemy uwzględniać n = 5
kukułek (jaj).
1. Losujemy początkową populację i sortujemy ją ze względu na wartość funkcji f (dwa pierw-
sze wiersze tabeli 5).
2. Dla każdego rozwiązania tworzymy nowe przesuwając je o losowy wektor. Dla pierwszego
z nich mamy:
(x11 , y11 ) = (x01 , y10 ) + µL(β, γ, δ) = (−3, 2) + [1.79, −0.62] = (−1.21, 1.38).
Obliczamy f (x11 , y11 ) = 28.17 > f (x01 , y10 ) = 13, a więc stare jajko zostaje uwzględnione w
kolejnych krokach. Wektory przesunięcia dla każdego punktu przedstawione są w tabeli 5
wraz z otrzymanymi nowymi rozwiązaniami. Wiersz Ptmp,sort 1 zawiera jaja uwzględnione w
kolejnych działaniach posortowane zgodnie z wartościami funkcji f .
3. W tym kroku niektóre jaja zostaną odkryte przez gospodarza i wyrzucone z gniazd. Zostaną
one zastąpione losowym rozwiązaniem. Dla dwóch ostatnich rozwiązań losujemy p. Jeśli p <
1−pα = 0.4, to rozwiązanie zostaje zastąpione. Dwa ostatnie wiersze zawierają posortowane
rozwiązania otrzymane w tej iteracji.
37
P1 (−0.76, −0.09) (−3, 2) (4, −3) (4.54, 1.28)
f (P 1 ) 11.51 13 25 53.81
µL() [2.02, 1.67] [−1.42, 0.05] [0.45, −0.77] [−1.41, −0.61]
2
Ptmp (1.26, 1.58) (−4.42, 2.05) (4.45, −3.77) (3.13, 0.67)
2 )
f (Ptmp 33.47 42.99 62.27 28.21
2
Ptmp,sort (−0.76, −0.09) (−3, 2) (4, −3) (3.13, 0.67)
p − − 0.17 0.22
2
Ptmp2 (−0.76, −0.09) (−3, 2) (−1.05, −0.68) (1.38, 2.99)
P2 (−0.76, −0.09) (−3, 2) (−1.05, −0.68) (1.38, 2.99)
f (P 2 ) 11.51 13 16.31 28.15
µL() [−0.39, 1.53] [0.65, −3.75] [−2.06, −0.06] [−0.18, 3.01]
3
Ptmp (−1.15, 1.44) (−2.35, −1, 75) (−3.11, −0.74) (1.2, 6)
3 )
f (Ptmp 26.82 34.46 23.14 44.35
3
Ptmp,sort (−0.76, −0.09) (−3, 2) (−1.05, −0.68) (1.38, 2.99)
p − − 0.05 0.63
3
Ptmp2 (−0.76, −0.09) (−3, 2) (−1.07, 3.98) (1.38, 2.99)
P3 (−0.76, −0.09) (−3, 2) (−1.07, 3.98) (1.38, 2.99)
f (P 3 ) 11.51 13 18.02 53.81
Algorytmy rojowe powstają w wyniku inspiracji zachowaniem gromad ptaków, ryb, zwie-
rząt lądowych czy rojów owadów. Tworzą one symulacje komputerowe nasladujące ruch stada
ptaków lub ławicy ryb, gdzie staramy się odwzorować zachowania stadne pozwalające im po-
ruszać się synchronicznie pomimo częstych gwałtownych zmian kierunku lotu, rozproszenia czy
przegrupowania stada.
Algorytm Roju Cząstek został opracowany przez Kennedy’egou, Eberharta i Shi w 1996 jako
symulator zachowań społecznych ruchu organizmów w stadzie ptaków lub ławicy ryb. Cząstki
38
przemieszczają się według równania
xi t+1 = xi t + βvi t (37)
gdzie xi t jest pozycją cząstki w przestrzeni rozwiązań w iteracji t, vi t jest prędkością cząstki
obliczaną według równania
x01 y10 x02 y20 x03 y30 x04 y40 x05 y50 Ps0
(x0 , y 0 )
-3 6 1 5 2 -4 5 5 -5 -6 2 -4
f (x0 , y 0 ) 45 26 20 50 61 20
vx01 vy01 vx02 vy02 vx03 vy03 vx04 vy04 vx05 vy05
(vx0 , vy0 )
2.15 0.88 1.57 -3.99 -4.5 -1.62 -0.42 -1.06 -4.61 -0.2
(x1 , y 1 ) -0.85 6.88 2.57 1.01 -2.5 -5.62 4.58 3.94 -9.61 -6.2
f (x1 , y 1 ) 48 7.62 37.87 36.55 130.72
x1 y1 x2 y2 x3 y3 x4 y4 x5 y5 Ps1
Pi1
-3 6 2.57 1.01 2 -4 4.58 3.94 -5 -6 2.57 1.01
f (Pi1 ) 45 7.62 20 3.94 61 7.62
39
6. Jeśli warunek stopu nie został spełniony, przechodzimy do kolejnej iteracji (kilka z nich
przedstawia tabela 8, z kolei w tabeli 9 znajdziemy najlepsze położenia cząstek w tych
krokach).
(x1i , yi1 ) (−0.85, 6.88) (2.57, 1.01) (−2.5, −5.62) (4.58, 3.94) (−9.61, −6.2)
f (x1i , yi1 ) 48 7.62 37.87 36.55 130.72
v1 [5.17, −5.17] [2.17, −9.43] [ − 4.5, −1.62] [ − 2.12, −6.5] [ − 0.37, 1.01]
(xi , yi2 )
2 (4.32, 1.7) (4.74, −8.42) (−6.99, −7.25) (2.35, −2.56) (−9.98, −5.19)
f (x2i , yi2 ) 21.56 93.45 101.43 12.09 126.51
v2 [5.70, −8.54] [2.17, −9.43] [0.43, 2.53] [ − 3.23, −7.95] [8.13, 4.68]
3
(xi , yi3 ) (10, −6.84) (6.91, −10) (−6.56, −4.72) (−0.87, −10) (−1.85, −0.51)
f (x3i , yi3 ) 146.79 147.75 65.31 100.76 3.68
Pst
Pi0 (−3, 6) (1, 5) (2, −4) (5, 5) (−5, 6) (2, −4)
f (·) 45 26 20 50 61 20
Pi1 (−3, 6) (2.57, 1.01) (2, −4) (4.58, 3.94) (−5, −6) (2.57, 1.01)
f (·) 45 7.62 20 36.55 61 7.62
Pi2 (4.32, 1.7) (2.57, 1.01) (2, −4) (2.35, −2.56) (−5, −6) (2.57, 1.01)
f (·) 21.56 7.62 20 12.09 61 7.26
Pi3 (4.32, 1.7) (2.57, 1.01) (2, −4) (2.35, −2.56) (−1.85, −0.51) (−1.85, −0.51)
f (·) 21.56 7.62 20 12.09 3.68 3.68
gdzie ρ jest współczynnikiem wyparowania, t numerem iteracji, n liczbą mrówek w kolonii po-
dróżujących z punktu xi na odległość Γti .
Odległość jest obliczana według wzoru
n
X 1
Γti = , (40)
i=1
Ltij
40
gdzie w iteracji t mrówki poruszją się pomiędzy xi t , xj t o współrzędnych xti,k , xtj,k .
Prawdopodobieństwo wyboru ścieżki z xi do xj jest obliczane według wzoru
[f t (xi , xj )]α
pt (xi , xj ) = X , (42)
[f t (xi , xα )]α
k
Ltiα
α∈Ni
gdzie α wsp. oddziaływania feromonów, Lij jest odległością pomiędzy xi oraz xj (41), Nik jest
zbiorem pozycji mrówek z punktu xi , których mrówka k nie odwiedziła.
Ruch mrówek jest zależny od prawdopodobieństwa wyboru ścieżki (42). Mrówki przemiesz-
czają się według równania
xi t+1 ← xi t |max pt (xi ,xj ) (43)
gdzie max pt (xi , xj ) jest największym prawdopodobienstwem przemieszczenia z xi do xj .
Algorytm Pszczeli opracował Karaboga w 2005 jako technikę optymalizacji inspirowaną za-
chowaniem pszczół miodnych w ulu. Zakładamy, że jest tylko jedna pszczoła dla każdego źródła
pożywienia. Innymi słowy, liczba wykorzystanych pszczół w kolonii jest równa liczbie źródeł
żywności wokół ula. Zatrudnione pszczoły trafiają do źródła pożywienia i wracają do ula, gdzie
tańczą przekazując współrzędne.
Wymiana informacji między poszczołami jest modelowana równaniem
F (xi )
p(xi ) = n , (44)
X
F (xi )
i=1
gdzie F (xi ) jest wartością funkcji kryterialnej dla najlepszej pozycji zapamiętanej przez daną
pszczołę.
Dzieki tej informacji pszczoły lecą poszukiwać pożywienia w najlepszym kierunku. Model
ruchu jest opisany równaniem
gdzie k jest losowym indeksem pszczoły pośród najlepszych pozycji, αk jest wartością losową z
przedziału [−1, 1], ∆xik jest obliczana
Algorytm Świetlika opracował Yang w 2008 jako technikę optymalizacji inspirowaną zacho-
waniem świetlików podczas godów, kiedy na podstawie świetlnych błysków poszukują najlepszego
partnera.
1. Wszystkie świetliki są jednopłciowe, dzięki czemu każdy pojedynczy świetlik zostanie przy-
ciągnięty do wszystkich innych świetlików.
41
4. Jeśli nie ma świetlików jaśniejszych niż dany świetlik, porusza się on losowo.
Aby model FA symulował rzeczywiste środowisko, określamy cechy biologiczne jako czynniki
numeryczne dla modelowanych osobników: Ipop - indywidualne natężenie światła, µ - losowy ruch
jednostek, βpop - atrakcyjność, γ - absorpcja światła otoczenia.
gdzie xi t oraz xj t asą stanami obiektu, µt ijest wpółczynnikiem losowości ruchu w iteracji t,
t (r t ; F t ) jest atrakcyjnością danego punktu (48).
βij ij ij
Algorytm Nietoperza opracował Yang w 2010 jako technikę optymalizacji inspirowaną za-
chowaniem echolokacji nietoperzy, ze zmiennymi pulsami emisji i głośności.
4. Długość fali λ (lub częstotliwość f ) oraz głośność pulsów może się zmieniać w trakcie
polowania.
5. Nietoperze mogą automatycznie dostosować długość fali i częstość emisji pulsów, w zależ-
ności od bliskości ich celu.
42
Najpierw wyznaczymy lidera (punkt o najlepszych własnościach wzgledem funkcji kryte-
rialnej) w danej iteracji ∗xt . Następnie mierzymy odległość pozostałych osobników (punktów)
względem wybranego lidera. Odległość pomiędzy dowolnym nietoperzem i oraz liderem ∗xt w
badanej przestrzeni określimy metryką kartezjańską
v
u 2
uX
t t
ri = ||xi − ∗x || = t (xi,k − ∗xtk )2 (50)
k=1
Literatura
• Cormen T., Introduction to Algorithms, MIT University Press Group Ltd 2009.
• Heineman G., Pollice G., Selkow S., Algorytmy. Almanach. Helion 2010.
• Rytter W., Diks K., Banachowski L., Algorytmy i struktury danych, Wydawnictwo Nauko-
we PWN, Warszawa 2017.
• Aho A., Hopcroft J., Ullman J., Algorytmy i struktury danych, Helion 2003.
• Bäck T., Fogel D., Michalewicz Z., Handbook of evolutionary computation, CRC Press
1997.
• Bonabeau E., Dorigo M., Theraulaz G., Swarm Intelligence: From Natural to Artificial
Systems, Oxford University Press, 1999.
43