Symulator EU07 (i nie tylko) > Pomoc w tworzeniu

 Losowanie zdarzeń z jednakowym prawdopodobieństwem

<< < (4/4)

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

[0] Indeks wiadomości

[*] Poprzednia strona

Idź do wersji pełnej
Powered by Advanced Topic Prefix Pro
Powered by SMFPacks Likes Pro Mod