Optimal Play in Caverna: A Formal Proof of Weak Dominance

9 Payoff Matrix and Nash Equilibrium

This chapter contains the main results. We construct an \(8 \times 8\) payoff matrix from the strategy archetypes, prove that \(\textsc{FurnRush}{}\) is the unique weakly dominant strategy, that \((\textsc{FurnRush}{},\textsc{FurnRush}{})\) is the unique pure Nash equilibrium, and quantify the price of anarchy.

9.1 Payoff matrix

The payoff matrix \(M : \text{Fin}\, 8 \to \text{Fin}\, 8 \to \mathbb {N}\) assigns \(M_{i,j}\) as the expected score of archetype \(i\) when the opponent plays archetype \(j\). Entries are derived from score estimates adjusted for contention and synergy effects. The matrix is indexed via \(\text{toFin}\) and \(\text{ofFin}\) conversions between \(\text{StrategyArchetype}\) and \(\text{Fin}\, 8\).

\begin{tikzpicture} [
  cell/.style={minimum width=1.15cm, minimum height=0.75cm, inner sep=0pt,
               font=\small\bfseries, text=textDark},
  hdr/.style={cell, font=\small\itshape, fill=pastelSlate, text=textDark},
]
% Column headers (opponent)
\node[hdr] at (0, 0.75) {\rotatebox{55}{\scriptsize Opponent}};
\foreach \j/\name in {1/FR, 2/WR, 3/AH, 4/MH, 5/Bal, 6/PF, 7/RE, 8/PC} {
  \node[hdr] at (\j*1.15, 0.75) {\name};
}
% Row headers + cells
% Row 0: FurnRush  85 130 135 130 125 135 135 130
\node[hdr] at (0, 0) {FR};
\node[cell, fill=heatMid]     at (1*1.15, 0) {85};
\node[cell, fill=heatHigh]    at (2*1.15, 0) {130};
\node[cell, fill=heatHigh]    at (3*1.15, 0) {135};
\node[cell, fill=heatHigh]    at (4*1.15, 0) {130};
\node[cell, fill=heatHigh]    at (5*1.15, 0) {125};
\node[cell, fill=heatHigh]    at (6*1.15, 0) {135};
\node[cell, fill=heatHigh]    at (7*1.15, 0) {135};
\node[cell, fill=heatHigh]    at (8*1.15, 0) {130};
% Row 1: WeapRush  80  75 100  85  95 105 100  85
\node[hdr] at (0, -0.75) {WR};
\node[cell, fill=heatMid]     at (1*1.15, -0.75) {80};
\node[cell, fill=heatMidLow]  at (2*1.15, -0.75) {75};
\node[cell, fill=heatMidHigh] at (3*1.15, -0.75) {100};
\node[cell, fill=heatMid]     at (4*1.15, -0.75) {85};
\node[cell, fill=heatMidHigh] at (5*1.15, -0.75) {95};
\node[cell, fill=heatMidHigh] at (6*1.15, -0.75) {105};
\node[cell, fill=heatMidHigh] at (7*1.15, -0.75) {100};
\node[cell, fill=heatMid]     at (8*1.15, -0.75) {85};
% Row 2: AnimHusb  75 100  70 100  95 105 100 100
\node[hdr] at (0, -1.5) {AH};
\node[cell, fill=heatMidLow]  at (1*1.15, -1.5) {75};
\node[cell, fill=heatMidHigh] at (2*1.15, -1.5) {100};
\node[cell, fill=heatMidLow]  at (3*1.15, -1.5) {70};
\node[cell, fill=heatMidHigh] at (4*1.15, -1.5) {100};
\node[cell, fill=heatMidHigh] at (5*1.15, -1.5) {95};
\node[cell, fill=heatMidHigh] at (6*1.15, -1.5) {105};
\node[cell, fill=heatMidHigh] at (7*1.15, -1.5) {100};
\node[cell, fill=heatMidHigh] at (8*1.15, -1.5) {100};
% Row 3: MineHeavy  75  85  95  65  90 100  95  85
\node[hdr] at (0, -2.25) {MH};
\node[cell, fill=heatMidLow]  at (1*1.15, -2.25) {75};
\node[cell, fill=heatMid]     at (2*1.15, -2.25) {85};
\node[cell, fill=heatMidHigh] at (3*1.15, -2.25) {95};
\node[cell, fill=heatLow]     at (4*1.15, -2.25) {65};
\node[cell, fill=heatMid]     at (5*1.15, -2.25) {90};
\node[cell, fill=heatMidHigh] at (6*1.15, -2.25) {100};
\node[cell, fill=heatMidHigh] at (7*1.15, -2.25) {95};
\node[cell, fill=heatMid]     at (8*1.15, -2.25) {85};
% Row 4: Balanced  70  85  85  85  70  90  85  85
\node[hdr] at (0, -3.0) {Bal};
\node[cell, fill=heatMidLow]  at (1*1.15, -3.0) {70};
\node[cell, fill=heatMid]     at (2*1.15, -3.0) {85};
\node[cell, fill=heatMid]     at (3*1.15, -3.0) {85};
\node[cell, fill=heatMid]     at (4*1.15, -3.0) {85};
\node[cell, fill=heatMidLow]  at (5*1.15, -3.0) {70};
\node[cell, fill=heatMid]     at (6*1.15, -3.0) {90};
\node[cell, fill=heatMid]     at (7*1.15, -3.0) {85};
\node[cell, fill=heatMid]     at (8*1.15, -3.0) {85};
% Row 5: PeaceFarm  65  75  75  80  75  60  80  75
\node[hdr] at (0, -3.75) {PF};
\node[cell, fill=heatLow]     at (1*1.15, -3.75) {65};
\node[cell, fill=heatMidLow]  at (2*1.15, -3.75) {75};
\node[cell, fill=heatMidLow]  at (3*1.15, -3.75) {75};
\node[cell, fill=heatMid]     at (4*1.15, -3.75) {80};
\node[cell, fill=heatMidLow]  at (5*1.15, -3.75) {75};
\node[cell, fill=heatLow]     at (6*1.15, -3.75) {60};
\node[cell, fill=heatMid]     at (7*1.15, -3.75) {80};
\node[cell, fill=heatMidLow]  at (8*1.15, -3.75) {75};
% Row 6: RubyEcon  65  75  75  75  70  80  55  75
\node[hdr] at (0, -4.5) {RE};
\node[cell, fill=heatLow]     at (1*1.15, -4.5) {65};
\node[cell, fill=heatMidLow]  at (2*1.15, -4.5) {75};
\node[cell, fill=heatMidLow]  at (3*1.15, -4.5) {75};
\node[cell, fill=heatMidLow]  at (4*1.15, -4.5) {75};
\node[cell, fill=heatMidLow]  at (5*1.15, -4.5) {70};
\node[cell, fill=heatMid]     at (6*1.15, -4.5) {80};
\node[cell, fill=heatLow]     at (7*1.15, -4.5) {55};
\node[cell, fill=heatMidLow]  at (8*1.15, -4.5) {75};
% Row 7: PeaceCave  70  80  80  85  80  85  80  60
\node[hdr] at (0, -5.25) {PC};
\node[cell, fill=heatMidLow]  at (1*1.15, -5.25) {70};
\node[cell, fill=heatMid]     at (2*1.15, -5.25) {80};
\node[cell, fill=heatMid]     at (3*1.15, -5.25) {80};
\node[cell, fill=heatMid]     at (4*1.15, -5.25) {85};
\node[cell, fill=heatMid]     at (5*1.15, -5.25) {80};
\node[cell, fill=heatMid]     at (6*1.15, -5.25) {85};
\node[cell, fill=heatMid]     at (7*1.15, -5.25) {80};
\node[cell, fill=heatLow]     at (8*1.15, -5.25) {60};
% Highlight: diagonal cells get a thicker border
\foreach \i in {0,...,7} {
  \draw[accentBlue, thick] (\i*1.15+1.15-0.575, -\i*0.75-0.375) rectangle ++(1.15, 0.75);
}
% Highlight: FurnRush row bracket
\draw[accentGreen, ultra thick, rounded corners=2pt]
  (1*1.15-0.575, 0.375) rectangle (8*1.15+0.575, -0.375);
