-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathappendix_com.tex
165 lines (135 loc) · 5.12 KB
/
appendix_com.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
\section{Implementierung des DSXCS Algorithmus}
\newlisting{Erstes Kernstück des verzögerten SXCS Algorithmus DSXCS (\emph{collectReward()}, Bewertung der \emph{action set} Listen)}{collect_reward_dsxcs:pro}
/**
* Diese Funktion verarbeitet den übergebenen base reward Wert und
* gibt ihn an die zugehörigen action set Listen weiter. Es wird
* kein maxPrediction Wert berechnet oder weitergegeben.
*
* @param start_index Index in der historicActionSet Liste der als
* erstes aktualisiert werden soll.
* @param action_set_size Anzahl der action set Listen, die aktualisiert
* werden sollen.
* @param reward Wahr wenn der Zielobjekt in Sicht oder keine Agenten
* in Sicht waren.
* @param factor Der Aktualisierungsfaktor
* @param is_event Wahr wenn diese Funktion wegen eines positiven oder
* negativen Ereignisses aufgerufen wurde.
*/
public void collectReward(final int start_index,
final int action_set_size, final boolean reward,
final double factor, final boolean is_event) {
double corrected_reward = reward ? 1.0 : 0.0;
/**
* Aktualisiere eine ganze Anzahl von Einträgen in der
* historicActionSet Liste.
*/
for(int i = 0; i < action_set_size; i++) {
/**
* Benutze aufsteigenden bzw. absteigenden reward Wert bei
* einem positiven bzw. negativen Ereignis.
*/
if(is_event) {
corrected_reward = reward ?
calculateReward(i, action_set_size) :
calculateReward(action_set_size - i, action_set_size);
}
/**
* Füge den ermittelten reward Wert zur historicActionSet Liste.
*/
historicActionSet.get(start_index - i).
addReward(corrected_reward, factor);
}
}
\end{lstlisting}
\newlisting{Zweites Kernstück des verzögerten SXCS Algorithmus DSXCS (\emph{calculateNextMove()}, Auswahl der nächsten Aktion und Ermittlung der zugehörigen \emph{action set} Liste)}{dsxcs_calc_move:pro}
/**
* Der erste Teil der Funktion ist identisch mit der calculateNextMove()
* Funktion der SXCS Variante ohne Kommunikation. Der Zusatz ist, dass beim
* Überlauf die in der historicActionSet Liste gespeicherte reward Werte
* verarbeitet werden.
*
* @param gaTimestep Der aktuelle Zeitschritt
*/
public void calculateNextMove(final long gaTimestep) {
// ...
/**
* historicActionSet Liste voll? Dann verarbeite den dortigen reward Wert.
*/
if (historicActionSet.size() > Configuration.getMaxStackSize()) {
historicActionSet.pop().processReward();
}
}
\end{lstlisting}
\newlisting{Drittes Kernstück des verzögerten SXCS Algorithmus DSXCS (Verarbeitung des jeweiligen reward Werts, \emph{processReward()})}{process_reward_dsxcs1:pro}
/**
* Zentrale Routine der historicActionSet Liste zur Verarbeitung aller
* eingegangenen reward Werte bis zu diesem Punkt.
*/
public void processReward() {
for(RewardHelper r : reward) {
/**
* Aktualisiere den Eintrag mit den entsprechenden Werten.
*/
actionClassifierSet.updateReward(r.reward, 0.0, r.factor);
}
}
\end{lstlisting}
\newlisting{Verbesserte Variante des dritten Kernstück des verzögerten SXCS Algorithmus DSXCS (Verarbeitung des jeweiligen reward Werts, \emph{processReward()})}{process_reward_dsxcs2:pro}
/**
* Verbesserte zentrale Routine der historicActionSet Liste zur
* Verarbeitung aller eingegangenen reward Wert bis zu diesem Punkt.
*/
public void processReward() {
double max_value = 0.0;
double max_reward = 0.0;
/**
* Finde das größte reward / factor Paar.
*/
for(RewardHelper r : reward) {
if(r.reward * r.factor > max_value) {
max_value = r.reward * r.factor;
max_reward = r.reward;
}
}
/**
* Aktualisiere den Eintrag mit dem ermittelten Werten.
*/
actionClassifierSet.updateReward(max_reward, 0.0, 1.0);
}
\end{lstlisting}
\clearpage
\section{Implementierung des egoistischen \emph{reward}}
\newlisting{"'Egoistische Relation"', Algorithmus zur Bestimmung des Kommunikationsfaktors basierend auf dem erwarteten Verhalten des Agenten gegenüber anderen Agenten}{egoistic_relationship:pro}
/**
* Ähnlichkeit dieser classifier set Liste zu der übergebenen Liste im
* Hinblick auf die Wahrscheinlichkeit, auf andere Agenten zuzugehen
* @param other Die andere Liste mit der verglichen werden soll
* @return Grad der Ähnlichkeit bzw. der Kommunikationsfaktor (0,0 - 1,0)
*/
public double checkEgoisticDegreeOfRelationship(
final MainClassifierSet other) {
double ego_factor = getEgoisticFactor() - other.getEgoisticFactor();
if(ego_factor == 0.0) {
return 0.0;
} else {
return 1.0 - ego_factor * ego_factor;
}
}
public double getEgoisticFactor() throws Exception {
double factor = 0.0;
double pred_sum = 0.0;
for(Classifier c : getClassifiers()) {
if(!c.isPossibleSubsumer()) {
continue;
}
factor += c.getEgoFactor();
pred_sum += c.getFitness() * c.getPrediction();
}
if(pred_sum > 0.0) {
factor /= pred_sum;
} else {
factor = 0.0;
}
return factor;
}
\end{lstlisting}