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