% Nash cell marker
\node[anchor=south, font=\tiny\itshape, text=accentGreen] at (1*1.15, 0.4) {Nash};
% Labels
\node[font=\small, text=textDark, rotate=90, anchor=south] at (-0.7, -2.25) {Row player};
\end{tikzpicture}
Figure 9.1 The \(8 \times 8\) payoff matrix. Green border marks the FurnRush row (weakly dominant). Blue borders highlight the diagonal (mirror matchups, always depressed). Cell colour intensity reflects payoff magnitude: light green (\(55\)) to coral (\(135\)).
Definition 9.2 Row sum
#

\(\sigma (s) = \sum _{j=0}^{7} M_{\text{toFin}(s),j}\), the total payoff of strategy \(s\) summed across all opponent choices.

Definition 9.3 Best response
#

\(\text{bestResponse}(s)\) is the strategy \(t\) that maximizes \(M_{\text{toFin}(t),\text{toFin}(s)}\), i.e. the best reply to an opponent playing \(s\).

Definition 9.4 Nash equilibrium
#

A pair \((a, b)\) is a Nash equilibrium if neither player can unilaterally improve: \(a = \text{bestResponse}(b)\) and \(b = \text{bestResponse}(a)\).

Definition 9.5 Social welfare

\(\text{socialWelfare}(a,b) = M_{\text{toFin}(a),\text{toFin}(b)} + M_{\text{toFin}(b),\text{toFin}(a)}\). The Nash welfare is \(\text{socialWelfare}(\textsc{FurnRush}{},\textsc{FurnRush}{})\). The social optimum is the maximum social welfare over all pairs.

