47:- multifile wumpus_run/6. 48
52get_stat_result(IDRun,[Size,PPits,NoGolds],Result) :-
53 setof([Size,PPits,NoGolds],IDRun^InitGrid^FinalGrid^H^Time^
54 wumpus_run(IDRun,[Size,PPits,NoGolds],InitGrid,FinalGrid,H,Time),L),
55 member([Size,PPits,NoGolds],L),
56 findall(R,(wumpus_run(IDRun,[Size,PPits,NoGolds],InitGrid,FinalGrid,H,Time),
57 evaluate_run(InitGrid,FinalGrid,H,Time,R)), ListResultsRuns),
58 evaluate_many_runs(ListResultsRuns, Result).
59get_stat_result([Size,PPits,NoGolds],Result) :-
60 setof([Size,PPits,NoGolds],IDRun^InitGrid^FinalGrid^H^Time^
61 wumpus_run(IDRun,[Size,PPits,NoGolds],InitGrid,FinalGrid,H,Time),L),
62 member([Size,PPits,NoGolds],L),
63 findall(R,(wumpus_run(_,[Size,PPits,NoGolds],InitGrid,FinalGrid,H,Time),
64 evaluate_run(InitGrid,FinalGrid,H,Time,R)), ListResultsRuns),
65 evaluate_many_runs(ListResultsRuns, Result).
66
70evaluate_many_runs(ListRRuns, Result) :-
71 length(ListRRuns, NoRuns),
72 flatten(ListRRuns,ListRuns),
73 findall(R1, member(wumpusDead(dead,R1),ListRuns),RR1),length(RR1,LRR1),
74 findall(R2, member(robotDead(dead,R2),ListRuns),RR2),length(RR2,LRR2),
75 findall(R3, (member(noGolds(N,R3),ListRuns),N>0),RR3),length(RR3,LRR3),
76 findall(R4, (member(climbed(R4),ListRuns),R4>0),RR4),length(RR4,LRR4),
77 findall(R5, member(noPits(R5),ListRuns),RR5),average(RR5,ARR5),
78 findall(R6, member(totalReward(R6),ListRuns),RR6),average(RR6,ARR6),
79 findall(R7, member(actions(_,R7),ListRuns),RR7),average(RR7,ARR7),
80 findall(R8, member(actions(R8,_),ListRuns),RR8),average(RR8,ARR8),
81 findall(R9, (member(impossible(R9),ListRuns),R9=1),RR9),length(RR9,LRR9),
82 findall(R10, (member(ListRun,ListRRuns),member(impossible(0),ListRun),
83 member(totalReward(R10),ListRun)),RR10),average(RR10,ARR10),
84 findall(R11, (member(ListRun,ListRRuns),member(impossible(0),ListRun),
85 member(actions(R11,_),ListRun)),RR11),average(RR11,ARR11),
86 findall(R12, member(time(R12),ListRuns),RR12),average(RR12,ARR12),
87 findall(R13, (member(ListRun,ListRRuns),member(impossible(0),ListRun),
88 member(time(R13),ListRun)),RR13),average(RR13,ARR13),
89 Result=[noRuns(NoRuns),impossible(LRR9),
90 noWumpusDead(LRR1),noRobotDead(LRR2),noGotGold(LRR3),noClimbed(LRR4),
91 avgPits(ARR5),avgReward(ARR6),avgRewardExcludingImposs(ARR10),
92 avgCostActions(ARR7),avgNoActions(ARR8),
93 avgNoActionsExcludingImposs(ARR11),
94 avgTime(ARR12), avgTimeExcludingImposs(ARR13)
95 ].
96
103evaluate_run(IGrid,FGrid,H,Time, Result) :-
104 105 106 member(wumpus(IWX,IWY,_), IGrid),
107 member(golds(ILGolds), IGrid),
108 member(pits(ILPits), IGrid),
109 110 member(robot(FRX,FRY,_,_,FRS), FGrid),
111 member(wumpus(_,_,FWS), FGrid),
112 member(golds(FLGolds), FGrid),
113 findall(CA,(member(A,H),actionCost(A,CA)), ListActionCosts), 114 sumlist(ListActionCosts, CostActions),
115 length(H,LH), 116 length(ILPits,LP), 117 (FRS=alive -> CostDie is 0 ; CostDie is -1000), 118 (FWS=alive -> CostDieW is 0 ; CostDieW is 100), 119 length(ILGolds,L1),
120 length(FLGolds,L2),
121 GoldsObtained is L1-L2,
122 (GoldsObtained>0 -> RewardGold is 1000 ; RewardGold is 0),
123 ((member(climb,H), FRX=1, FRY=1) -> Climbed is 50 ; Climbed is 0),
124 (impossible([(IWX,IWY)|ILPits]) -> Imp=1 ; Imp=0),
125 sumlist([CostActions,CostDie,CostDieW,RewardGold,Climbed],TReward),
126 Result=[totalReward(TReward),time(Time),impossible(Imp),
127 noPits(LP),actions(LH,CostActions),
128 robotDead(FRS,CostDie),wumpusDead(FWS,CostDieW),
129 noGolds(GoldsObtained,RewardGold),climbed(Climbed)].
130
133impossible(L) :- member((1,2),L).
134impossible(L) :- member((2,1),L).
135impossible(L) :- member((2,3),L), member((3,1),L).
136impossible(L) :- member((2,3),L), member((3,2),L).
137
138
140actionCost(A,0) :- member(A,[smell, senseBreeze, senseGold]).
141actionCost(A,C) :- member(A,[moveFwd,turn,pickGold,climb,enter]), C is -1.
142actionCost(A,C) :- member(A,[shootFwd]), C is -10.
143
144
146sumlist([],N,N).
147sumlist([N|R],S,T) :-
148 S2 is S+N,
149 sumlist(R,S2,T).
150
151average(L, R) :-
152 sumlist(L, Sum),
153 length(L,LL),
154 (LL\=0 -> R is Sum/LL ; R=none).
155