Commit ccbc59b4 authored by Ing. Petr Pauš, Ph.D.'s avatar Ing. Petr Pauš, Ph.D.
Browse files

Update zadani

parent e1011218
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
# Hledaní nejkratší cesty v grafu (semestrálka)

## Úkoly

1. Vytvořte třídu `Map`, která implementuje hledání nejkratší cesty v grafu pomocí Dijkstrova algoritmu.
2. Otestujte pomocí dodaných testerů (tzn. svůj kód pište přímo do dodaného souboru a následně zkuste spustit, dokud to neprojde bez chyb).
3. Implementujte naplnění jiné mapy dodanými linkami tramvají a prověřte funkčnosti dodanými testery (v souboru až za seznamy stanic tram linek). 

## Třída `Map`

- *Vrcholy grafu* (názvy míst) jsou popsány pomocí stringu a jsou jednoznačné, nezáleží na velikosti písmen. Uvnitř datové struktury je vhodné ukládat všechny názvy vrcholů v malých písmenech (`.lower()`).
- *Ohodnocení hran* (vzdálenosti) je popsáno pomocí nezáporného čísla (`int`/`float`).
- Třída má konstruktor bez parametrů a 3 základní metody (níže).
- Třída má *konstruktor bez parametrů* a *3 základní metody* (níže).
- Je možné (a vhodné) přidat další pomocné metody.

## Povinné metody
### Povinné metody třídy `Map`

`add_single_connection(start, end, dist)`

- Přidá do naší mapy OBOUSMĚRNÉ spojení mezi `start` a `end` (stringy) se vzdáleností `dist`. Tzn. např. `add_single_connection("A", "B", 10)` přidá spojení `A->B` a zároveň `B->A` s délkou `10`.
- `start` a `end` může mít různou velikost písmen, ukládejte ale pro jednoduchost vše malými písmeny.
- `dist` musí být nezáporné číslo, jinak vyhoďte výjimku `ValueError` s vhodným textem.

`add_multiple_connections(conn)`

- Přidá do mapy více spojení najednou.
- Argument je `list` trojic `[(start1, end1, dist1), (start2, end2, dist2), ...]`.
- Pravidla jinak stejná jako pro `add_single_connection()`.

`find_route(start, end)`

- Vrátí dvojici `(dist, route)`, kde `dist` je hodnota nejkratší vzdálenosti mezi `start` a `end`
  a `route` jen seznam (`list`) uzlů od `start` do `end` (včetně) tvořící nejkratší cestu (názvy uzlů vše malými písmeny).
- Pokud cesta neexistuje, vraťte `(None, [])`.
- Pokud `start` nebo `end` v mapě neexistuje, vyhoďte výjimku `ValueError` s vhodným textem.

## Poznámky k implementaci třídy

- Projďete si celý dodaný kód a řiďte se komentáři.
- Můžete použít 2D matici (seznam seznamů) jako na cviku a pak třeba `dict` pro mapování názvů na indexy.
- Vhodnější ale může být použít slovník slovníků. U prvního slovníku (`dict`) jsou klíče stringy (názvy počátečních uzlů) a hodnoty jsou další slovník (`dict`), kde klíče jsou cílový uzel a hodnota je vzdálenost. Např.:
@@ -51,3 +59,9 @@ m.add_single_connection("Vetrnik", "Vojenska nemocnice", 1)
----
- atd... Je to samozřejmě třeba udělat přes cykly a automaticky (ne to ručně zadávat v tomto formátu).
- Pak zkuste projití následujících testů.

## Nastavení dodaného kódu

- Nahoře ve zdrojáku jsou dvě proměnné pro lepší práci s testováním.
- `PRINT_RESULTS` je `bool`, který pro hodnotu `True` vypisuje výsledky hledaných tras nebo chyb. Na testování při programování je to vhodné.
- `TEST_ROUTE_NOT_EXIST` je `bool`, který pro `False` vypne testování neexistující trasy. Pro zápočet můžete nechat `False`. Pro zájemce o drobné rozšíření algoritmu lze nastavit na `True`.
 No newline at end of file