9.2 Matrix properties

Theorem 9.6 All payoffs positive
#

\(\forall \, i\, j,\; M_{i,j} {\gt} 0\).

Proof

By checking all \(64\) entries.

Theorem 9.7 Minimum payoff is 55
#

\(\forall \, i\, j,\; M_{i,j} \ge 55\), and \(M_{6,6} = 55\). The worst outcome is a \(\textsc{PeaceCave}{}\) mirror match.

Proof

By exhaustive check of all \(64\) entries.

Theorem 9.8 Maximum payoff is 135
#

\(\forall \, i\, j,\; M_{i,j} \le 135\), and \(M_{0,2} = 135\). The best outcome is \(\textsc{FurnRush}{}\) against \(\textsc{PeaceFarm}{}\).

Proof

By exhaustive check.

Theorem 9.9 Diagonal is always depressed
#

For every strategy \(i\), there exists an opponent \(j \ne i\) such that \(M_{i,j} {\gt} M_{i,i}\). Mirror matchups are never optimal.

Proof

By exhibiting a witness \(j\) for each \(i\).

9.3 Weak dominance

Theorem 9.10 Furnishing rush is weakly dominant

For all opponents \(j\) and all alternative strategies \(s\),

\[ M_{0,j} \ge M_{\text{toFin}(s),j}. \]

That is, \(\textsc{FurnRush}{}\) (row \(0\)) weakly dominates every other row.

Proof

By checking all \(8 \times 8 = 64\) pairwise comparisons in the matrix. For each column \(j\) and each alternative row \(s\), the \(\textsc{FurnRush}{}\) entry is \(\ge \) the alternative entry.

Theorem 9.11 Strict improvement exists

For every \(s \ne \textsc{FurnRush}{}\), there exists an opponent \(j\) where \(M_{0,j} {\gt} M_{\text{toFin}(s),j}\). The dominance is therefore weak (not just tied everywhere).

Proof

By exhibiting an explicit witness column for each of the \(7\) non-\(\textsc{FurnRush}{}\) strategies.

Theorem 9.12 Best response is always furnishing rush

\(\forall \, s,\; \text{bestResponse}(s) = \textsc{FurnRush}{}\). No matter what the opponent does, \(\textsc{FurnRush}{}\) is the best reply.

Proof

Since \(\textsc{FurnRush}{}\) weakly dominates all alternatives, it maximizes the payoff in every column.

9.4 Nash equilibrium

Theorem 9.13 Furnishing mirror is Nash

\(\text{isNashEquilibrium}(\textsc{FurnRush}{}, \textsc{FurnRush}{})\).

Proof

Both players are playing their best response (\(\textsc{FurnRush}{}\)) to the other’s strategy (\(\textsc{FurnRush}{}\)).

Theorem 9.14 Unique Nash equilibrium

\((\textsc{FurnRush}{}, \textsc{FurnRush}{})\) is the unique pure Nash equilibrium. If \((a, b)\) is any Nash equilibrium, then \(a = b = \textsc{FurnRush}{}\).

Proof

In any Nash equilibrium \((a,b)\), we need \(a = \text{bestResponse}(b) = \textsc{FurnRush}{}\) and \(b = \text{bestResponse}(a) = \textsc{FurnRush}{}\).

9.5 Row sum analysis

The row sums satisfy the strict ordering:

\[ \sigma (\textsc{FurnRush}{}) = 1005 {\gt} \sigma (\textsc{AnimHusb}{}) {\gt} \cdots {\gt} \sigma (\textsc{RubyEcon}{}) = 570. \]

\(\textsc{FurnRush}{}\) has the highest aggregate payoff; \(\textsc{RubyEcon}{}\) the lowest.

Proof

By computing all \(8\) row sums and comparing.

Theorem 9.16 Furnishing rush highest row sum

