Imiona i nazwisko: Kamil Krzysztof Lipski
Numer albumu: 283689
Adres e-mail: 01121776@pw.edu.pl
Prowadzący: dr inż. Tomasz Trzciński
Numer zadania: 12
Do walizki o ograniczonej pojemności C chcemy załadować przedmioty o jak największej wartości, mając jednak na uwadze, że każdy z nich zajmuje pewną objętość. Mając n przedmiotów wraz z n-elementową tablicą odpowiadających im wartości {pi} oraz objętości {ci}, znajdź zestaw rzeczy mieszczących się w walizce o największej sumarycznej wartości. Uwaga: Możemy dobierać maksymalnie m przedmiotów tego samego typu (tzn. tej samej wartości i tej samej objętości). Oceń złożoność algorytmu.
- Pobranie z pliku wejściowego i wyplucie do wyjściowego:
aal -m1 <in.txt >out.txt
- Wygenerowanie instancji problemu i rozwiązanie:
aal -m2 -n10 -mv100 -b2 >out.txt
gdzie n - ilość przedmiotów, mv - pojemność walizki, b - maks. liczba przedmiotów tego samego typu
- Przeprowadzenie całego procesu testowania z pomiarem czasu dla rosnącego n i porównanie ze złożonoscią teoretyczną:
aal -m3 -n1000 -mv100 -b10 -k30 -step500 -r10 >out.txt
czyli pomiar czasu dla 30 problemów o wielkościach 1000, 1500, 2000 itd.; dla każdej wielkości losowanych 10 instancji problemu
Struktura pliku z danymi wejściowymi:
ilosc_przedmiotow
pojemnosc_walizki
maksymalna_liczba_przedmiotow_tego_samego_typu
objetosc1 wartosc1
...
objetoscN wartoscN
Przykładowe pliki z danymi wejściowymi: in.txt, in2.txt.
Wyniki działania programu są zapisywane do pliku out.txt (lub innego podanego w poleceniu aktywacji programu).
Pierwszy tryb działania wypisuje największą możliwą do uzyskania wartość przedmiotów umieszczonych w walizce przy zachowaniu ograniczenia w postaci jej pojemności. Podany zostaje również zestaw umieszczonych w niej przedmiotów.
W wyniku działania drugiego trybu programu wypisywane sa dodatkowo względem pierwszego wygenerowane przedmioty.
Trzeci tryb działania prezentuje tabelkę, której kolumnami są: ilość przedmiotów, czas wykonania algorytmu dla danej ilości przedmiotów (będący uśrednieniem z r wykonań) oraz pewna wartość q(n). Dla n będacego medianą wszystkich problemów wartość ta wynosi 1.0, dzięki czemu jest możliwe oszacowanie trafności oceny złożonosci algorytmu (patrz: dokumentacja końcowa). Jeśli q(n) przyjmuje wartości w pobliżu 1.0, oszacowanie jest poprawne.
Na potrzeby zadania została zdefiniowana struktura dataCollection, przechowująca dane odpowiadające danej instancji problemu. W początkowym przetwarzaniu jest ona poddawana działaniu algorytmu wykorzystującego zliczanie kubełkowe, w celu usunięcia przedmiotów "nadmiarowych" (przedmioty danego typu, których ilość w zestawie danych przekracza narzucone ograniczenie). Następnie zostaje rozwiązana właściwa część problemu - w tym celu zostaje użyty algorytm programowania dynamicznego. W przekroju całego programu często używaną strukturą danych jest vector.
Pliki nagłówkowe:
- algorithm.h - algorytmy i utworzona na potrzeby programu struktura danych
- generator.h - generator danych testowych
- interface.h - interakcja z użytkownikiem
- pch.h - plik utworzony na potrzeby tworzenia projektu w Microsoft Visual Studio 2017
Pliki implementacyjne:
- algorithm.cpp - implementacja algorytmów i metod utworzonej na potrzeby programu struktury danych
- generator.cpp - implementacja generatora danych testowych
- interface.cpp - implementacja metod odpowiedzielnych za interakcję z użytkownikiem
- main.cpp - podstawowy moduł programu
- pch.cpp - plik utworzony na potrzeby tworzenia projektu w Microsoft Visual Studio 2017
W programie na potrzeby generowania danych wprowadzono ograniczenie dotyczące maksymalnej wartości generowanych przedmiotów (makro MAX_VALUE). Jest ono obecnie ustawione na 10000. Ograniczenie to jednakże nie dotyczy użytkownika, który podając własne dane nie jest zobligowany do jego przestrzegania. Ponadto w każdej chwili wartość ta może zostać zmieniona: wystarczy zmienić wartość liczbową znajdującą się przy MAX_VALUE w pliku pch.h.