Diskretiseringsproblem när man simulerar verkliga saker
Hej,
jag skriver ett program som simulerar bilar på en motorväg. Vid varje tidssteg itererar den fram varje bils nya position baserat på dess nuvarande hastighet men kör innan dessa grejer:
- Checkar ifall den är för nära bilen framför (bilar kan inte köra igenom varandra) och om så är fallet:
- Checkar om den har möljighet att byta körfält, annars
- Väljer den att deaccelerera (ögonblickligen) till distance_to_front minus ett.
- Accelererar ögonblickligen (+1) om dess hastighet är långsammare än önskat.
- Slår ett tärningsslag med viss sannolikhet att bilen plötsligt sänker sin fart (för att skapa kaos).
- Allra sist uppdateras positionen: distance += velocity.
Men detta orskar problem, tex
- En bil kan ju temporärt ha kört igenom den framför tills det att den framför också blivit uppdaterad. Vid uppdateringen av den främre bilen kommer den få "avståndet till bil bakom = -2meter" eller annan konstig information.
- Alla tre satser försöker modifiera bilens hastighet, vilken ska köras först?
Jag har svårt att tänka diskretiserat när verkligheten inte är det, och i detta fall är det inte ett "fysikproblem" så jag INTE vill ha väldigt små tidsintervall vilket hade varit en lösning.
Om avståndet blir -2 m har de väl kolliderat. Är det inte något som kan hända?
En del av problemen försvinner väl om man uppdaterar bilarna framifrån?
Laguna skrev:Om avståndet blir -2 m har de väl kolliderat. Är det inte något som kan hända?
Jo, men systemets tillstånd under själva uppdateringsprocessen är ju inte betydelsefull, den är inte det förrän den är helt klar, och när den är helt klar så har ju bilarna inte kolliderat.
En del av problemen försvinner väl om man uppdaterar bilarna framifrån?
Ja men då tror jag andra problem uppstår istället, det blir problem hur man än gör verkar det som.
Kul uppgift! Jag tror jag skulle försöka minska steglängden ned till människans reaktionstid (har ingen aning om simuleringstiden blir orealistiskt lång då...). Står inte den simulerade tiden stilla när satserna körs? Isåfall borde väl ordningen som satserna körs spegla hur en förare normalt gör, och om förare kan tänka på olika sätt så kanske tankesättet ska slumpas också.
Man ska nog beräkna alla nya värden utgående från de gamla och sedan uppdatera allting samtidigt.
Angående kollisionera. Går det inte att få till förarnas reaktioner lite mindre mekaniska. Jag menar, normalt krockas det ju inte så mycket... Kanske göra på nåt sätt att bilarna inte kan krocka alls? Vet inte hur, men att bakomvarande bil gör bedömning baserat på både avstånd och hastighet till framförvarande bil. relaterat till steglängden (dvs reaktionstiden), och trycket på bromspedalen därefter.
Ja, men hur ska saker ske samtidigt? Det är ju oundviktigt att någon sorts forloop behövs och då blir det ju såhär som jag beskriver (inte samtidigt)? Jag är så irriterad!
JohanF skrev:Angående kollisionera. Går det inte att få till förarnas reaktioner lite mindre mekaniska. Jag menar, normalt krockas det ju inte så mycket... Kanske göra på nåt sätt att bilarna inte kan krocka alls? Vet inte hur, men att bakomvarande bil gör bedömning baserat på både avstånd och hastighet till framförvarande bil. relaterat till steglängden (dvs reaktionstiden), och trycket på bromspedalen därefter.
Samt om bilarna ändå mot förmodan skulle krocka upptäckt i efterhand, att man korrigerar på lämpligt sätt.
Jag antar att simuleringsuppgiften inte går ut på att se hur många som krockar, utan att se hur traffic jams uppstår.
Qetsiyah skrev:Ja, men hur ska saker ske samtidigt? Det är ju oundviktigt att någon sorts forloop behövs och då blir det ju såhär som jag beskriver (inte samtidigt)? Jag är så irriterad!
Du har en aktuell vektor med positioner och hastigheter, indexerad av bilnummer. För varje bil, beräkna dess nya position och hastighet och lägg det i en annan vektor.
När allt är beräknat, låt den nya vektorn bli den aktuella vektorn
JohanF skrev:Angående kollisionera. Går det inte att få till förarnas reaktioner lite mindre mekaniska. Jag menar, normalt krockas det ju inte så mycket... Kanske göra på nåt sätt att bilarna inte kan krocka alls? Vet inte hur, men att bakomvarande bil gör bedömning baserat på både avstånd och hastighet till framförvarande bil. relaterat till steglängden (dvs reaktionstiden), och trycket på bromspedalen därefter.
Jo min aviskt är att bilarna inte ska kunna krocka. Ditt förslag är för verklighetsnära, jag ätnkte liksom att mitt program skulle vara ganska primitiv liksom...?
(Jag hade en sido-idé som är överkurs, men att tillåta kollisioner, och efter fem kollisioner så är bilen helt trasig står stilla för evigt. Simuleringen tillåts pågå tills alla bilar är trasiga)
Hur går det?
Tack för att du frågar! Jag tror inte jag uppnåt mer klkokhet i min ursprungliga fråga här men jag tänkte att jag fixar problemen as i go.
Såhär ser det ut just nu ("loser" betyder efterföljande på rekommendation av en vän då vi inte mindes vad det var på engelska):
och min propagator: