Er uppgift är att implementera en tjänst liknande Västtrafiks reseplanerare. Ert program har tillgång till ett linjenät och har till uppgift att beräkna kortaste restiden mellan två givna hållplatser i detta nät, givet information om restiden mellan efterföljande hållplatser på varje linje. För enkelhets skull så behöver ni inte hantera avgångstider, utan det antas att varje resa kan ske omedelbart. Ni kan tänka er att det finns ett obegränsat antal taxibilar på varje hållplats.

Uppgiften

Programmet ska beräkna en snabbaste väg mellan två hållplatser, tala om vilka hållplatser som ligger längs denna väg, och vägens längd.

Detaljer:

Linjenätsfiler

Nedan följer en beskrivning av filformatet för linjenätet. För att ni ska slippa lägga för mycket tid på att skriva inläsningskod finns det metoder/funktioner i hjälppaketet Lab3Help som ni kan använda.

Filformatet

Filerna för linjenätet har följande struktur. Den första filen innehåller information om hållplatserna i nätet:

    Brunnsparken                    500     500
    Redbergsplatsen                 700     350
    Frölunda-Torg                   200     900

För varje hållplats finns förutom namnet också hållplatsens koordinater (heltal från 0 till 1000). Koordinaterna kan användas för att rita en karta över linjenätet och den snabbaste vägen.

Nästa fil innehåller en beskrivning av de olika linjerna:

    60 5
    Redbergsplatsen
    Drottningtorget         5
    Chalmers                2
    Drottningtorget         2
    Redbergsplatsen         5
    34 7
    Östra-sjukhuset
    Olskroken               6
    Centralstationen        3
    Tuve                    7
    Centralstationen        7
    Olskroken               3
    Östra-sjukhuset         6

För varje linje kommer först linjenumret, sedan antalet hållplatser, och slutligen listan över vilka hållplatser som ingår i linjen och tiden (i minuter) mellan de olika hållplatserna.

Hjälppaket

För att underlätta arbetet får ni ett paket/en modul, Lab3Help, med funktioner för att läsa in linjeinformation. Javapaketet innehåller också gränssnittet Path:

Hållplatsfiler kan läsas in med metoden readStops (om ni använder Java hittar ni readStops i klassen Lab3File). Metoden/funktionen readStops ger en lista som innehåller element av typen BStop/Stop. De här elementen representerar hållplatser och innehåller namn samt koordinater.

Linjefiler kan läsas in med readLines, vars resultat är en lista med element av typen BLineTable/LineTable (om ni använder Java hittar ni readLines i klassen Lab3File). Varje BLineTable/LineTable representerar information om en linje och innehåller linjens nummer samt de hållplatser som ingår i linjen. Dessa hållplatser representeras av objekt/värden av typen BLineStop/LineStop, som innehåller hållplatsens namn samt den tid det tar att ta sig till hållplatsen från föregående hållplats.

Exempel

Följande filer med hållplatsinformation och linjeinformation kan användas för att testa er implementation:

Grafiskt gränssnitt

För att underlätta utvecklingen, och kanske göra uppgiften lite intressantare, får ni tillgång till ett grafiskt användargränssnitt (GUI):

Gränssnitten ger användaren möjlighet att välja avrese- och ändhållplatser, och visar information om de beräknade snabbaste vägarna.

Javagränssnitt: textruta.

Javagränssnitt: textruta.

Javagränssnitt: linjenätskarta.

Javagränssnitt: linjenätskarta.

Haskellgränssnitt.

Haskellgränssnitt.

Testning

Det är kanske lämpligt att först testa programmet med några små grafer.

Ni måste testa er lösning och se till att ni får rätt resultat. Ni kan göra detta genom att själva beräkna bästa vägen i en graf (t ex någon av exempelgraferna ovan), och sedan låta programmet göra samma sak.

Det finns också ett testprogram. Lösningar som inte accepteras av testprogrammet kan underkännas utan närmare granskning av koden.

Inlämning

Skicka in dokumentation, de klasser som ni har skrivit, och andra relevanta filer (t ex egna grafer). Skicka inte med testing.jar, Lab3Help.jar, Lab3Help.hs, Lab3GUI.hs, eller någon av graferna ovan.

Era inlämningar måste följa de vanliga instruktionerna.

Tips

Ni får använda standardpaket (dock måste ni definiera en egen grafklass/-typ). T ex kan HashMap (för Java) och Data.Map.Strict eller Data.HashMap.Strict (för Haskell) vara lämpliga att använda för att slå upp strängar. (Om ni vill använda Data.HashMap.Strict, kör då följande kommandon i terminalen: först cabal update och sedan cabal install unordered-containers.)