Laboratorium odbywa się w każdy czwartek między godziną 08:15 a 10:00 w sali laboratoryjnej 09 (piwnica) na wydziale EiTI. Do sali laboratoryjnej zabrania się wnoszenia okrycia wierzchniego, tj. kurtek, płaszczy, etc.
Sugerowanym językiem implementacji rozwiązań zadań laboratoryjnych jest język Python. Dopuszczalne jest użycie innego języka programowania (z wyłączeniem języków ezoterycznych). Wymagane jest, aby kod każdego ćwiczenia laboratoryjnego był sformatowany zgodnie z The Black Code Style: Current style.
Po odebraniu tematu ćwiczenia laboratoryjnego nie ma obowiązku fizycznej obecności w laboratorium. Ćwiczenia mogą być realizowane na komputerach osobistych. Należy jednak zadbać o to, aby przygotowane przez Państwa programy dały się uruchomić pod systemami operacyjnymi z rodziny GNU/Linux.
Ćwiczenia laboratoryjne wykonywane są pojedynczo z wyjątkiem ćwiczenia poświęconemu sieciom neuronowym, które wykonywane jest w parach.
Rozwiązaniem każdego ćwiczenia laboratoryjnego powinna być dokumentacja oraz kod źródłowy zaimplementowanych algorytmów.
Dokumentacja powinna składać się z sekcji, w których zostaną zawarte następujące informacje:
Rozwiązanie każdego ćwiczenia należy wysłać drogą mailową w formie archiwum
zip, które powinno zawierać plik pdf dokumentacji
oraz pliki źródłowe programu. Plik archiwum należy nazwać zgodnie według
poniższego wzoru:
wsi-{numer indeksu}-{numer ćwiczenia}.zip
Ponadto w wiadomości e-mail należy dostarczyć repozytorium git z kodem źródłowym oraz historią zmian. W tym celu można wykorzystać wydziałowego GitLaba lub dowolny publicznie dostępny serwer.
Uwaga!
Dokumentacja nie powinna przekraczać 5 stron A4. Domyślnym językiem, w którym dokumentacja powinna być napisana, jest język polski -- dopuszcza się także, aby dokumentacja była napisana w języku angielskim.
Rozwiązanie zadania laboratoryjnego ocenianie jest w skali 0-7 punktów lub 0-8 punktów (ćwiczenie dotyczące sieci neuronowych). Na ocenę składają się:
W celu uzyskania oceny należy zaprezentować działanie zaimplementowanego algorytmu przed prowadzącym w trakcie laboratorium oraz odpowiedzieć na jego pytania dotyczące raportu.
Opóźnienie w dostarczeniu rozwiązania skutkuje naliczaniemn kary w następujący sposób: $$ O_k = max\{O_p(1 - 10\%n),\; 0\} $$ gdzie \(n\) odpowiada liczbie dni opóźnienia, a \(O_k\) i \(O_p\) odpowiednio ocenie końcowej i proponowanej.
| Temat | Start | Punktacja |
|---|---|---|
| Algorytmy ewolucyjne i genetyczne | 2025-10-09 | 0-7 |
| Dwuosobowe gry deterministyczne | 2025-10-23 | 0-7 |
| Regresja i klasyfikacja | 2025-11-06 | 0-7 |
| Przeszukiwanie przestrzeni | 2025-11-27 | 0-7 |
| Sztuczne sieci neuronowe | 2025-12-11 | 0-8 |
| Uczenie się ze wzmocnieniem | 2026-01-08 | 0-7 |
| Modele bayesowskie | 2026-01-22 | 0-7 |
Zaprojektuj i zaimplementuj algorytm ewolucyjny (np. strategię ewolucyjną (1+1)). Następnie zbadaj jego zbieżność na funkcjach
n = 10, 30. Przyjmij maksymalną liczbę wywołań funkcji celu równą:
$$ FE_{max} = 100 \times n $$
Pamiętaj, że implementacja solwera powinna być w stanie zoptymalizować każdą zadaną funkcję celu
oraz posiadać co najmniej dwa warunki stopu.
Sugerowana sygnatura funkcji:
def solver(
eval_func: Callable[[Sequence[float]], float],
x0: Sequence[float],
params: SolverParameters,
...
) -> SolverResult:
Zaimplementuj algorytm min-max w grze kółko i krzyżyk na planszy 3x3. Program powinien grać sam ze sobą i wizualizować kolejne stany gry na terminalu. Zbadaj wpływ głębokości przeszukiwania drzewa gry na jakość uzyskanych wyników.
Pamiętaj, aby logika gracza była odeseparowana od logiki samej gry.
Zaimplementuj algorytm drzewa klasyfikującego oraz zbadaj działanie algorytmu w zastosowaniu do zbioru danych Wine Quality Data Set.
W celu dostosowania zbioru danych do problemu klasyfikacji binarnej zdyskretyzuj zmienną objaśnianą. Pamiętaj, aby podzielić zbiór danych na zbiór trenujący oraz uczący.
Zbadaj wpływ hiperparametrów na działanie implementowanego algorytmu. Porównaj działanie implementowanego algorytmu względem wybranego modelu bazowego (np. regresja logistyczna).
Zaimplementuj algorytm gradientu prostego. Następnie zbadaj zbieżność algorytmu, używając następujących funkcji:
Zbadaj wpływ początkowej wartości parametru kroku na zbieżność (wykres par (\(t, q(x_{t})\)), gdzie t to krok/numer iteracji) metody oraz czas jej działania. W swoich badaniach rozważ następujące wartości początkowe parametru \(\alpha \in \{1, 10, 100\}\).
Do wyliczenia gradientu funkcji możesz skorzystać z pakietu
autograd. Pamiętaj, że implementacja solwera powinna być w
stanie zoptymalizowac każdą zadaną funkcję celu oraz posiadać co najmniej dwa warunki stopu.
Sugerowana sygnatura funkcji:
def solver(
eval_func: Callable[[Sequence[float]], float],
x0: Sequence[float],
params: SolverParameters,
...
) -> SolverResult: