Symulator EU07 (i nie tylko) > Pomoc w tworzeniu
Losowanie zdarzeń z jednakowym prawdopodobieństwem
Quark-t:
Propozycja (jeżeli tego nie zrobiłeś, wybacz, nie mam siły się teraz w to wczytywać i szukać) – dodaj komórkę pamięci "buforową", czyli mającą wartość np. 0 0 i event, który zmienia jej wartość i wywołuje event właściwy pod warunkiem stanu początkowego tejże komórki (memcompare * 0 0). Czyli pierwszy człon zmieni na 0 1 i wywoła event właściwy, a drugi człon już nie wywoła nic, bo w komórce będzie 0 1. Jeżeli sytuacja taka ma mieć miejsce kilka razy w czasie trwania scenariusza, to dodaj gdzieś unikalny event przywracający wartość startową komórki pamięci.
Benek:
Problem jest taki: wywołać kilka zdarzeń z jednakowym prawdopodobieństwem, ale przez więcej niż jeden z członów. Dla prostoty weźmy tylko dwa zdarzenia z prawdopodobieństwem 0.5 i pracujmy na schemacie:
Najeżdżamy pojazdem z więcej niż jednym członem. cell1 ma wartość * * 0, a change1_cell1 zamienia tą wartość na * * 1. W ten sposób zabezpieczamy się przed wywołaniem eventu przez więcej niż 1 człon:
--- Kod: ---event zdarzenie1 multiple 0.0 cell1
change1_cell1
start
condition memcompare * * 0 endevent
--- Koniec kodu ---
Następnie przechodzimy do start, które to ma dwa alternatywne zdarzenia oraz zdarzenie zapętlające w razie niewykonania się żadnego ze zdarzeń alternatywnych. Daje opóźnienie 1 sekundowe w razie cuś:
--- Kod: ---event start multiple 1.0 none
zdarzenie1
zdarzenie2
petla
endevent
--- Koniec kodu ---
Kolejnym zadaniem jest wylosowanie zdarzenie1 lub zdarzenie2. Jeśli takie zdarzenie zostanie wylosowane, to warto dać o tym znać poprzez komórkę pamięci. Oczywiście dajemy zwłokę czasową. Wspomagamy się zdarzeniami zdarzenie1.1 i zdarzenie2.1. change0_cell1 zmienia wartość komórki cell1 na * * 0:
--- Kod: ---event zdarzenie1 multiple 2.0 cell1
zdarzenie1.1
condition memcompare * * 1 endevent
event zdarzenie1.1 multiple 0.0 none
change0_cell1
sem_A_s2
condition propability 0.5 endevent
--- Koniec kodu ---
Analogicznie dla zdarzenie2:
--- Kod: ---event zdarzenie2 multiple 3.0 cell1
zdarzenie2.1
condition memcompare * * 1 endevent
event zdarzenie2.1 multiple 0.0 none
change0_cell1
sem_A_s5
condition propability 0.5 endevent
--- Koniec kodu ---
Teraz zdarzenie zapętlające. Musimy najpierw sprawdzić czy zaszło którekolwiek z dwóch alternatywnych zdarzeń. Pamiętamy o opóźnieniu:
--- Kod: ---event petla multiple 4.0 cell1
start
condition memcompare * * 1 endevent
--- Koniec kodu ---
Czy to ma sens? Zrobiłem analogicznie i log wg mnie pokazuje zupełnie inaczej niż powinien...
youBy:
Jeśli dotyczy to tylko jednego składu i tylko jeden raz na uruchomienie, to można losować zawartość komórek pamięci na początku i mieć spokój do końca służby. Co prawda losowość nie będzie w ostatniej chwili, tylko ustalona przy uruchomieniu, ale większość nie zauważy, a sprytni będą mieli pomoc przy jeździe, gdy zajrzą w loga :D
Benek:
Tak Maciek, to też jest sposób.
Co do mojej idei to wygląda na to, że jest ok. Log pokazuje to co powinien. Zdarzenia się wykonują. Wcześniej pokręciłem z opóźnianiem czasowym. Trzeba się trzymać tego co napisał Ziomal:
--- Cytat: ZiomalCl w 14 Kwietnia 2011, 11:20:20 ---To zadziała tylko wtedy, gdy pozostałe eventy (krosowo2,3) mają zwłokę czasową (z tym, że zwłoka każdego kolejnego eventu musi być wyższa od poprzedniego).
--- Koniec cytatu ---
Nawigacja
Idź do wersji pełnej