Simulace emisi spalovacich motoru

From Simulace.info
Revision as of 20:48, 10 June 2024 by Bohr03 (talk | contribs)
Jump to: navigation, search

Tato stránka je slouží jako Výzkumná zpráva simulace "Doprava na semaforové křižovatce a kruhové křižovatce" k semestrálnímu projektu pro předmět 4IT495 Simulace systémů (LS 2022/2023) na VŠE v Praze.

Definice problému

Jelikož jsme si mohli všimnout, že se v České republice děly protesty proti aktuálnímu limitu rychlosti 50 km/h, kde skupina "30 pro Prahu" bojuje za to, aby byly nastaveny limity na 30 km/h. Jedním z jejich cílů je snížení emisí. Rozhodl jsem se tedy sestavit simulaci, která znázorňuje jak by v aktuální dopravě vypadaly emise, kdyby byla nastavena maximální rychlost na 30 oproti 50 km/h. Budu porovnávat, zda jet pomaleji, spotřebovávat méně a generovat méně emisí je výhodnější oproti vyšší rychlosti, spotřebě a emisím.

Metoda

Pro simulaci dopravy na semaforové zvolíme aplikaci NetLogo, která je díky svému specializovanému prostředí pro modelování a simulaci komplexních systémů velmi vhodná. Pomocí programovacího jazyka v NetLogu můžeme přesně definovat chování vozidel, semaforů a dopravních pravidel. Real-time vizualizace nám umožní sledovat pohyb vozidel a změny na semaforech, což poskytne důležité informace o dopravním chování. NetLogo také umožňuje zkoumat různé dopravní scénáře a parametry, což nám dává příležitost analyzovat a optimalizovat provoz na křižovatkách. Celkově je NetLogo ideálním nástrojem pro simulaci dopravy na semaforové křižovatce díky svému specializovanému prostředí, programovacímu jazyku a možnostem vizualizace a analýzy.

Model

Samotný model má rozměry 81x81.

Agenti

Simulace obsahuje dva typy agentů a to vozidla (turtles), roads + intersections (patches).

Vozidla

Vozidla obsahují proměnné které udávají jejich rychlost, směr, délku po jakou čekají na křižovatce nebo zácpě, jejich délku života, ujetou vzdálenost a počet vygenerovaných emisí (při jízdě a v klidu).

Ujetá vzdálenost slouží k výpočtu celkových vyprodukovaných emisí.

  speed               ;; the speed of the turtle
  up-car?             ;; true if the turtle moves downwards and false if it moves to the right
  wait-time           ;; the amount of time since the last time a turtle has moved
  lifetime            ;; how many tics the turtle has until it dies
  distance-traveled   ;; distance traveled by the car
  emissions           ;; emissions generated by the car
  emissions-idle      ;; emissions generated by the car on idle


Spawn a nastavení vozidla K nastavení slouží funkce setup-cars, která nastaví počáteční hodnoty speed, wait-time a lifetime na 0. Následně je zavolána funkce, která auto spawne na cestu (jedná se o jednoduchý kód, který postaví auto na patch (road), který na sobě nemá žádné jiné vozidlo. Poslední část se zabývá počátečním natočením vozidla. Pokud pojede vertikálně nebo horizontálně. Pokud se vozidlo spawne na křižovatce, tak je jedno, kudy pojede, proto necháme rozhodnout náhodu, která vygeneruje číslo 0 nebo 1. Pokud je vybráno číslo 0, tak vozidlo pojede vertikálně.

V případě, že je vozidlo spawnuto na silnici, tak je potřeba ověřit, zda se jedná o silnici vertikální, či horizontální. To zjistíme pomocí podmínky, která určuje, zda je vozidlo zarovnáno se vertikálním gridem na základě jeho souřadnice x (pxcor). Pokud je podmínka pravdivá, nastaví se hodnota up-car? na true (což znamená, že se auto bude pohybovat vertikálně). V opačném případě je hodnota up-car? nastavena na false (což znamená, že se auto bude pohybovat horizontálně).

;; Initialize the turtle variables to appropriate values and place the turtle on an empty road patch.
to setup-cars  ;; turtle procedure
  set speed 0
  set wait-time 0
  set lifetime 0
  put-on-empty-road

  ;; Determine the initial direction of a car.
  ifelse intersection?
  [
    ifelse random 2 = 0
    [ set up-car? true ]
    [ set up-car? false ]
  ]
  [
    ; if the turtle is on a vertical road (rather than a horizontal one)
    ifelse (floor((pxcor + max-pxcor + floor(grid-x-inc - 1)) mod grid-x-inc) = 0)
    [ set up-car? true ]
    [ set up-car? false ]
  ]
  ifelse up-car?
  [ set heading 180 ]
  [ set heading 90 ]
end
;; Find a road patch without any turtles on it and place the turtle there.
to put-on-empty-road  ;; turtle procedure
  move-to one-of roads with [not any? turtles-on self]
end

Rychlost vozidla Regulace rychlosti vozidla je tvořena ze čtyř částí, akcelerace, decelerace a hlídání si vozidel před sebou a zastavení na semaforech. Akcelerace a decelerace jsou poměrně jednoduché, jedná se o postupné navyšování/snižování rychlosti o malé části (acceleration) každý běh (go). Limity jsou maximální rychlost (proměnná speed-limit) a 0, tudíž stav, kdy auto stojí.

;; decrease the speed of the turtle
to slow-down  ;; turtle procedure
  ifelse speed <= 0  ;;if speed < 0
  [ set speed 0 ]
  [ set speed speed - acceleration ]
end

;; increase the speed of the turtle
to speed-up  ;; turtle procedure
  ifelse speed > speed-limit
  [ set speed speed-limit ]
  [ set speed speed + acceleration ]
end

Zastavení na semaforech také, funkce hlídá pokud je vozidlo na červené, tak instantně zastaví. Jinak nastaví počáteční rychlost 1.

;; set the turtles' speed based on whether they are at a red traffic light or the speed of the
;; turtle (if any) on the patch in front of them
to set-car-speed  ;; turtle procedure
  ifelse pcolor = red
  [ set speed 0 ]
  [
    ifelse up-car?
    [ set-speed 0 -1 ]
    [ set-speed 1 0 ]
  ]
end

Samotné hlídání vozidel před sebou zjišťuje, zda je před vozidlem další vozidlo, pokud ano, tak auto zpomaluje, pokud je cesta (road) volná, auto zrychluje.

;; set the speed variable of the car to an appropriate value (not exceeding the
;; speed limit) based on whether there are cars on the patch in front of the car
to set-speed [ delta-x delta-y ]  ;; turtle procedure
  ;; get the turtles on the patch in front of the turtle
  let turtles-ahead turtles-at delta-x delta-y

  ;; if there are turtles in front of the turtle, slow down
  ;; otherwise, speed up
  ifelse any? turtles-ahead
  [
    ifelse any? (turtles-ahead with [ up-car? != [up-car?] of myself ])
    [
      set speed 0
    ][
      set speed [speed] of one-of turtles-ahead
      slow-down
    ]
  ]
  [ speed-up ]
end


Výsledky

Závěr

Kód