Laboratory 

Rescue Procedure MichH

# Semester Assignment "Rescue the Princess"
# Part of the lecture "Introduction to Simulation", WiSe2005/06
# Procedure / Experiment script, mostly developed by Jens (thx!)
#
# v.15, existing functionality:
# prince (Stamina, sleep), potions, animals, rivers, princess, bird.
#
# History:
# v.13 Some details (division by 0) were fixed; plausibility check
#    of the run's results implemented.
# v.14 Logging of the Model may be switched off now from the 
#    Experiment by setting variable Blogging to FALSE; some minor cleanup.
# v.15 tvalue changed corrected to TINV(0,01;amountOfRuns-1)
#
### STATISTICS ### of this version & Model v.15 (200 runs)
Probability of Rescue (mean): 0.495000 
C.I. Rescue of Princess:0.402850<=meanRescue<= 0.587150
Probability of killed by enemy (mean): 0.175000 
C.I. killed by enemy:0.104969 <=meanKilled <= 0.245031
Probability of drown in river (mean): 0.105000 
C.I. drown in river:0.048499 <=meanDrown <= 0.161501
Prob. of princess died out of hunger (mean): 0.225000 
C.I. died out of hunger:0.148036 <=meanHunger <= 0.301964
Average times prince has rested: 34.055000 
C.I. prince rested:31.821648 <=meanRest <= 36.288352
Average time to castle: 154.635501 
C.I. time to castle:153.664370 <=meanTime <= 155.606631
Alpha: 0.010000  replications: 200
############################################
  EXPERIMENT ExpRescueThePrincess
  DECLARATION OF VARIABLES
   numreps (INTEGER) := 200,  # set this: AMOUNT OF RUNS of the experiment
   alpha             (REAL) := 0.01, # Level of confidence
   tvalue            (REAL) := 2.6, # Value of t distr.
   # TINV(0,01;200-1) = 2.6
   # TINV(0,01;100-1) = 2.63
   # TINV(0,01;10-1)  = 3.25

   # Rescue of Princess
   sumRescue         (REAL) := 0.0,  # Sum of values
   sumdiffsqRescue   (REAL) := 0.0,  # Terms in variance
   ssquaredRescue    (REAL) := 0.0,  # Sample variance
   meanRescue        (REAL) := 0.0,  # Mean of values
   sigmaRescue       (REAL) := 0.0,  # standard error
   hwidthRescue      (REAL) := 0.0,  # Half-width of c.i.
   ARRAY[200] valuesRescued (REAL) := 0,    # Array for values
   # Killed by enemy
   sumKilled          (REAL) := 0.0,  
   sumdiffsqKilled    (REAL) := 0.0,  
   ssquaredKilled     (REAL) := 0.0,  
   meanKilled         (REAL) := 0.0,  
   sigmaKilled        (REAL) := 0.0, 
   hwidthKilled       (REAL) := 0.0, 
   ARRAY[200] valuesKilled  (REAL) := 0, 
   # Drown In River
   sumDrown            (REAL) := 0.0, 
   sumdiffsqDrown      (REAL) := 0.0,  
   ssquaredDrown       (REAL) := 0.0,  
   meanDrown           (REAL) := 0.0,  
   sigmaDrown          (REAL) := 0.0,  
   hwidthDrown         (REAL) := 0.0,  
   ARRAY[200] valuesDrown   (REAL) := 0,    
   # Princess died out of hunger
   sumHunger         (REAL) := 0.0, 
   sumdiffsqHunger   (REAL) := 0.0,  
   ssquaredHunger    (REAL) := 0.0,  
   meanHunger        (REAL) := 0.0,  
   sigmaHunger       (REAL) := 0.0,  
   hwidthHunger      (REAL) := 0.0,  
   ARRAY[200] valuesHunger   (REAL) := 0,     
   # number of times to rest
   sumRest         (REAL) := 0.0, 
   sumdiffsqRest   (REAL) := 0.0,  
   ssquaredRest    (REAL) := 0.0,  
   meanRest        (REAL) := 0.0,  
   sigmaRest       (REAL) := 0.0,  
   hwidthRest      (REAL) := 0.0,  
   ARRAY[200] valuesRest   (REAL) := 0,   
   # time
   sumTime         (REAL) := 0.0, 
   sumdiffsqTime   (REAL) := 0.0,  
   ssquaredTime    (REAL) := 0.0,  
   meanTime        (REAL) := 0.0,  
   sigmaTime       (REAL) := 0.0,  
   hwidthTime      (REAL) := 0.0,  
   ARRAY[200] valuesTime   (REAL) := 0,
   timesReachedCastle (INTEGER) := 0, # wie oft wurde das schloss erreicht?
    # für Plausibilitätstest:
    princeDeadCheck          (INTEGER) := 0,
    princeDrownInRiverCheck  (INTEGER) := 0,
    princeKilledInFightCheck (INTEGER) := 0,
    princessDeadCheck        (INTEGER) := 0,
    princessRescuedCheck     (INTEGER) := 0,
    princeReachedCastleCheck (INTEGER) := 0


 BODY OF EXPERIMENT
   CREXP NewExp;
   CRRUN Dummy, Rescue;
   CRRUN Run1, Rescue;
 
   <Blogging> := FALSE; # switch off logging output
   FOR i FROM 1 TO numreps REPEAT
     SELRUN Run1;
     SETCTRL ranseed, i;
     SIMULATE TO, 25001;
     # Plausibilitätstest, checke das Modell:
     princeDeadCheck := <princeDead>;
     princeDrownInRiverCheck  := <princeDrownInRiver>;
     princeKilledInFightCheck := <princeKilledInFight>;
     princessDeadCheck        := <princessDead>;
     princessRescuedCheck     := <princessRescued>;
     princeReachedCastleCheck := <princeReachedCastle>;
     IF princessRescuedCheck = 1 AND princessDeadCheck = 1
     DO
        DISPLAY("\n*** ERROR 1 ***\n");
     END    
     IF princeKilledInFightCheck = 1 AND princeDrownInRiverCheck = 1
     DO 
        DISPLAY("\n*** ERROR 2 ***\n");
     END  
     IF princeKilledInFightCheck = 1 AND princeReachedCastleCheck = 1
     DO 
        DISPLAY("\n*** ERROR 3 ***\n");
     END  
     IF princeKilledInFightCheck = 1 AND princeReachedCastleCheck = 1
     DO 
        DISPLAY("\n*** ERROR 4 ***\n");
     END  
     IF princeKilledInFightCheck = 1 AND princeDeadCheck = 0 
     DO
        DISPLAY("\n*** ERROR 5 ***\n");
     END  
     IF princeDrownInRiverCheck = 1 AND princeDeadCheck = 0 
     DO
        DISPLAY("\n*** ERROR 6 ***\n");
     END  
     IF princessRescuedCheck = 1 AND princeDeadCheck = 1
     DO
        DISPLAY("\n*** ERROR 7 ***\n");
     END  
     # hier Zuweisung der STATE variablen aus dem experiment 
     valuesRescued[i]  := <princessRescued>;
     valuesKilled[i]   := <princeKilledInFight>;
     valuesDrown[i]    := <princeDrownInRiver>;
     valuesHunger[i]   := <princessDead>;
     valuesRest[i]     := <timesRest>;
     # >Zeit bis zum Erreichen des Schlosses nur ausrechnen
     # wenn prinz zur burg gelangte:
     IF (<princeReachedCastle> = 1)
     DO
        valuesTime[i] := <Time>;
        timesReachedCastle := timesReachedCastle + 1;
     END
     ELSE
     DO
        valuesTime[i] := 0;
     END
  DISPLAY("\nIteration %4d\n",i);
  DISPLAY("Princess rescued: %f\n", valuesRescued[i]);
  DISPLAY("Prince killed: %f\n", valuesKilled[i]);
  DISPLAY("Prince drown in River: %f\n", valuesDrown[i]);
  DISPLAY("Princess died out of hunger: %f\n", valuesHunger[i]);
  DISPLAY("Prince rested: %f times\n", valuesRest[i]);
  IF(valuesRescued[i] >= 0.5)
     DO
     DISPLAY("time to castle: %f hours\n", valuesTime[i]);
  END
  DISPLAY("\n");
  SELRUN Dummy;
  RESETRUN Run1;
