Celem listy jest praktyczne przećwiczenie metaheurystyk populacyjnych. Dobór parametrów (np. kodowanie, liczność populacji, liczba iteracji, operatory stochastyczne) należy do autora programu. W czasie rozwiązywania listy autor powinien rozpoznać jaki wpływ na działanie programu (czas działania, wymagania pamięciowe, osiągany rezultat, podatność na utknięcia w lokalnym minimum, … ) mają poszczególne parametry.
Napisz program, który za pomocą wybranego algorytmu populacyjnego (sugerowane podejście: rój cząstek lub algorytm genetyczny z reprezentowaniem genów przez liczbę rzeczywistą) znajdzie minimum funkcji X.S. Yang zadanej wzorem dla będących niezależnymi zmiennymi losowymi z rozkładu jednostajnego na .
In: 11 liczb (6 całkowitych i 5 typu
double
)t x1 x2 x3 x4 x5
oddzielonych spacją.
t
– maksymalna liczba sekund, którą może wykonywać się program w tym uruchomieniu,x1, x2, x3, x4, x5
– jest rozwiązaniem początkowym (podane liczby zawsze są całkowite, program natomiast może je interpretować jako dowolny typ liczbowy). są współczynnikami funkcji reprezentowanymi przez liczby typudouble
.
Uwaga: Dla każdego .Out: 6 liczb typu
double
oddzielonych spacją, z czego cztery pierwsze to , natomiast ostatnia to wartość funkcji w punkcie .
Napisz program, który za pomocą algorytmu genetycznego będzie generował słowa, które można ułożyć z otrzymanego multizbioru liter, należące do załączonego słownika, maksymalizując ich punktację. Zakładamy, że w folderze bieżącym pliku main znajduje się słownik dopuszczalnych słów
dict.txt
(testy mogą być prowadzone dla mniejszego słownika, nie będą prowadzone dla słownika liczniejszego od przykładowego, ograniczamy się do ASCII), który służy do weryfikacji dopuszczalności uzyskanego rozwiązania. Słowo uważane jest za niedopuszczalne również wtedy, gdy nie można go ułożyć z dostępnych liter (liczba kopii jest brana pod uwagę). Jeśli rozwiązanie jest dopuszczalne, za jego punktację przyjmujemy sumę punktów wszystkich liter, które się na nie składają.In: Wejście składać się będzie z linii. W pierwszej linii znajdować się będą trzy liczby całkowite oddzielone spacjami:
t
. Liczbat
jest ograniczeniem czasowym jak w zadaniu pierwszym, liczba określa rozmiar multizbioru liter, oznacza liczbę zadanych na wejściu rozwiązań dopuszczalnych. W kolejnych liniach znajdować się będą oddzielone spacją pary , gdzie jest -tym elementem multizbioru (-tą literą), natomiast jej wartością punktową. Można przyjąć, że wszystkie kopie tej samej litery mają identyczną wartość punktową. W ostatnich liniach znajdować się będą kolejno słowa (bez rozdzielających litery spacji) będące dopuszczalnymi rozwiązaniami dla danego wywołania.
Przykładowe dane wejściowe można znaleźć tu i tutaj.Out: Na standardowym wyjściu powinna zostać zwrócona liczba całkowita będąca sumą punktów uzyskanego rozwiązania. Na standardowym wyjściu błędów powinno zostać wypisane rozwiązanie końcowe (w przypadku większej ilości informacji, słowo końcowe powinno być jedynym ciągiem znaków w ostatniej linii
stderr
).Uwaga: Słownik zawsze będzie uporządkowany w kolejności alfabetycznej. W ramach preprocessingu można reorganizować słownik (np. drzewo prefiksowe) natomiast
t
jest ograniczeniem na całkowity czas działania programu.
Uwaga 2: Zakładamy, że kapitalizacja liter nie ma znaczenia.
Napisz program, który będzie symulował poruszanie się agenta po kracie (wycinek ). Celem jest dotarcie agenta do wyznaczonego punktu, przy założeniach, że w każdym kroku może poruszyć się o w lewo, o w prawo, o w górę albo o w dół. Program powinien za pomocą symulowanego wyżarzania generować kolejne sekwencje kroków, tak by dotarcie do celu zajęło jak najmniej rund. Jeśli agent dotrze do celu przed wykonaniem wszystkich kroków, liczymy liczbę wykonanych kroków, jeśli po wykonaniu całej wygenerowanej sekwencji kroków, agent nie dotarł do celu - kontynuuje z miejsca, w którym wylądował a długość wykonanej sekwencji wlicza się do bieżącego rozwiązania albo zaczyna nową iterację.
In: Dane wejściowe składać się będą z linii. W pierwszej linii będą umieszczone, oddzielone spacją liczby całkowite
t
, , , i , gdzie jest limitem czasu, jak w zadaniu 1, i oznaczają wymiary kraty (odpowiednio liczba wierszy i kolumn w labiryncie, który będzie chciał opuścić agent). Liczba całkowita oznacza liczbę danych na wejściu rozwiązań początkowych, natomiast określa górne ograniczenie na liczebność populacji. W kolejnych liniach będą znajdowały się cyfry tworzące labirynt. Między cyframi nie będzie spacji. W ostatnich s liniach będą znajdować się ciągi znakówU
,D
,R
,L
prowadzące z punktu startowego do jednego z wyjść (ciągi mogą być różnej długości, mogą prowadzić do różnych wyjść). Możliwe cyfry:
- 0 – standardowe, puste pole, po którym agent może się poruszać
- 1 – ściana, która nie może zostać pokonana (Uwaga: ściany mogą znajdować się również wewnątrz labiryntu, nie ma wymagania by przynajmniej jednym sąsiadem
1
była1
; ściany mogą całkowicie blokować dostęp do części labiryntu, pod warunkiem, że istnieje ścieżka z pozycji startowej agenta do przynajmniej jednego wyjścia.).- 5 – symbol agenta, oznaczający jego pozycję początkową (Uwaga: nie ma konieczności wizualizacji kolejnych kroków).
- 8 – symbol wyjścia, oznaczający pozycję celu, na który agent powinien dotrzeć (Uwaga: w danej instancji może być więcej niż jeden symbol 8, nie wszystkie 8 muszą się znajdować na obrzeżu).
Uwaga: Agent nie zna swojej pozycji początkowej, ani pozycji celu. Można założyć, że agent potrafi rozpoznać rodzaj pola (cyfrę) swoich czterech sąsiadów oraz, że zna oraz .
Przykładowe dane wejściowe można znaleźć tu, tutaj i tutaj. Przykłady z list wcześniejszych mają inny format wejścia zatem przed użyciem na L3 muszą zostać zmodyfikowane.Out: Na standardowym wyjściu znaleźć się powinna jedynie łączna liczba kroków od pozycji startowej do celu, wykonana w wybranym rozwiązaniu. Ostatnią linią na standardowym wyjściu błędów powinien być –elementowy ciąg znaków
U
,D
,R
,L
oznaczający kolejne wybrane kierunki w rozwiązaniu, gdzie litery kodują odpowiednio krok w górę, krok w dół, krok w prawo i krok w lewo.