Welche Typen sollten Sie in Ihrem Pokémon-Team haben? Effiziente Simulation mit Matrizen in R

Matrix-Magie

Ursprünglich wollte ich diesen Beitrag „Zurück zur Basis“ nennen, da ich mich aus dem Tidyverse in die Welt der Matrizen bewege, aber es gibt wirklich nichts Grundlegendes an dieser Sache. Gehen wir es Schritt für Schritt durch.

Zuerst nehmen wir unsere Tabelle und machen daraus eine Matrix. Wir können nicht einfach as.matrix() direkt machen, da es die Angriffsspalte zur ersten Spalte macht, während wir wollen, dass das die Rownamen sind, also werden wir es in zwei Schritten machen.

m <- as.matrix(type_comparisons)rownames(m) <- type_comparisons$Attacking

Als Nächstes, da wir uns nur dafür interessieren, ob der Eintrag eine 2 ist oder nicht, ändern wir jeden Eintrag, der eine 2 ist, in eine 1 und jeden Eintrag, der keine 2 ist, in eine 0 (das 1L * macht daraus 1 oder 0 statt TRUE oder FALSE).

super_effective_m <- (m == 2) * 1L
super_effective_m
## Normal Fire Water Electric Grass Ice Fighting Poison Ground Flying## Normal 0 0 0 0 0 0 0 0 0 0## Fire 0 0 0 0 1 1 0 0 0 0## Water 0 1 0 0 0 0 0 0 1 0## Electric 0 0 1 0 0 0 0 0 0 1## Grass 0 0 1 0 0 0 0 0 1 0## Ice 0 0 0 0 1 0 0 0 1 1## Fighting 1 0 0 0 0 1 0 0 0 0## Poison 0 0 0 0 1 0 0 0 0 0## Ground 0 1 0 1 0 0 0 1 0 0## Flying 0 0 0 0 1 0 1 0 0 0## Psychic 0 0 0 0 0 0 1 1 0 0## Bug 0 0 0 0 1 0 0 0 0 0## Rock 0 1 0 0 0 1 0 0 0 1## Ghost 0 0 0 0 0 0 0 0 0 0## Dragon 0 0 0 0 0 0 0 0 0 0## Dark 0 0 0 0 0 0 0 0 0 0## Steel 0 0 0 0 0 1 0 0 0 0## Fairy 0 0 0 0 0 0 1 0 0 0## Psychic Bug Rock Ghost Dragon Dark Steel Fairy## Normal 0 0 0 0 0 0 0 0## Fire 0 1 0 0 0 0 1 0## Water 0 0 1 0 0 0 0 0## Electric 0 0 0 0 0 0 0 0## Grass 0 0 1 0 0 0 0 0## Ice 0 0 0 0 1 0 0 0## Fighting 0 0 1 0 0 1 1 0## Poison 0 0 0 0 0 0 0 1## Ground 0 0 1 0 0 0 1 0## Flying 0 1 0 0 0 0 0 0## Psychic 0 0 0 0 0 0 0 0## Bug 1 0 0 0 0 1 0 0## Rock 0 1 0 0 0 0 0 0## Ghost 1 0 0 1 0 0 0 0## Dragon 0 0 0 0 1 0 0 0## Dark 1 0 0 1 0 0 0 0## Steel 0 0 1 0 0 0 0 1## Fairy 0 0 0 0 1 1 0 0

Die all_combinations-Matrix, die wir zuvor erstellt haben, ist im Wesentlichen eine Menge von Indizes für die super_effective_m-Matrix. Zum Beispiel, Spalte 1 von all_combinations sind die Zahlen 1 bis 6, was bedeutet, dass wir die Zeilen 1 bis 6 von super_effective_m erhalten wollen. Denken Sie daran, dass jede Zeile von super_effective_m ein Angreifer-Typ in unserem Team ist und jede Spalte ein Verteidiger-Typ ist. Wir wollen dann die Summe jeder Spalte ermitteln und wissen, wie viele Spalten eine Summe von mehr als 0 haben, was bedeutet, dass mindestens einer unserer Angriffstypen super effektiv gegen ihn war. Wir erstellen eine Funktion, super_effective_nb:

super_effective_nb <- function(indices) { sum(colSums(super_effective_m) > 0)}

Jetzt können wir apply() verwenden, um einen Vektor für alle 18k+ Teams zu erhalten, gegen wie viele Typen sie super effektiv sind. Wenn Sie mit apply() nicht vertraut sind, ist das erste Argument das, worauf wir unsere Funktion anwenden, das zweite ist, ob sie auf die Zeilen oder Spalten angewendet werden soll (wir wählen 2 für Spalte, da jede Spalte das Team ist), und das dritte ist die Funktion.

