This is a model of combination therapy. Michael Lee claims there is a synergistic effect, but this model produces the same behaviour with simpler assumptions.

 
 

Code in Processing, its javascript variant p5

var grey;
var sky;

var cream;
var sea;
var yellow;
var pink;
var berry;
var berry2;

var fontSize;
var splash;
var landscape;

var CHOOSE = 0;
var DOX = 1;
var ERL = 2;
var BOTH = 3;
var PAUSE = 4;
var state = CHOOSE;

var WILD = 0;
var DOXSENSITIVE = 1;
var ERLSENSITIVE = 2;

var space;
var XSCALE;
var YSCALE;
var SCALE;

var PAUSEDURATION = 0;

var kill1 = 0;
var kill2 = 0;
var kill3 = 0;
var rate = 0;
var choice;

function preload() {
  splash = loadImage("splash.jpg");
  landscape = loadImage("land.jpg");
}

function setup() {
  grey = color(190, 195, 195, 100);
  sky = color(90, 175, 225, 100);
  
  cream = color(254, 254, 254);
  sea = color(87, 132, 137);
  yellow = color(244, 176, 39);
  pink = color(191, 151, 178);
  
  berry = color(220, 77, 11);
  berry2 = color(220, 77, 11, 100);
  
  choice = grey;

  canvas = createCanvas(.9 * windowWidth, .9 * windowHeight);
  XSCALE = 1.0 * width / splash.width;
  YSCALE = 1.0 * height / splash.height;
  SCALE = min(XSCALE, YSCALE);
  fontSize = floor(40 * SCALE);
  textFont("Futura", fontSize);

  //smooth();

  space = new Space();
  frameRate(10);
}

function draw() {
  if (state === CHOOSE) offer();
  else runSim();
}

function runSim() {
  background(landscape);

  space.grow();
  var begin = space.cells.length;
  space.kill();

  if (!space.cancerDetected()) space.test();
  if (space.cancerDetected()) space.treat();

  var end = space.cells.length;
  if (!space.finished()) {
    kill1 = kill2;
    kill2 = kill3;
    kill3 = begin - end;
    rate = floor(100.0 * (kill1 + kill2 + kill3) / (kill1 + kill2 + kill3 + end));
  }

  space.drawSpace();

  inform(rate);
}

function inform(rate) {
  fill(255, 170);
  rectMode(CENTER);
  rect(0.85 * width - 60 * XSCALE, 0.9 * height, 400 * XSCALE, fontSize * 1.8, 5 * SCALE);

  fill(choice);
  textAlign(CENTER, CENTER);
  text("apoptosis " + rate + " in 100 cells", 0.85 * width - 60 * XSCALE, 0.9 * height);
}

function offer() {
  background(splash);
}

function mouseReleased() {
  if (state != CHOOSE) {
    if (space.finished()) restart();
    return 0;
  }

  PAUSEDURATION = 0;

  choice = splash.get(mouseX / XSCALE, mouseY / YSCALE);

  var margin = 30;
  if (colorDistance(choice, yellow) < margin) state = ERL;
  else if (colorDistance(choice, pink) < margin) state = DOX;
  else if (colorDistance(choice, berry) < margin) state = BOTH;
  else if (colorDistance(choice, sea) < margin) {
    state = PAUSE;
    PAUSEDURATION = 100;
  }
  return 0;
}

function restart() {
  space.clear();
  state = CHOOSE;
  choice = grey;
  space.seed();
}

function colorDistance(a, b) {
  return abs(red(a) - red(b)) + abs(green(a) - green(b)) + abs(blue(a) - blue(b));
}