END LOOP
DELEXP NewExp;
  FOR i FROM 1 TO numreps REPEAT
   sumRescue := sumRescue + valuesRescued[i];
   sumKilled := sumKilled + valuesKilled[i];
   sumDrown := sumDrown + valuesDrown[i];
   sumHunger := sumHunger + valuesHunger[i];
   sumRest := sumRest + valuesRest[i];
   sumTime := sumTime + valuesTime[i];
   # sum := sum + values[i];
  END LOOP


  meanRescue := sumRescue / numreps;
  meanKilled := sumKilled / numreps;
  meanDrown := sumDrown   / numreps;
  meanHunger := sumHunger / numreps;
  meanRest := sumRest     / numreps;
  # nur die anzahl der rettungen einrechnen
  IF (timesReachedCastle > 0)
  DO
     meanTime := sumTime / timesReachedCastle; 
  END
  ELSE
  DO
    meanTime := 0;
  END


  FOR i FROM 1 TO numreps REPEAT
   sumdiffsqRescue := sumdiffsqRescue
     +(valuesRescued[i]-meanRescue)*(valuesRescued[i]-meanRescue);
   sumdiffsqKilled := sumdiffsqKilled
     +(valuesKilled[i]-meanKilled)*(valuesKilled[i]-meanKilled);
   sumdiffsqDrown := sumdiffsqDrown
     +(valuesDrown[i]-meanDrown)*(valuesDrown[i]-meanDrown);
   sumdiffsqHunger := sumdiffsqHunger
      +(valuesHunger[i]-meanHunger)*(valuesHunger[i]-meanHunger);
   sumdiffsqRest := sumdiffsqRest
      +(valuesRest[i]-meanRest)*(valuesRest[i]-meanRest);
    #  nur tatsächlich benoetigte werte nehmen
    IF (valuesRescued[i] >= 0.5)
    DO
       sumdiffsqTime := sumdiffsqTime
         +(valuesTime[i]-meanTime)*(valuesTime[i]-meanTime);
    END
    #  sumdiffsq := sumdiffsq+(values[i]-mean)*(values[i]-mean);
 END LOOP


  ssquaredRescue := sumdiffsqRescue/(numreps-1);
  ssquaredKilled := sumdiffsqKilled/(numreps-1);
  ssquaredDrown  := sumdiffsqDrown/(numreps-1);
  ssquaredHunger := sumdiffsqHunger/(numreps-1);
  ssquaredRest   := sumdiffsqRest/(numreps-1);
  # nur die anzahl der rettungen einrechnen
  ssquaredTime   := sumdiffsqTime/( MAX( timesReachedCastle-1, 1) );
  # ssquared := sumdiffsq/(numreps-1);


  sigmaRescue := SQRT(ssquaredRescue/numreps);
  sigmaKilled := SQRT(ssquaredKilled/numreps);
  sigmaDrown  := SQRT(ssquaredDrown/numreps);
  sigmaHunger := SQRT(ssquaredHunger/numreps);
  sigmaRest   := SQRT(ssquaredRest/numreps);
  sigmaTime   := SQRT(ssquaredTime/timesReachedCastle);
  # sigma     := SQRT(ssquared/numreps);
  hwidthRescue := tvalue * sigmaRescue;
  hwidthKilled := tvalue * sigmaKilled;
  hwidthDrown  := tvalue * sigmaDrown;
  hwidthHunger := tvalue * sigmaHunger;
  hwidthRest   := tvalue * sigmaRest;
  hwidthTime   := tvalue * sigmaTime;
  # hwidth := tvalue * sigma;


  DISPLAY("\n### STATISTICS ###\n");
  DISPLAY("\nProbability of Rescue (mean): %f \n",meanRescue);
  DISPLAY("C.I. Rescue of Princess:"); 
  DISPLAY("%f<=meanRescue<= %f",meanRescue-hwidthRescue,
    meanRescue+hwidthRescue);
  DISPLAY("\n");
  DISPLAY("\nProbability of killed by enemy (mean): %f \n",meanKilled);
  DISPLAY("C.I. killed by enemy:"); 
  DISPLAY("%f <=meanKilled",meanKilled-hwidthKilled); 
  DISPLAY(" <= %f",meanKilled+hwidthKilled);
  DISPLAY("\n");
  DISPLAY("\nProbability of drown in river (mean): %f \n",meanDrown);
  DISPLAY("C.I. drown in river:"); 
  DISPLAY("%f <=meanDrown",meanDrown-hwidthDrown); 
  DISPLAY(" <= %f",meanDrown+hwidthDrown);
  DISPLAY("\n");
  DISPLAY("\nProb. of princess died out of hunger (mean): %f \n",meanHunger);
  DISPLAY("C.I. died out of hunger:"); 
  DISPLAY("%f <=meanHunger",meanHunger-hwidthHunger); 
  DISPLAY(" <= %f",meanHunger+hwidthHunger);
  DISPLAY("\n");
  DISPLAY("\nAverage times prince has rested: %f \n",meanRest);
  DISPLAY("C.I. prince rested:"); 
  DISPLAY("%f <=meanRest",meanRest-hwidthRest); 
  DISPLAY(" <= %f",meanRest+hwidthRest);
  DISPLAY("\n");
  DISPLAY("\nAverage time to castle: %f \n",meanTime);
  DISPLAY("C.I. time to castle:"); 
  DISPLAY("%f <=meanTime",meanTime-hwidthTime); 
  DISPLAY(" <= %f",meanTime+hwidthTime);
  DISPLAY("\n");
  DISPLAY("Alpha: %f, replications: %d\n", alpha, numreps);
END OF ExpRescueThePrincess


 Log   Galleries   Laboratory 


Leave the house before you find something worth staying in for.