super_effective_results <- apply(all_combinations, 2, super_effective_nb)

Was sind die Kombinationen, die gegen die maximal mögliche Anzahl von Typen super effektiv sind?

which(super_effective_results == max(super_effective_results))
## 14323 14325 15610 15612 16454 16459 16852 16854 16989 16994

Wir sehen, dass es 10 mögliche Kombinationen von sechs Typen gibt. Schauen wir sie uns an, indem wir diese Spalten von all_combinations holen.

best_combos <- all_combinationsbest_combos
## ## 4 4 5 5 5 5 6 6 6 6## 6 6 6 6 8 8 7 7 7 7## 7 7 7 7 9 9 8 8 9 9## 9 9 9 9 13 13 9 9 10 10## 10 10 10 10 14 16 10 10 14 16## 14 16 14 16 18 18 14 16 17 17

Wir haben jetzt eine Matrix, best_combo, in der jede Spalte ein Team ist. Zum Beispiel sehen wir, dass ein Team mit den Typen 4, 6, 7, 9, 10 und 14 die maximale Anzahl der verteidigenden Typen abdeckt. Aber was ist Typ 4? Um das zu beantworten, nehmen wir die Zeilennamen aus super_effective_m und indizieren sie mit best_combos.

rownames(super_effective_m)
## "Electric" "Ice" "Fighting" "Ground" "Flying" "Ghost" ## "Electric" "Ice" "Fighting" "Ground" "Flying" "Dark" ## "Grass" "Ice" "Fighting" "Ground" "Flying" "Ghost" ## "Grass" "Ice" "Fighting" "Ground" "Flying" "Dark" ## "Grass" "Poison" "Ground" "Rock" "Ghost" "Fairy" ## "Grass" "Poison" "Ground" "Rock" "Dark" "Fairy" ## "Ice" "Fighting" "Poison" "Ground" "Flying" "Ghost" ## "Ice" "Fighting" "Poison" "Ground" "Flying" "Dark" ## "Ice" "Fighting" "Ground" "Flying" "Ghost" "Steel" ## "Ice" "Fighting" "Ground" "Flying" "Dark" "Steel"

Damit erhalten wir allerdings einen Zeichenvektor. Er ist geordnet, so dass wir wissen, dass die erste Sechs Team 1 ist, die zweite Sechs Team 2 usw., aber er wird nicht sehr gut dargestellt. Wir können matrix verwenden, um dies stattdessen in eine Matrix zu verwandeln, indem wir angeben, dass wir 6 Zeilen wollen.

strongest_teams <- matrix(rownames(super_effective_m), nrow = 6)
strongest_teams
## ## "Electric" "Electric" "Grass" "Grass" "Grass" "Grass" "Ice" ## "Ice" "Ice" "Ice" "Ice" "Poison" "Poison" "Fighting"## "Fighting" "Fighting" "Fighting" "Fighting" "Ground" "Ground" "Poison" ## "Ground" "Ground" "Ground" "Ground" "Rock" "Rock" "Ground" ## "Flying" "Flying" "Flying" "Flying" "Ghost" "Dark" "Flying" ## "Ghost" "Dark" "Ghost" "Dark" "Fairy" "Fairy" "Ghost" ## ## "Ice" "Ice" "Ice" ## "Fighting" "Fighting" "Fighting"## "Poison" "Ground" "Ground" ## "Ground" "Flying" "Flying" ## "Flying" "Ghost" "Dark" ## "Dark" "Steel" "Steel"

Für unseren letzten Schritt machen wir daraus ein Tibble, damit ich mir ansehen kann, welche Typen bei den verschiedenen Team-Möglichkeiten am häufigsten vorkommen.

strongest_teams %>% as_tibble() %>% gather(team, type) %>% count(type, sort = TRUE) %>% knitr::kable()
Typ n
Boden 10
Kämpfen 8
Fliegen 8
Eis 8
Dunkel 5
Geist 5
Gras 4
Gift 4
Elektrisch 2
Fee 2
Felsen 2
Stahl 2

Wir sehen, dass alle 10 Teams einen Bodentyp brauchen, wobei 8 einen Kampf-, Flug- oder Eis-Typ haben. Auf der anderen Seite werden Elektrisch, Fee, Gestein und Stahl nur von jeweils zwei Teams verwendet.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.