Matrix mat = new Matrix(n + 1, n + 1);
// Überschriften.
for (int i = 0; i < mat.getColumnCount(); i++) {
mat.setColumnTitle(i, new Integer2D(i, n - i));
}
for (int j = 0; j < mat.getRowCount(); j++) {
mat.setRowTitle(j, new Integer2D(j, n - j));
}
// Speichert die Summanden für die asymmetrische Wkeits-Verschiebung zugunsten der "Guten".
HashMap<Integer2D, Double> summanden = new HashMap<Integer2D, Double>();
// Übernimm Wkeitsmatrix in Gesamtmatrix.
for (int j = 0; j < mat.getRowCount(); j++) {
for (int i = Math.max(j - k + 1, 0); i < Math.min(j + k, mat.getColumnCount()); i++) {
if (i == j) {
mat.set(i, j, mat.get(i, j) + getWkeit(
mat.getRowTitle(j),
new Integer2D(0, k),
probabilityMatrixC));
mat.set(i, j, mat.get(i, j) + getWkeit(
mat.getRowTitle(j),
new Integer2D(k, 0),
probabilityMatrixC));
} else {
int gute;
double summand;
double l;
if (i < j) {
gute = j - i;
} else if (i > j) {
gute = k - (i - j);
} else {
// Dieser Fall kann nicht auftreten.
gute = -1;
summand = Double.NEGATIVE_INFINITY;
}
l = k - gute;
summand = l / k * cg;
Integer2D spalteWkeitsMatrix = new Integer2D(gute, k - gute);
double wkeit = getWkeit(
mat.getRowTitle(j),
spalteWkeitsMatrix,
probabilityMatrixC);
if (wkeit == 0) {
summand = 0;
}
// Achtung: Hier ist das Zweiertupel (x, y) die Koordinate [x][y] in der Wkeits-Matrix.
summanden.put(new Integer2D(i, j), summand);
mat.set(i, j, mat.get(i, j) + wkeit);
}
}
}
// Füge Wkeit für Konvertierung in Richtung "gut" bzw. "schlecht".
for (int j = 0; j < mat.getRowCount(); j++) {
double kk = k;
double l = kk; // Der Faktor für die Wkeit (=> gut / schlecht).
Double summand;
for (int i = 0; i < kk; i++) {
if (i != 0 && j + i >= 0 && j + i < mat.getColumnCount()) {
summand = summanden.get(new Integer2D(j + i, j));
if (summand == null) {
summand = 0.0;
}
mat.set(j + i, j, mat.get(j + i, j) * (l / kk + summand));
}
l--;
}
l = kk;
for (int i = 0; i < kk; i++) {
if (i != 0 && j - i >= 0 && j - i < mat.getColumnCount()) {
summand = summanden.get(new Integer2D(j - i, j));
if (summand == null) {
summand = 0.0;
}
mat.set(j - i, j, mat.get(j - i, j) * (l / kk - summand));