Modelling of Boss Attacks as Markov Chains

A Markov Chain is a way of calculating the results of a random process. You begin in a state, the process acts on that state, and the resulting vector is the probability you will be in each state after the action. This is a simple way of looking at a Markov chain. My character is named after such processes, and coincidentally, they are valuable tools for evaluating tank survivability. Allow me to explain how to construct a transition matrix for an incoming attack, and then how to use this to find your survival.

Building the Matrix

The first thing you should consider in this endeavor is what your states will be. A state should have no memory. That is, it doesn’t matter how you got here, it only matters that you are here now. For this purpose, I use health values. Thus, the matrix for our Markov chain should take us from current health to health after the attack. This seems reasonable.

How the matrix transitions is somewhat easy to describe, if a bit more difficult to calculate. Let’s put max health at the bottom right of the matrix, and death at the top left. Since this is a Markov chain, the entries in the matrix should look like this:M_{ij}=P(X_{1}=j|X_0=i) Which reads as, “the entry in the ith column and jth row is the probability of ending up in j given that you started at i.” Since the boss’ damage will be what causes the transition, we can figure out that damage=i-j.

The structure of the matrix is pretty simple, but changes a bit based on class. Druid is the simplest, since they can only be hit normally, or avoid the attack completely. Their matrix would look like this:

Incoming attacks for a druid are relatively simple

Incoming attacks for a druid are relatively simple

There is a line down the diagonal for avoidance and a stripe for hits, which is spread out because of the natural variance of boss attacks. Note that the hits pile up in the top row, since the attacks that deal greater damage than your current health simply reduce you to 0, instead. Similarly, we can construct a matrix for warriors, which will have a the same structure with added stripes for block and critical block.

Warriors are similar to druids, with block spreading out incoming attacks over a wider range.

Warriors are similar to druids, with block spreading out incoming attacks over a wider range.

We can imagine a paladin matrix would have a shape similar to warrior, without critical block. We’d have to take into account the effect of Ardent Defender which just changes the slope of those stripes when you are transitioning to below 35% health.

Constructing this matrix can take some time. A program like Matlab can handle a lot of it for you, but you will want to approximate the matrix by using % health, or something similar. If you use absolute health, you end up with upwards of a 50000 by 50000 matrix. This would take a very long time to calculate and use. A considerable understanding of theorycraft will be needed to accurately build the matrix, but it can be worth the effort.

Traits of the Matrix

We note that the matrix will have a certain “shape,” as shown above. Different sorts of attacks may take on different traits. A spell, for example, will cue off of your resistances. Additionally, some attacks cannot be blocked, dodged, or parried, and the line down the middle of the matrix will disappear under this rule. For all attack matrices, though, only the upper half will have anything, because the lower half would represent healing.

From a mathematical standpoint, we note that the matrix is a linear map in upper triangular form, and that the eigenvalues of the operator exist on the diagonal. As a result, the vector of the system with the largest eigenvector is the death vector (health = 0) with an eigenvalue of 1. As a result, as the matrix is taken to higher powers, the result is certain death. In other words, if you took an infinite number of attacks with no healing, you would die. This is not particularly interesting, but it does match with what we know about damage.

Another note is that the columns of the matrix all have a sum of 1. An interesting note is that the product of any two matrices with that property will also have columns with a sum of 1. We will use that later when we consider the meaning of specific columns.

Using the Matrix

We want to construct a chain of attacks, and determine if we will live through them. Suppose we were taking the same attack over and over and over again. Then, for n attacks, the transition matrix T over the whole set would be T=M^n. Assuming we start with max health at the beginning of the assault, the last column of T will hold the probability distribution for your health after those attacks. Indeed, the most important value is the upper right-hand value, since P_{death}=T_{max,0} With this in mind, the minimum number of attacks to take you from full to dead is found by finding the minimum value of n such that the upper right value of T is non-zero.

What if we wanted to construct a more interesting set of attacks? Suppose we had a string of n (potentially different) incoming attacks. Once again, we find that T=M_nM_{n-1}M_{n-2} ... M_1. The same conclusion about the probability of death comes in, but now we can have a variety of attacks, like DoTs and spells, thrown into the mix.

Another way to use this is to consider your healers in the equation. Suppose your healers were only healing you when were below 100%. Then we can consider a chain of attacks as starting with the first hit. To do this, reconstruct M with no avoidance, and use that version of M as the first attack in the chain, and follow with n of the original M matrix. That will give you how many attacks after the first hit you can take.

Alternatively, we could construct a healing matrix. In this case, the diagonal would represent your healers not casting a spell before the next incoming attack. Naturally, you would be more likely to receive a heal assuming you started at a very low amount of health, because of talents like Nature’s Swiftness. You could then treat this matrix like another attack that shows up periodically, except that it increases health instead of decreasing it.

Concluding Remarks

As I said in an earlier post, tanks are more interested in distributions than averages. This method of determining the results of boss attacks ultimately gives you the distribution of such attacks, assuming the matrix is built correctly. As a result, you can truly get an accurate picture of your survival.

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>