function Cell(v, a) {
  this.Drift = 50 * SCALE;
  this.location = createVector(v.x + random(-this.Drift / 2, this.Drift / 2), v.y + random(-this.Drift / 2, this.Drift / 2));
  this.age = a;
  this.type = WILD;

  var celCol = landscape.get(this.location.x / XSCALE, this.location.y / YSCALE);
  var distCream = colorDistance(celCol, cream);
  var distYellow = colorDistance(celCol, yellow);
  var distPink = colorDistance(celCol, pink);

  if (distYellow < min(distPink, distCream, 200)) this.type = ERLSENSITIVE;
  else if (distPink < min(distYellow, distCream, 200)) this.type = DOXSENSITIVE;
  else this.type = WILD;
  if (null === celCol) {
    this.type = WILD;
  }

  this.mature = function() {
    this.age += 0.5 + random(1);
  };

  this.drawCell = function() {
    fill(sky);
    ellipse(this.location.x, this.location.y, 20 * SCALE, 20 * SCALE);
  };

  this.killCell = function() {
    fill(berry2);
    ellipse(this.location.x, this.location.y, 20 * SCALE, 20 * SCALE);
  };
}

function Space() {
  this.Mature = 18;
  this.cells = [];
  this.detected = false;
  this.treatmentTime = 0;

  this.seed = function() {
    for (var i = 0; i < 3000; i++) {
      var locale = createVector(random(width), random(height));
      var cell = new Cell(locale, random(this.Mature));
      this.cells.push(cell);
    }
  }

  this.seed();

  this.clear = function() {
    for (var i = this.cells.length - 1; i >= 0; i--) {
      this.cells.splice(i, 1);
    }
    this.detected = false;
    this.treatmentTime = 0;
  };

  this.test = function() {
    if (this.cells.length > 3000) this.detected = true;
  };

  this.cancerDetected = function() {
    return this.detected;
  };

  this.grow = function() {
    for (var i = this.cells.length - 1; i >= 0; i--) {
      this.cells[i].mature();
      if (this.cells[i].age > this.Mature) {
        var child = new Cell(this.cells[i].location, 0);
        this.cells.push(child);
      }
    }
  };

  this.kill = function() {
    for (var i = this.cells.length - 1; i >= 0; i--) {
      if (random(1) > .5) {
        if (WILD === this.cells[i].type || random(30) < 1) {
          this.cells[i].killCell();
          this.cells.splice(i, 1);
        }
      }
    }
  };

  this.treat = function() {
    if (state != DOX) this.treatERL();
    if (this.treatmentTime >= PAUSEDURATION && state != ERL) this.treatDOX();
    this.treatmentTime++;
  };

  this.treatERL = function() {
    for (var i = this.cells.length - 1; i >= 0; i--) {
      if (ERLSENSITIVE === this.cells[i].type && random(45) < 1) {
        this.cells[i].killCell();
        this.cells.splice(i, 1);
      }
    }
    fill(255, 170);
    rectMode(CENTER);
    rect(0.15 * width + 50 * SCALE, .1 * height, 400 * SCALE, fontSize * 1.8, 5 * SCALE);

    fill(yellow);
    textAlign(CENTER, CENTER);
    text("erlotinib applied", 0.15 * width + 50 * SCALE, 0.1 * height);
  };

  this.treatDOX = function() {
    for (var i = this.cells.length - 1; i >= 0; i--) {
      if (DOXSENSITIVE === this.cells[i].type && random(7) < 1) {
        this.cells[i].killCell();
        this.cells.splice(i, 1);
      }
    }
    fill(255, 170);
    rectMode(CENTER);
    rect(0.15 * width + 50 * SCALE, 0.2 * height, 400 * SCALE, fontSize * 1.8, 5 * SCALE);

    fill(pink);
    textAlign(CENTER, CENTER);
    text("doxorubicin applied", 0.15 * width + 50 * SCALE, 0.2 * height);
  };

  this.finished = function() {
    return this.treatmentTime > PAUSEDURATION + 4;
  };

  this.drawSpace = function() {
    ellipseMode(RADIUS);
    noStroke();
    for (var i = this.cells.length - 1; i >= 0; i--) {
      this.cells[i].drawCell();
    }
  };
}