godisreal / test-crowd-dynamics

Testing Result of Crowd Evacuation Behavior by Using FDS+Evac
4 stars 2 forks source link

About the door selection algorithm in FDS+EVAC #2

Open godisreal opened 5 years ago

godisreal commented 5 years ago

I think there are two different concepts regarding door selection of agents.

The first thing is whehter an agent knows a door or not, and it is boolean logic (know it or not know it), and it is characterized by known_door_names in the current program (evac.f90). The second issue is how an agent is familiar with a known door, and it should be measured by a real number from 0 to 1 (Just like a probality). An agent can only be familiar with a known door. If one does not know the door, there is no issue of being familiar to it. Thus, the familiarity measure is specified by known_door_probs, and it is only effective for the known doors. That is, known_door_probs=1.0 means being fully familiar with a door while known_door_probs=0.0 means unfamilarity.

In EXIT namelist Users are also allowed to give a value in between like 0.6 or 0.3 (0.0<=known_door_probs<=1.0). This is very similar to probablity, and familiarity to an exit is thus understood as the frequence of using the exit in the historical data (prior information). From there one can infer the probablity of how agents select the doors and exits in the simulation run.

However, exiting program (evac.f90) only provides a good user interface, but the inner algorithm of exit selection is far from perfect. The algorithm generates a random number and compare it with known_door_probs to assign the exit either familiar or unfamiliar (boolean logic). A better method is integrating the real familiary measure in the preference order in the door selection algorithm (User Guide pp. 29, Table3). As a result, the familarity is not a yes/no logic, but with the real number given by known_door_probs.

The original weblink is as below.
https://github.com/firemodels/fds/issues/2206

godisreal commented 5 years ago

There may be a problem about the following code in Change_Target_Door(). That is, when a door is closed, some agents change the target right away. Sometimes this feature is useful, and sometimes it is not. I think that the agents may not know the door is closed if they haven't got the door in sight.

    DO i = 1, N_DOORS
       IF (ABS(EVAC_DOORS(I)%IMODE)==2 .AND. .NOT.EVAC_DOORS(I)%TARGET_WHEN_CLOSED) THEN
          Is_Visible_Door(i) = .FALSE.
          Is_Known_Door(i) = .FALSE.
       END IF
    END DO
    DO i = 1, N_EXITS
       IF ( (ABS(EVAC_EXITS(i)%IMODE)==2) .AND. .NOT. EVAC_EXITS(i)%COUNT_ONLY .AND. &
            .NOT.EVAC_EXITS(I)%TARGET_WHEN_CLOSED) THEN
          Is_Visible_Door(N_DOORS+i) = .FALSE.
          Is_Known_Door(N_DOORS+i) = .FALSE.
       END IF
    END DO
godisreal commented 3 years ago

! I_DoorAlgo=0: Use the main evacuation mesh flow field ("stupid agents"), do not follow these. ! I_Door_Mode: 0) no target door or not (yet) moving ! 1) target door + moving by using flow fields ! 2) target door + moving + bee line towards the exit (do not use flow fields) XYZ visible ! 3) target door + moving + bee line towards the exit (do not use flow fields) XB visible ! 4) target door + moving + bee line towards the exit (do not use flow fields) XYZ+XB visible ! <0) came out form a door or an entry, but does not have a target door

! HR%I_DoorAlgo: 1 rational agents, 2 known doors, 3 herding, 0 main evac mesh ff ! Herding behaviour: Count and weight by the distance the target doors of the other ! agents around this agent. The five (or less) nearest neighbor agents are used. ! I_HERDING_TYPE 0: default herding, 1: keep the first choice, 2: do not move, ! 3: do not move + keep the first choice