\(\forall \, s,\; \sigma (\textsc{FurnRush}{}) \ge \sigma (s)\).

Proof

Direct from the row sum ordering.

Theorem 9.17 Total game value

The sum of all row sums is \(5595\). The average payoff per cell is \(5595 / 64 = 87\).

Proof

By computation.

9.6 Price of anarchy

Theorem 9.18 Nash welfare
#

\(\text{nashWelfare} = 170\) (both players score \(85\) in the mirror).

Proof

\(M_{0,0} + M_{0,0} = 85 + 85 = 170\).

Theorem 9.19 Social optimum

\(\text{socialOptimumValue} = 210\), achieved by pairing strategies that avoid contention.

Proof

By checking all \(64\) social welfare values.

Theorem 9.20 Price of anarchy

\(\text{socialOptimumValue} {\gt} \text{nashWelfare}\): i.e., \(210 {\gt} 170\). The price of anarchy ratio is \(21/17 \approx 1.24\). Rational play sacrifices \(\sim 19\% \) of social welfare.

Proof

\(210 {\gt} 170\) and \(210 \times 17 = 3570 = 170 \times 21\).

\begin{tikzpicture} [
  bar/.style={rounded corners=3pt, minimum width=1.6cm, anchor=south west,
              font=\small\bfseries, text=textDark, inner sep=0pt},
]
% Axes
\draw[thick, ->, color=textDark] (0,0) -- (5,0);
\draw[thick, ->, color=textDark] (0,0) -- (0,4.8);
\node[font=\footnotesize, text=textDark, anchor=east] at (-0.1, 4.5) {welfare};
% Nash bar
\fill[pastelSky, rounded corners=3pt] (0.8, 0) rectangle (2.4, 3.4);
\node[font=\small\bfseries, text=textDark] at (1.6, 1.7) {170};
\node[font=\footnotesize, text=textDark, anchor=north] at (1.6, -0.15) {Nash};
% Social optimum bar
\fill[pastelMint, rounded corners=3pt] (2.8, 0) rectangle (4.4, 4.2);
\node[font=\small\bfseries, text=textDark] at (3.6, 2.1) {210};
\node[font=\footnotesize, text=textDark, anchor=north] at (3.6, -0.15) {Social opt.};
% Gap annotation
\draw[accentAmber, thick, <->] (4.6, 3.4) -- (4.6, 4.2);
\node[font=\scriptsize, text=accentAmber, anchor=west] at (4.7, 3.8) {$\Delta = 40$};
% Ratio
\node[font=\scriptsize, text=textDark, anchor=west] at (4.7, 3.3) {PoA $= 21/17$};
\node[font=\scriptsize, text=textDark, anchor=west] at (4.7, 2.9) {$\approx 19\%$ loss};
% Gridlines
\foreach \y/\v in {1.0/50, 2.0/100, 3.0/150, 4.0/200} {
  \draw[pastelSlate, thin, dashed] (0.4, \y) -- (4.6, \y);
  \node[font=\tiny, text=textDark, anchor=east] at (0.35, \y) {\v};
}
\end{tikzpicture}
Figure 9.2 Nash welfare (\(170\)) vs. social optimum (\(210\)). Rational play sacrifices \(19\% \) of total welfare, yielding a price of anarchy of \(21/17\).

9.7 Contention penalties

Theorem 9.21 Furnishing contention penalty

\(M_{0,0} = 85\), \(M_{0,1} = 130\), \(M_{0,2} = 135\). The \(\textsc{FurnRush}{}\) mirror (\(85\)) is the worst \(\textsc{FurnRush}{}\) outcome, showing the contention cost of both players racing for the same furnishings.

Proof

By reading matrix entries.

Theorem 9.22 Asymmetry bounds

The maximum payoff asymmetry is \(70\): \(\forall \, i\, j,\; |M_{i,j} - M_{j,i}| \le 70\). Among non-\(\textsc{FurnRush}{}\) pairs, asymmetry is at most \(35\).

Proof

By checking all off-diagonal pairs.

9.8 Score bounds from dominance

Theorem 9.23 Dominant strategy safety margin

\(\text{practicalFloor} - \text{doNothingScore} = 115\). Even in the worst case, \(\textsc{FurnRush}{}\) scores \(115\) points above the do-nothing catastrophe.

Proof

\(60 - (-55) = 115\).

Theorem 9.24 Dominant strategy variance
#

\(\text{practicalCeiling} - \text{practicalFloor} = 80\). The score range of \(\textsc{FurnRush}{}\) spans \(80\) points depending on matchup.

Proof

\(140 - 60 = 80\).