Poniżej znajdują się propozycje projektów dla mojej grupy laboratoryjnej. Tematy zostały dobrane tak, aby dać studentom jak największe pole do interpretacji i dopracowania własnych wariantów danego problemu. Tematy projektów zostały podzielone na grupy. Projekty z danej grupy dotyczą problemów specyficznych dla określonej dziedziny informatyki, nie wliczając w to tematów zaproponowanych przez samych studentów.
Tematy dobrałem tak, aby studenci wykazali się minimalną chęcią samodzielnego zdobywania wiedzy informatycznej (w większości przypadków trzeba będzie coś dodatkowo przeczytać i (oczywiście) zrozumieć, zanim przystąpi się do implementacji).
Przy wybieraniu tematu i ustalaniu zakresu w jakim chcecie go zrealizować należy kierować się zdrowym rozsądkiem. Nie nakładajcie na siebie pracy, której później nie będziecie w stanie zrealizować. Bądźcie świadomi tego, że dla was priorytetem powinno być zalicznie obowiązków (Logika i Analiza Matematyczna) z jak najlepszym wynikiem. Program, który napiszecie w ramach projektu na kurs C nie musi być duży, aby mieć szanse na otrzymanie maksymalnej liczby punktów. Należy jedynie spełnić kilka warunków techniczno-estetycznych, które są podane na końcu tego dokumentu.
Oto moje propozycje:
Struktury danych:
Drzewo trie
Napisać strukturę danych typu słownik, która jako klucze będzie przechowywać słowa nad skończonym alfabetem (np. angielskim), a jako wartości pewien określony typ danych. Drzewo trie jest to ukorzenione drzewo, które w każdym wierzchołku przechowuje literę. Węzły są ze sobą połączone w taki sposób, aby czytając po koleji litery na dowolnej ścieżce od korzenia do liścia otrzymać słowo należące do naszego słownika. Z każdym liściem (czyli słowem) związana jest wartość określonego z góry typu.
Prostą wersją tego zadania byłoby napisanie w C modułu trie, w którym przyjęlibyśmy typ danych przechowywanych przez słownik, jako liczby naturalne. Taki słownik można by wykorzystać do efektywnego zliczania słów w tekście, co też można przyjąć jako część zadania.
Trudniejsza wersja to wykorzystanie klas i szablonów w C++ do stworzenia ogónej wersji słownika, który podczas tworzenia może przyjąć za wartości dowolny typ danych.
Materiały pomocnicze:
- http://informatyka.wroc.pl/node/1129
- http://www.cs.bu.edu/teaching/c/tree/trie/
- http://en.wikipedia.org/wiki/Trie
Kopiec binarny
Kopiec binarny jest (prostą!) strukturą danych realizującą tzw. kolejkę priorytetową. Od takiej struktury oczekujemy, że w szybkim czasie możemy zwrócić minimalny (lub maksymalny) element z aktualnie przechowywanego zbioru elementów.
Zadaniem jest napisać moduł w C/C++, w którym znajdować się będzie implementacja kopca binarnego. Jako podstawowy test poprawności należy napisać algorytm sortowania przez kopcowanie i pokazać jego działanie dla przykładowych danych.
Jako jeden z wariantów tego zadania można stworzyć interfejs graficzny, w którym pokazana będzie symulacja działania kopca binarnego dla najważniejszych operacji (usuwanie elementy maksymalnego i dodawanie elementu do kopca).
Jako część zadania można przetestować działanie swojej implementacji dla jakiegoś algorytmu wykorzystującego kolejki priorytetowe (np. algorytm Prima lub algorytm Dijkstry).
Materiały pomocnicze:
Drzewo zbalansowane
Drzewo binarne jest zbalansowane, jeśli czas wykonania operacji wstawiania, usuwania i wyszukiwania klucza w tym drzewie jest proporcjonalne do log n, gdzie n jest liczbą wierzchołków w drzewie. Napisz implementację jednego (lub kilku) drzew zbalansowanych. Do wyboru: drzewo AVL, drzewo czerwono-czarne lub drzewiec.
Implementacje w C/C++ należy przechowywać w osobnych modułach.
Materiały pomocnicze:
- http://pl.wikipedia.org/wiki/Drzewo_czerwono-czarne
- http://edu.i-lo.tarnow.pl/inf/utils/002_roz/mp002.php
- http://informatyka.wroc.pl/node/787
Algorytmika:
Otoczka wypukła
Problem otoczki wypukłej jest podstawowym problemem w dziedzinie geometrii obliczeniowej. Mamy dany zbiór punktów na płaszczyźnie i chcemy znaleźć najmniejszy wielokąt wypukły zawierający w sobie wszystkie te punkty.
Zadanie polega na napisaniu dowolnego algorytmu znajdowania otoczki wypukłej i przedstawienie jak on działa krok po kroku korzystając z interfejsu graficznego.
Zamiast intefejsu graficznego można zaimplementować kilka algorytmów i porównać czasy ich działania na przykładowych danych. Wyniki można wtedy przedstawić w konsoli.
Materiały pomocnicze:
- http://informatyka.wroc.pl/node/910
- http://pl.wikipedia.org/wiki/Algorytm_Grahama
- http://pl.wikipedia.org/wiki/Algorytm_Jarvisa
Widoczność
Problem widoczności stanowi ważne zagadnienie w planowaniu ruchu robotów (i nie tylko) i posiada wiele ciekawych wariantów. My zajmiemy się tym najprostszymi. Jako dane przyjmujemy wielokąty wypukłe rozmieszczone na płaszczyźnie (można się ograniczyć do kilku wybranych figur np. kwadrat, prostokąt i trójkąt) oraz punkt obserwatora (oko robota). Chcemy się dowiedzieć jakie figury są widoczne z tego punktu (zakładamy że oko robota może obracać się o 360 stopni).
Zadanie można urozmaicać na wiele sposobów, kilka z nich to:
- Zamiast figur możemy mieć rozłączny zbiór odcinków
- Jako dane przyjąć jeden wielokąt prosty i punkt w środku tego wielokąta i odpowiedzieć na pytanie: jakie ściany (boki wielokąta) są widoczne z punktu obserwatora.
Dla tego zadania mile widziany jest interfejs graficzny.
Materiały pomocnicze:
- informatyka.wroc.pl/node/455
- http://web.informatik.uni-bonn.de/I/GeomLab/VisPolygon/index.html.en
- http://wazniak.mimuw.edu.pl/index.php?title=Zaawansowane_algorytmy_i_struktury_danych/Wyk%C5%82ad_11
Najkrótsze ścieżki w grafie
Napisać program z interfejsem graficznym do tworzenia i manipulowania grafami (skierowanymi i/lub nieskierowanymi). Co powinno dać się zrobić:
- Tworzyć wierzchołki i krawędzie w grafie przy pomocy myszki (+ ew. przy trzymaniu jakieś klawisza).
- Zapisać narysowany graf do pliku tekstowego.
- Wczytać graf z pliku.
- Po wejściu w specjalny tryb ma być możliwość zaznaczenia dwóch wierzchołków, po czym wyznaczona (i zaznaczona) ma być między nimi najkrótsza ścieżka (np. przy użyciu algorytmu Dijkstry).
Pathfinding
Napisz program, który dla dwuwymiarowej mapy rozmiaru n x m znajdzie najkrótszą ścieżkę między pewnymi dwoma wyznaczonymi polami na planszy. Mapa jest złożona z jednakowej wielkości kwadratowych pól. Między polami można poruszać się w poziomie, pionie i na skos. Pole może przyjmować dwa stany: albo jest puste i można po nim chodzić, albo stoi na nim ściana (można dodać inne typy pól: trawa, woda itp. Przejście przez takie pole zajmuje więcej czasu niż przez pole puste). Użyj algorytmu A-star i klasycznego algorytmu Dijkstry. Porównaj je ze sobą w postaci symulacji.
Główną częścią zadania jest przedstawienie symulacji działania obu algorytmów działających równolegle w tym samym czasie. Mile widziany interfejs graficzny (chociaż w samej konsoli pewnie też się da to zrobić).
Materiały pomocnicze:
- http://www.policyalmanac.org/games/aStarTutorial.htm
- http://www.raywenderlich.com/4946/introduction-to-a-pathfinding
- http://pl.wikipedia.org/wiki/Algorytm_Dijkstry
Analiza numeryczna i algebra:
Całkowanie
Zaimplemenuj kilka popularnych metod obliczania całki oznaczonej. Do wyboru (w kolejności, zaczynając od najprostszej):
- Metoda prostokątów
- Metoda trapezów
- Metoda parabol
- Funkcja sklejana (3-ciego stopnia)
Wykonaj testy na kilku wybranych (nietrywialnych) funkcjach i przeprowadź porównanie zaimplementowanych metod.
Materiały pomocnicze:
- http://edu.i-lo.tarnow.pl/inf/alg/004_int/0002.php
- http://edu.i-lo.tarnow.pl/inf/alg/004_int/0003.php
- http://edu.i-lo.tarnow.pl/inf/alg/004_int/0004.php
- http://en.wikipedia.org/wiki/Spline_interpolation
Rysowanie wykresów funkcji jednej zmiennej
Napisz program z interfejsem graficznym, który będzie rysował wykresy funkcji dla kilku wybranych klas (np. kwadratowe + liniowe; trygonometryczne). Program powinien mieć możliwość wybrania typu funkcji, określenia jego parametrów (np. współczynników przy funkcji kwadratowej) oraz zmiany skalowania osi. Dodatkowo można wprowadzić możliwość zapisania aktualnego wykresu jako obraz w formacie jpg, png lub bmp (wystarczy wybrać jeden z nich).
Macierze
Napisz moduł operujący na macierzach. Zdefiniuj odpowiednią strukturę/klasę i zaimplementuj najważniejsze operacje na macierzach. Pamiętaj o dynamicznej alokacji pamięci.
Wykorzystaj napisany moduł do rozwiązania następującego problemu: dla podanych n równań linowych, przy pomocy znanych metod rozwiąż ten układ. Można użyć algorytm eliminacji Gaussa, dekompozycję LU lub dowolnie inny algorytm.
Materiały pomocnicze:
- http://pl.wikipedia.org/wiki/Macierz
- http://pl.wikipedia.org/wiki/Metoda_eliminacji_Gaussa
- http://pl.wikipedia.org/wiki/Metoda_LU
Przetwarzanie danych i WWW:
Rozkład jazdy MPK
Napisz program, który dla odpowiednich zapytań użytkownika zwróci pewne sformatowane dane ze strony http://www.wroclaw.pl/rozklady-jazdy. Typowe rodzaje zapytań:
- Dla danego numeru autobusu/tramwaju i nazwy przystanku zwróć jego rozkład jazdy w odniesieniu do podanego przystanku (i w zależności od kierunku jazdy).
- Dla podanego przystanku podać numery wszystkich autobusów/tramwajów, które z niego odjeżdżają.
- Dla podanego przystanku i konkretnej daty i godziny podać numer następnego autobusu/tramwaju, który do niego podjedzie.
- Dodatkowo można mieć opcję ściągnięcia całego rozkładu jazdy MPK i zapisanie go w plikach XML w jakiejś hierarchicznej strukturze folderów.
- itp. itd.
Web Crawler
Napisać program, który dla podanego adresu www, ściągnie na dysk wszystkie pliki o danym rozszerzeniu/typie z tej strony i jej podstron. Typowym zastosowaniem może być chęć ściągnięcia wszystkich zdjęć/obrazków ze strony.
Interfejs graficzny mile widziany, szczególnie w przypadku ściągania obrazków.
Organizer
Napisz aplikację zarządzającą notatkami. Notatki powinny być przechowywane w plikach tekstowych i pogrupowane w folderach zgodnie z kategorią. Jako część programu dodaj opcję wyszukiwania notatek po słowach kluczowych/tagach lub po tekście.
Sztuczna inteligencja:
Algorytmy ewolucyjne
Algorytmy ewolucyjne stanowią zbiór metod obliczeniowych bazujących na teorii ewolucji. Są one podstawą teorii optymalizacji metaheurystycznej. Metody te zapożyczają pojęcia z dziedziny biologii takie jak: reprodukcja, mutacja, rekombinacja, selekcja. Algorytmy ewolucyjne służą do znalezenia przybliżonych rozwiązań trudnych problemów obliczeniowych np. TSP. Kandydaci na rozwiązania problemu optymalizacyjnego (w przypadku TSP są to permutacje) są nazywani osobnikami. Osobników łączy się w populacje i wyznacza się ich przystosowanie do środowiska przy pomocy pewnej funkcji przystosowania. Następnie, w zależności od przyjętej strategii aplikujemy operatory ewolucyjne dla danej populacji (np. mutacja, krzyżowanie, selekcja), dopóki nie osiągniemu pewnego kryterium stopu. Początkową populację możemy wylosować lub wyznaczyć przy pomocy różnych algorytmów np. algorytmów zachłannych.
Zaimplementuj prosty algorytm ewolucyjny dla problemu TSP. Znajdź w internecie gotowe dane testowe (takie, które mają podane optima dla sowich instancji) i pokaż jak bliskie od optymalnego rozwiązania zwraca Twój algorytm.
Materiały pomocnicze:
- http://pl.wikipedia.org/wiki/Algorytm_genetyczny
- http://en.wikipedia.org/wiki/Crossover_%28genetic_algorithm%29
Kółko-krzyżyk 5x5
Napisz grę w kółko-krzyżyk o rozmiarach 5x5. Zasady gry są analogiczne do klasycznej wersji 3x3: wygrywa gracz, który jako pierwszy utworzy linię pionową, poziomą lub ukośną swojego znaku o długości 5.
Gra powinna mieć opcję gry z komputerem. Postaraj się tak zaprogramować ruchy komputera, aby nigdy nie przegrywał.
Propozycje własne:
Jeśli komuś nie podobają się żadne z powyższych tematów i/lub mają w planach coś ciekawszego, to należy się ze mną skontaktować. Po negocjacjach, ustaleniu zakresu pracy i mojej akceptacji można pisać dowolny program (pamiętając o zdrowym rozsądku!).
Szczegóły techniczne:
- Ostateczny termin oddania projektów: 31 stycznia.
- Przed rozpoczęciem realizacji projektu należy powiadomić mnie mailowo o wybranym temacie i zakresie prac (czyli co chcecie w tym programie umieścić; jakie funkcjonalności). Zakres prac i temat nie są wiążące. W dowolnym momencie możecie je zmienić (oczywiście informując mnie wcześniej mailem).
- Projekt trzeba przedstawić osobiście.
- Oddanie projektu może nastąpić na zajęciach piątkowych, na konsultacjach w piątek, lub w dowolnie innymi terminie po wcześniejszym umówieniu się poprzez email.
- Nie trzeba pisać szczegółowej dokumentacji projektu i kodu. Trzeba natomiast dołączyć do projektu plik README z instrukcją uruchomienia i parametrami kompilacji programu (+ ew. zależnościami, jeśli korzysta się z dodatkowych bibliotek).
- Program można przedstawić na własnym komputerze lub na komputarch w pracowni lub na moim komputerze w pokoju 340 (w przypadku dwóch ostatnich trzeba wcześniej sprawdzić czy kod się skompiluje).
- Projekty, w których jednym z zadań jest zaimplementowanie jakiegoś algorytmu, nie muszą być asymptotycznie optymalne w czasie działania (chyba że jest powiedziane z nazwy, jaki algorytm trzeba zaimplementować). Wiele optymalnych algorytmów (np. do problemu widoczności) jest trudna w implementacji. Można napisać własny, niekoniecznie szybki, ale działający algorytm i również liczyć na max. punktów.
Uwagi estetyczne:
- Kod ma być podzielony na logiczne moduły. Cały kod projektu upakowany w jeden ogromny plik źródłowy nie jest mile widziany.
Pomocne informacje: