Klassen Lane#

Vi låter en fil bestå av ett antal positioner som antingen kan innehålla ett fordon eller vara tomma. Tomma platser representeras med värdet None.

Fordon strömmar in i ena änden (högsta index) och ut ur andra änden (index 0).

../../_images/laneImplementation.png

Förenklingar av verkligheten: En fil består av ett antal diskreta positioner och alla fordon tar lika stor plats.

Vad händer i filen när tiden stegas?#

../../_images/laneImplementation0.png
../../_images/laneImplementation1.png
../../_images/laneImplementation2.png
../../_images/laneImplementation3.png
../../_images/laneImplementation4.png

Observera att ett fordon flyttas högst en position per tidssteg!

Förenkling av verkligheten: Ett fordon står antingen stilla eller flyttar sig en plats per tidssteg.

Vad sker i ändarna på Lane?#

Klassen Lane vet inte vad som finns framför eller bakom. Det är alltså ”någon annan” som ser till att fordon kommer in i respektive lämnar filen.

Lane måste tillhandahålla en metod för att ta bort fordonet från första platsen och returnera fordonet som fanns där:

../../_images/laneImplementation5.png

Det måste också finnas en metod som sätter ett fordon på sista platsen:

../../_images/laneImplementation6.png

Om man lägger ett fordon på sista platsen och den inte är ledig kommer man att tappa bort det som låg där:

../../_images/laneImplementation7.png

Det måste alltså gå att undersöka om sista platsen är ledig eller ej.

Klassen ska ha följande:

  • En konstruktor __init__(self, length) som tar emot filens längd, dvs. antal fordon som kan finnas i filen. Från början finns inga fordon i filen.

  • En instansvariabel som är en lista bestående av fordonen som just nu ligger i filen. Om platsen i filen är tom ska motsvarande element i listan vara None.

  • En metod get_first() som returnerar fordonet som står på första plats utan att ta bort det. Om första platsen är tom returneras None.

  • En metod remove_first() som returnerar och tar bort fordonet på första plats. Om platsen är tom returneras None. Metoden gör inga andra ändringar i Lane-objektet.

  • En metod step() som flyttar alla fordon utom det som står först i filen (index 0) ett steg framåt. Ett fordon får bara flyttas om platsen framför är ledig. Flyttningen ska ske från vänster till höger, dvs. först fordonet på index 1, sedan fordonet på index 2, osv.

  • En metod last_free() som returnerar True om sista platsen är ledig, annars False.

  • En metod enter(self, v) som lagrar fordonet v sist i filen.

  • En metod number_in_lane() som returnerar antalet fordon i filen.

  • En __str__-metod som returnerar en lämplig strängrepresentation av objektet. Se nedan!

I programmet ska Lane-objekten hanteras med dessa metoder och således vara oberoende av den interna representationen.

Nedan följer kod med utskrifter som demonstrerar några av metoderna. Se till att din klass ger den förväntade utskriften innan du går vidare!

Obs! Demo-funktionen finns redan inlagd i modulen trafficComponents.py så du anropar den enklast genom att köra trafficComponents.py.

Kod

Utskrift

def demo_lane():
    """Demonstration of the class Lane"""
    a_lane = Lane(10)
    print(a_lane)
    v = Vehicle('N', 34)
    a_lane.enter(v)
    print(a_lane)

    a_lane.step()
    print(a_lane)
    for i in range(20):
        if i % 2 == 0:
            u = Vehicle('S', i)
            a_lane.enter(u)
        a_lane.step()
        print(a_lane)
        if i % 3 == 0:
            print('  out: ',
                  a_lane.remove_first())
    print('Number in lane:',
          a_lane.number_in_lane())
[..........]
[.........N]
[........N.]
[.......NS.]
out: None
[......NS..]
[.....NS.S.]
[....NS.S..]
out: None
[...NS.S.S.]
[..NS.S.S..]
[.NS.S.S.S.]
out: None
[NS.S.S.S..]
[NSS.S.S.S.]
[NSSS.S.S..]
out: Vehicle(N, 34)
[SSS.S.S.S.]
[SSSS.S.S..]
[SSSSS.S.S.]
out: Vehicle(S, 0)
[SSSS.S.S..]
[SSSSS.S.S.]
[SSSSSS.S..]
out: Vehicle(S, 2)
[SSSSS.S.S.]
[SSSSSS.S..]
[SSSSSSS.S.]
out: Vehicle(S, 4)
[SSSSSS.S..]
Number in lane: 7