Skip to content

Instantly share code, notes, and snippets.

@hraftery
Created June 27, 2021 19:52
Show Gist options
  • Save hraftery/ff386538a50cd4834608dc0a34a2d24f to your computer and use it in GitHub Desktop.
Save hraftery/ff386538a50cd4834608dc0a34a2d24f to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Production Efficiency\n",
"\n",
"Some simulations to help drive a deeper understanding of the far reaching insights in the excellent \"Construction, Efficiency, and Production Systems\" article by Brian Potter. Mr Potter's article is published [here](https://constructionphysics.substack.com/p/construction-efficiency-and-production).\n",
"\n",
"\n",
"Start with some imports and environment establishment."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"#import matplotlib\n",
"#matplotlib.use('Qt5Agg') #use Qt5 as backend, seems to make plot bigger and slower, and not much else\n",
"\n",
"from matplotlib import animation, pyplot as plt\n",
"import math\n",
"import numpy as np\n",
"\n",
"from IPython.display import HTML\n",
"\n",
"test = True"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Class: Production Step\n",
"\n",
"Now define a class that represents a single step in a production line, called **ProductionStep**. It has a variable *step time*, with optional *randomness*. When the line starts it will draw a job from its *in tray*, work on it, and when complete, add it to its *out tray*."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Average time = 1\n",
"InTrayCount = 99, OutTrayCount = 0.6.\n",
"InTrayCount = 100, OutTrayCount = 0.6.\n",
"InTrayCount = 99, OutTrayCount = 1.2.\n",
"InTrayCount = 99, OutTrayCount = 1.7999999999999998.\n",
"InTrayCount = 98, OutTrayCount = 2.4.\n"
]
}
],
"source": [
"class ProductionStep:\n",
" def __init__(self, averageStepTime, standardDeviation, inTrayCount=0):\n",
" self.initialAverageStepTime = averageStepTime\n",
" self.initialStandardDeviation = standardDeviation\n",
" self.initialOutTrayCount = 0.0\n",
" self.initialInTrayCount = inTrayCount\n",
" self.Reset()\n",
" \n",
" def Reset(self):\n",
" self.averageStepTime = self.initialAverageStepTime\n",
" self.standardDeviation = self.initialStandardDeviation\n",
" self.outTrayCount = self.initialOutTrayCount\n",
" self.inTrayCount = self.initialInTrayCount\n",
" \n",
" def AttemptDrawFromInTray(self, timeDelta):\n",
" if self.inTrayCount >= 1: # There's input available, so\n",
" self.inTrayCount -= 1 # draw on it, and calculate the stepTime to be used for this step.\n",
" # stepTime is average +/- std dev, but we limit on the low end by the resolution allowed\n",
" # by the timeDelta, minus a millisecond, so we can't do an entire step in one timeDelta.\n",
" # \n",
" self.currentStepTime = max(timeDelta-0.001, self.averageStepTime + np.random.randn() * self.standardDeviation)\n",
" return True\n",
" else: # Otherwise there's no input available, so\n",
" return False # indicate failure\n",
" \n",
" def RunForTime(self, timeDelta):\n",
" # Return whether we started or finished a job. Assume not by default and override if we do.\n",
" didDrawFromInTray = False\n",
" didAddToOutTray = False\n",
" \n",
" completeOutTrayCount = math.floor(self.outTrayCount)\n",
" \n",
" if (self.outTrayCount == completeOutTrayCount): # No work-in-progress, so need to draw from InTray\n",
" if self.AttemptDrawFromInTray(timeDelta):\n",
" didDrawFromInTray = True\n",
" else:\n",
" return (False, False) # No input available, so blocked with nothing to do\n",
" \n",
" self.outTrayCount += timeDelta / self.currentStepTime\n",
" newCompleteOutTrayCount = math.floor(self.outTrayCount)\n",
" if completeOutTrayCount < newCompleteOutTrayCount: # There's a new complete output, so\n",
" didAddToOutTray = True\n",
" if self.AttemptDrawFromInTray(timeDelta): # if there's input available use it to start the new work-in-progress.\n",
" didDrawFromInTray = True\n",
" else:\n",
" self.outTrayCount = newCompleteOutTrayCount # Otherwise there's no input left and so abort the work-in-progress.\n",
" \n",
" return (didDrawFromInTray, didAddToOutTray)\n",
" \n",
" def AddToInTray(self):\n",
" self.inTrayCount += 1\n",
"\n",
" def SetInTrayCount(self, count):\n",
" self.inTrayCount = count\n",
"\n",
" def AttemptRemoveFromOutTray(self):\n",
" if self.outTrayCount >= 1.0:\n",
" self.outTrayCount -= 1.0\n",
" return True\n",
" else:\n",
" return False\n",
"\n",
"if test:\n",
" stepTest = ProductionStep(1, 0, 100)\n",
"\n",
" aveTime = 1\n",
" stdDev = 0.5\n",
"\n",
" step1 = ProductionStep(aveTime, stdDev, 10000)\n",
" step2 = ProductionStep(aveTime, stdDev)\n",
" step3 = ProductionStep(aveTime, stdDev)\n",
" step4 = ProductionStep(aveTime, stdDev)\n",
"\n",
" print(f\"Average time = {stepTest.averageStepTime}\")\n",
" stepTest.RunForTime(0.6)\n",
" print(f\"InTrayCount = {stepTest.inTrayCount}, OutTrayCount = {stepTest.outTrayCount}.\")\n",
" stepTest.AddToInTray()\n",
" print(f\"InTrayCount = {stepTest.inTrayCount}, OutTrayCount = {stepTest.outTrayCount}.\")\n",
" stepTest.RunForTime(0.6)\n",
" print(f\"InTrayCount = {stepTest.inTrayCount}, OutTrayCount = {stepTest.outTrayCount}.\")\n",
" stepTest.RunForTime(0.6)\n",
" print(f\"InTrayCount = {stepTest.inTrayCount}, OutTrayCount = {stepTest.outTrayCount}.\")\n",
" stepTest.RunForTime(0.6)\n",
" print(f\"InTrayCount = {stepTest.inTrayCount}, OutTrayCount = {stepTest.outTrayCount}.\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Class: Production Line\n",
"\n",
"Then all we need to create a *ProductionLine*, is a class that contains a list of *ProductionSteps* and the ability to *RunForTime*."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-----\n",
"Step 0: InTrayCount = 10000, OutTrayCount = 0.0.\n",
"Step 1: InTrayCount = 0, OutTrayCount = 0.0.\n",
"Step 2: InTrayCount = 0, OutTrayCount = 0.0.\n",
"Step 3: InTrayCount = 0, OutTrayCount = 0.0.\n",
"-----\n",
"Step 0: InTrayCount = 9999, OutTrayCount = 0.4591203505419752.\n",
"Step 1: InTrayCount = 0, OutTrayCount = 0.0.\n",
"Step 2: InTrayCount = 0, OutTrayCount = 0.0.\n",
"Step 3: InTrayCount = 0, OutTrayCount = 0.0.\n",
"-----\n",
"Step 0: InTrayCount = 9999, OutTrayCount = 0.9182407010839504.\n",
"Step 1: InTrayCount = 0, OutTrayCount = 0.0.\n",
"Step 2: InTrayCount = 0, OutTrayCount = 0.0.\n",
"Step 3: InTrayCount = 0, OutTrayCount = 0.0.\n",
"-----\n",
"Step 0: InTrayCount = 9998, OutTrayCount = 0.3773610516259256.\n",
"Step 1: InTrayCount = 1, OutTrayCount = 0.0.\n",
"Step 2: InTrayCount = 0, OutTrayCount = 0.0.\n",
"Step 3: InTrayCount = 0, OutTrayCount = 0.0.\n",
"-----\n",
"Step 0: InTrayCount = 9997, OutTrayCount = 0.2167165806387228.\n",
"Step 1: InTrayCount = 1, OutTrayCount = 0.7889943784749427.\n",
"Step 2: InTrayCount = 0, OutTrayCount = 0.0.\n",
"Step 3: InTrayCount = 0, OutTrayCount = 0.0.\n"
]
}
],
"source": [
"class ProductionLine:\n",
" def __init__(self, initialSteps = []):\n",
" self.steps = initialSteps\n",
" self.Reset()\n",
" \n",
" def Reset(self):\n",
" for step in self.steps:\n",
" step.Reset()\n",
" self.elapsedTime = 0\n",
" self.lineEntryTimes = []\n",
"\n",
" def AddStep(self, step):\n",
" self.steps.append(step)\n",
" \n",
" def RunForTime(self, timeDelta):\n",
" # Do last step first\n",
" lastStep = self.steps[-1]\n",
" _, lastStepAddedToOutTray = lastStep.RunForTime(timeDelta)\n",
" \n",
" # Then all the middle steps in reverse order\n",
" nextStep = lastStep\n",
" for step in reversed(self.steps[:-1]):\n",
" firstStepDrewFromInTray, _ = step.RunForTime(timeDelta)\n",
" if nextStep.inTrayCount < 1 and step.AttemptRemoveFromOutTray():\n",
" nextStep.AddToInTray()\n",
" nextStep = step\n",
" \n",
" if firstStepDrewFromInTray: # then mark the point in time that a job entered the line\n",
" self.lineEntryTimes.append(self.elapsedTime) # In tray draws happen at the start of the time delta\n",
" self.elapsedTime += timeDelta # Out tray adds happen during the time delta. Close enough to the end.\n",
" if lastStepAddedToOutTray:\n",
" return self.elapsedTime - self.lineEntryTimes.pop(0)\n",
" else:\n",
" return None\n",
" \n",
" def GetNumSteps(self):\n",
" return len(self.steps)\n",
" \n",
" def GetOutTrayCounts(self):\n",
" ret = []\n",
" for step in self.steps:\n",
" ret.append(step.outTrayCount)\n",
" return ret\n",
" \n",
" def GetWIP(self):\n",
" wip = 0\n",
" for step in self.steps[1:]:\n",
" wip += step.inTrayCount\n",
" for step in self.steps[:-1]:\n",
" wip += math.ceil(step.outTrayCount)\n",
" return wip\n",
" \n",
" def Print(self):\n",
" print(\"-----\")\n",
" for i, step in enumerate(self.steps):\n",
" print(f\"Step {i}: InTrayCount = {step.inTrayCount}, OutTrayCount = {step.outTrayCount}.\")\n",
"\n",
"if test:\n",
" line = ProductionLine([step1, step2, step3, step4])\n",
"\n",
" line.Print()\n",
" line.RunForTime(0.6)\n",
" line.Print()\n",
" line.RunForTime(0.6)\n",
" line.Print()\n",
" line.RunForTime(0.6)\n",
" line.Print()\n",
" line.RunForTime(0.6)\n",
" line.Print()\n",
"\n",
" # For the \"stdDev = 0\" scenario, should end with:\n",
" # Step 0: InTrayCount = 9997, OutTrayCount = 0.3999999999999999.\n",
" # Step 1: InTrayCount = 1, OutTrayCount = 0.0.\n",
" # Step 2: InTrayCount = 1, OutTrayCount = 0.0.\n",
" # Step 3: InTrayCount = 0, OutTrayCount = 0.0."
]
},
{
"attachments": {
"0bac45d1-fcc2-4d55-b5aa-d3812417f8df.png": {
"image/png": "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"
}
},
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"# Action!\n",
"\n",
"Okay, the environment is ready and all classes are created. Time to run the production line.\n",
"\n",
"Let's start with the first example from the article:\n",
"\n",
"![https___bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com_public_images_eaf811d3-8f1e-4963-ab3a-733ac90420fc_1142x235.png](attachment:0bac45d1-fcc2-4d55-b5aa-d3812417f8df.png)\n",
"\n",
"Let's visualise the *Out Tray* for each *ProductionStep* in the *ProductionLine*. For the sake of simulation, each *In Tray* starts at zero, except the first Step, which has an essentially unlimited *In Tray*."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD8CAYAAABuHP8oAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAL2ElEQVR4nO3dfYxld13H8ffHrlS7Rah2RNoiW0NtQxAFBqHUqFAwhRqrsQklUorB7B+GhxobWYMBE2PSGGMwRkw2FfuHpDWWqk0xaAOtRCm109JQ+gQNLtgH3KkaHoxpu/brH3OQ6djdmb3nzL3z3X2/ksnce+fce7731/Y9Z07vnUlVIUnq5zsWPYAkaTYGXJKaMuCS1JQBl6SmDLgkNWXAJampTQOe5MNJDib5/LrbvjfJTUm+OHw+ZXvHlCRttJUj8KuBCzbctg/4RFWdBXxiuC5JmqNs5Y08SfYAN1bVS4brDwA/XVWPJnk+cEtVnb2tk0qSnmbXjPd7XlU9Olz+KvC8w22YZC+wF2D37t2vOOecc2bcpaSu7n74a4seYaF+5PTnjLr/HXfc8VhVLW28fdaA/5+qqiSHPYyvqv3AfoDl5eVaWVkZu0tJzezZ97FFj7BQK1deOOr+Sb78TLfP+iqUfxtOnTB8PjjrYJKk2cwa8BuAy4bLlwF/M804kqSt2srLCK8BbgXOTvJQkncAVwJvSPJF4PXDdUnSHG16Dryq3nKYL50/8SySpKPgOzElqSkDLklNGXBJasqAS1JTBlySmjLgktSUAZekpgy4JDVlwCWpKQMuSU0ZcElqyoBLUlMGXJKaMuCS1JQBl6SmDLgkNWXAJakpAy5JTRlwSWrKgEtSUwZckpoy4JLUlAGXpKYMuCQ1ZcAlqSkDLklNGXBJasqAS1JTBlySmjLgktSUAZekpgy4JDVlwCWpKQMuSU0ZcElqalTAk/xaknuSfD7JNUm+a6rBJElHNnPAk5wOvBtYrqqXACcAl0w1mCTpyMaeQtkFfHeSXcBJwCPjR5IkbcXMAa+qh4HfB74CPAp8rar+fuN2SfYmWUmysrq6OvukkqSnGXMK5RTgIuBM4DRgd5K3btyuqvZX1XJVLS8tLc0+qSTpacacQnk98C9VtVpVTwLXA6+ZZixJ0mbGBPwrwKuTnJQkwPnAfdOMJUnazJhz4LcB1wF3AncPj7V/orkkSZvYNebOVfUB4AMTzSJJOgq+E1OSmjLgktSUAZekpgy4JDVlwCWpKQMuSU0ZcElqyoBLUlMGXJKaMuCS1JQBl6SmDLgkNWXAJakpAy5JTRlwSWrKgEtSUwZckpoy4JLUlAGXpKYMuCQ1ZcAlqSkDLklNGXBJasqAS1JTBlySmjLgktSUAZekpgy4JDVlwCWpKQMuSU0ZcElqyoBLUlMGXJKaMuCS1NSogCd5bpLrktyf5L4k5041mCTpyHaNvP8fAh+vqouTPAs4aYKZJElbMHPAkzwH+Eng7QBV9QTwxDRjSZI2M+YUypnAKvBnST6b5KokuzdulGRvkpUkK6urqyN2J0lab0zAdwEvB/6kql4G/Bewb+NGVbW/qparanlpaWnE7iRJ640J+EPAQ1V123D9OtaCLkmag5kDXlVfBf41ydnDTecD904ylSRpU2NfhfIu4CPDK1C+BPzy+JEkSVsxKuBVdRewPM0okqSj4TsxJakpAy5JTRlwSWrKgEtSUwZckpoy4JLUlAGXpKYMuCQ1ZcAlqSkDLklNGXBJasqAS1JTBlySmjLgktSUAZekpgy4JDVlwCWpKQMuSU0ZcElqyoBLUlMGXJKaMuCS1JQBl6SmDLgkNWXAJakpAy5JTRlwSWrKgEtSUwZckpoy4JLUlAGXpKYMuCQ1ZcAlqSkDLklNGXBJamp0wJOckOSzSW6cYiBJ0tZMcQT+HuC+CR5HknQURgU8yRnAhcBV04wjSdqqsUfgHwR+A3jqcBsk2ZtkJcnK6urqyN1Jkr5l5oAn+VngYFXdcaTtqmp/VS1X1fLS0tKsu5MkbTDmCPw84OeSHACuBV6X5M8nmUqStKmZA15Vv1lVZ1TVHuAS4JNV9dbJJpMkHZGvA5ekpnZN8SBVdQtwyxSPJUnaGo/AJakpAy5JTRlwSWrKgEtSUwZckpoy4JLUlAGXpKYMuCQ1ZcAlqSkDLklNGXBJasqAS1JTBlySmjLgktSUAZekpgy4JDVlwCWpKQMuSU0ZcElqyoBLUlMGXJKaMuCS1JQBl6SmDLgkNWXAJakpAy5JTRlwSWrKgEtSUwZckpoy4JLUlAGXpKYMuCQ1ZcAlqSkDLklNzRzwJC9IcnOSe5Pck+Q9Uw4mSTqyXSPuewj49aq6M8mzgTuS3FRV9040myTpCGY+Aq+qR6vqzuHyN4D7gNOnGkySdGSTnANPsgd4GXDbM3xtb5KVJCurq6tT7E6SxAQBT3Iy8FHg8qr6+savV9X+qlququWlpaWxu5MkDUYFPMl3shbvj1TV9dOMJEnaijGvQgnwp8B9VfUH040kSdqKMUfg5wGXAq9Lctfw8aaJ5pIkbWLmlxFW1T8CmXAWSdJR8J2YktSUAZekpgy4JDVlwCWpKQMuSU0ZcElqyoBLUlMGXJKaMuCS1JQBl6SmDLgkNWXAJakpAy5JTRlwSWrKgEtSUwZckpqa+Q86qJc9+z626BEW6sCVFy56BGlyHoFLUlMegUtb4E8w/gSzE3kELklNGXBJasqAS1JTBlySmjLgktSUAZekpgy4JDVlwCWpKQMuSU0ZcElqyoBLUlMGXJKaMuCS1JQBl6SmDLgkNWXAJampUQFPckGSB5I8mGTfVENJkjY381/kSXIC8MfAG4CHgNuT3FBV90413Hr+RRT/IoqkpxtzBP7jwINV9aWqegK4FrhomrEkSZtJVc12x+Ri4IKq+pXh+qXAq6rqnRu22wvsHa6eDTww+7gLdSrw2KKHaMz1G8f1G6f7+r2wqpY23rjtf9S4qvYD+7d7P9styUpVLS96jq5cv3Fcv3GO1fUbcwrlYeAF666fMdwmSZqDMQG/HTgryZlJngVcAtwwzViSpM3MfAqlqg4leSfwd8AJwIer6p7JJtt52p8GWjDXbxzXb5xjcv1m/p+YkqTF8p2YktSUAZekpo6rgCd5X5J7knwuyV1JXjXcfnmSkybaxzlJbk3yeJIrpnjMnWJO6/dLw+PfneTTSX50isfdCea0fhete/yVJD8xxePuBPNYv3X7emWSQ8P7XXauqjouPoBzgVuBE4frpwKnDZcPAKdOtJ/vB14J/C5wxaKfd8P1ew1wynD5jcBti37uzdbvZL79/7ZeCty/6Ofeaf2GxzsB+CTwt8DFi37uR/o4no7Anw88VlWPA1TVY1X1SJJ3A6cBNye5GSDJzwxH0Xcm+cskJw+3H0jye8PR4T8nedHGnVTVwaq6HXhyfk9tLua1fp+uqv8crn6GtfcXHAvmtX7frKFCwG7gWHmVwlzWb/Au4KPAwe1/WiMt+jvIvD5YOzK5C/gC8CHgp9Z97QDDd3DWvrN/Ctg9XH8v8P51271vuPw24MYj7O+3ObaOwOe6fsM2VwBXLfq5d1s/4BeA+4H/AM5d9HPvtH7A6cA/sHZ6+Wo8At8ZquqbwCtY+70sq8BfJHn7M2z6auDFwD8luQu4DHjhuq9fs+7zuds1704z7/VL8lrgHaz9B9jePNevqv6qqs4Bfh74nQnGX7g5rt8HgfdW1VOTDL7Ntv13oewkVfU/wC3ALUnuZu0f7tUbNgtwU1W95XAPc5jLx7x5rV+SlwJXAW+sqn8fM/NOMu9//6rqU0l+KMmpVdX5FzkBc1u/ZeDaJLB2NP+mJIeq6q9nn3z7HDdH4EnOTnLWupt+DPjycPkbwLOHy58BzvvW+bEku5P88Lr7vXnd51u3b+KdZV7rl+QHgeuBS6vqC9M9g8Wa4/q9KEN9krwcOBFo/01wXutXVWdW1Z6q2gNcB/zqTo03HF9H4CcDf5TkucAh4EG+/Wtu9wMfT/JIVb12+NHsmiQnDl//LdbOvQGckuRzwOPA//sun+QHgBXge4CnklwOvLiqvr4tz2p+5rJ+wPuB7wM+NHToUB0bv0VuXuv3i8DbkjwJ/Dfw5hpO7jY3r/VrxbfSH4UkB4DlY+HH0UVw/cZx/cY5FtfvuDmFIknHGo/AJakpj8AlqSkDLklNGXBJasqAS1JTBlySmvpfkwl67HNue5kAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"aveTime = 1\n",
"stdDev = 0.0\n",
"\n",
"step1 = ProductionStep(aveTime, stdDev, 10000)\n",
"step2 = ProductionStep(aveTime, stdDev)\n",
"step3 = ProductionStep(aveTime, stdDev)\n",
"step4 = ProductionStep(aveTime, stdDev)\n",
"\n",
"line = ProductionLine([step1, step2, step3, step4])\n",
"\n",
"barX = []\n",
"barY = []\n",
"\n",
"for i in range(line.GetNumSteps()):\n",
" barX.append(f\"Step {i+1}\")\n",
" barY.append(0)\n",
"\n",
"fig = plt.figure()\n",
"ax = plt.axes(ylim=(0, 10))\n",
"\n",
"d1 = ax.bar(barX, barY)\n",
"\n",
"#plt.xticks(rotation=45, ha=\"right\", rotation_mode=\"anchor\") #rotate the x-axis values\n",
"#plt.subplots_adjust(bottom = 0.2, top = 0.9) #make the x-axis labels fit in the screen\n",
"\n",
"#plt.bar(barX, barY)\n",
"\n",
"def NextAnimationFrame(fi):\n",
" global line\n",
" line.RunForTime(0.08)\n",
" barY = line.GetOutTrayCounts()\n",
" for i, di in enumerate(d1):\n",
" di.set_height(barY[i])\n",
" return [d1]\n",
"\n",
"simulationTimeSeconds = 14\n",
"intervalMilliseconds = 80\n",
"frames = math.ceil(simulationTimeSeconds*1000/intervalMilliseconds)\n",
"\n",
"ani = animation.FuncAnimation(fig, NextAnimationFrame, interval = intervalMilliseconds, frames = frames)\n",
"\n",
"HTML(ani.to_html5_video())\n",
"#ani.save('basic_animation.mp4')\n",
"\n",
"#HTML(ani.to_jshtml())\n",
"#plt.show()\n",
"\n",
"#print(barY)"
]
},
{
"attachments": {
"7d377e9e-e1fb-4238-a4d5-bf871fc2d8a1.png": {
"image/png": "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"
}
},
"cell_type": "markdown",
"metadata": {},
"source": [
"No surprises there - each step in the line takes a second to get \"primed\", and from that point there is a constant output at the end of the line, at a rate of one completed job per second.\n",
"\n",
"Now what happens when we add some randomness to the step time? The article uses this as an example:\n",
"\n",
"![https___bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com_public_images_e4d6191b-c256-48e1-bf42-274b696428a8_1167x305.png](attachment:7d377e9e-e1fb-4238-a4d5-bf871fc2d8a1.png)\n",
"\n",
"Let's do the same and add 0.5 seconds of normally distributed noise to the step time. Note that statistically, this means sometimes we end up with a negative step time! A Poisson distribution might be more applicable, but I'm going to stick with the specification in the original article. To make it mathematically valid, I just cap the minimum step time by the time resolution of the simulation.\n",
"\n",
"Now see how the line performs. Again, we are visualising the *Out Tray* for each *ProductionStep* in the *ProductionLine*."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD8CAYAAABuHP8oAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAL2ElEQVR4nO3dfYxld13H8ffHrlS7Rah2RNoiW0Nt0yAKDEKpUaFoWmqsxia0kVIMZv8wPNTYSA0GTIxJY4zBGDHZVOQPSGssVUkxaAOtRCmVaWkofYIGF+wDdqqGB2Parv36xxxkOnZ3Zu85c+98Z9+vZDL33rn3nu/9dfues2fvmUlVIUnq5zsWPYAkaTYGXJKaMuCS1JQBl6SmDLgkNWXAJampTQOe5P1JHk3y+XW3fW+Sm5J8cfh80vaOKUnaaCt74B8Azt9w21XAx6vqDODjw3VJ0hxlKyfyJNkH3FhVLx6u3w/8dFU9kuT5wC1Vdea2TipJepo9Mz7ueVX1yHD5q8DzDnfHJPuB/QB79+59+VlnnTXjJiV1dddDX1v0CAv1I6c+Z9Tjb7/99seqamnj7bMG/P9UVSU57G58VR0ADgAsLy/XysrK2E1KambfVR9d9AgLtXL1haMen+TLz3T7rO9C+bfh0AnD50dnHUySNJtZA/4R4PLh8uXA30wzjiRpq7byNsJrgVuBM5M8mOQtwNXAzyT5IvC64bokaY42PQZeVZce5kvnTTyLJOkoeCamJDVlwCWpKQMuSU0ZcElqyoBLUlMGXJKaMuCS1JQBl6SmDLgkNWXAJakpAy5JTRlwSWrKgEtSUwZckpoy4JLUlAGXpKYMuCQ1ZcAlqSkDLklNGXBJasqAS1JTBlySmjLgktSUAZekpgy4JDVlwCWpKQMuSU0ZcElqyoBLUlMGXJKaMuCS1JQBl6SmDLgkNWXAJakpAy5JTY0KeJJfT3J3ks8nuTbJd001mCTpyGYOeJJTgbcDy1X1YuA44JKpBpMkHdnYQyh7gO9Osgc4AXh4/EiSpK2YOeBV9RDwB8BXgEeAr1XV32+8X5L9SVaSrKyurs4+qSTpacYcQjkJuAg4HTgF2JvkjRvvV1UHqmq5qpaXlpZmn1SS9DRjDqG8DviXqlqtqieBG4BXTzOWJGkzYwL+FeBVSU5IEuA84N5pxpIkbWbMMfDbgOuBO4C7huc6MNFckqRN7Bnz4Kp6D/CeiWaRJB0Fz8SUpKYMuCQ1ZcAlqSkDLklNGXBJasqAS1JTBlySmjLgktSUAZekpgy4JDVlwCWpKQMuSU0ZcElqyoBLUlMGXJKaMuCS1JQBl6SmDLgkNWXAJakpAy5JTRlwSWrKgEtSUwZckpoy4JLUlAGXpKYMuCQ1ZcAlqSkDLklNGXBJasqAS1JTBlySmjLgktSUAZekpgy4JDU1KuBJnpvk+iT3Jbk3yTlTDSZJOrI9Ix//R8DHquriJM8CTphgJknSFswc8CTPAX4SeDNAVT0BPDHNWJKkzYw5hHI6sAr8eZLPJrkmyd6Nd0qyP8lKkpXV1dURm5MkrTcm4HuAlwF/WlUvBf4LuGrjnarqQFUtV9Xy0tLSiM1JktYbE/AHgQer6rbh+vWsBV2SNAczB7yqvgr8a5Izh5vOA+6ZZCpJ0qbGvgvlbcCHhnegfAn4lfEjSZK2YlTAq+pOYHmaUSRJR8MzMSWpKQMuSU0ZcElqyoBLUlMGXJKaMuCS1JQBl6SmDLgkNWXAJakpAy5JTRlwSWrKgEtSUwZckpoy4JLUlAGXpKYMuCQ1ZcAlqSkDLklNGXBJasqAS1JTBlySmjLgktSUAZekpgy4JDVlwCWpKQMuSU0ZcElqyoBLUlMGXJKaMuCS1JQBl6SmDLgkNWXAJakpAy5JTRlwSWpqdMCTHJfks0lunGIgSdLWTLEH/g7g3gmeR5J0FEYFPMlpwIXANdOMI0naqrF74O8FfhN46nB3SLI/yUqSldXV1ZGbkyR9y8wBT/JzwKNVdfuR7ldVB6pquaqWl5aWZt2cJGmDMXvg5wI/n+QgcB3w2iQfnGQqSdKmZg54Vf1WVZ1WVfuAS4BPVNUbJ5tMknREvg9ckpraM8WTVNUtwC1TPJckaWvcA5ekpgy4JDVlwCWpKQMuSU0ZcElqyoBLUlMGXJKaMuCS1JQBl6SmDLgkNWXAJakpAy5JTRlwSWrKgEtSUwZckpoy4JLUlAGXpKYMuCQ1ZcAlqSkDLklNGXBJasqAS1JTBlySmjLgktSUAZekpgy4JDVlwCWpKQMuSU0ZcElqyoBLUlMGXJKaMuCS1JQBl6SmDLgkNTVzwJO8IMnNSe5JcneSd0w5mCTpyPaMeOwh4Deq6o4kzwZuT3JTVd0z0WySpCOYeQ+8qh6pqjuGy98A7gVOnWowSdKRTXIMPMk+4KXAbc/wtf1JVpKsrK6uTrE5SRITBDzJicCHgSuq6usbv15VB6pquaqWl5aWxm5OkjQYFfAk38lavD9UVTdMM5IkaSvGvAslwJ8B91bVH043kiRpK8bsgZ8LXAa8Nsmdw8frJ5pLkrSJmd9GWFX/CGTCWSRJR8EzMSWpKQMuSU0ZcElqasyp9HO176qPLnqEhTp49YWLHkHSDuMeuCQ1ZcAlqSkDLklNGXBJasqAS1JTBlySmjLgktSUAZekpgy4JDXV5kxMaZE8E9gzgXci98AlqSkDLklNGXBJasqAS1JTBlySmjLgktSUAZekpgy4JDVlwCWpKQMuSU0ZcElqyoBLUlMGXJKaMuCS1JQBl6SmDLgkNWXAJakpAy5JTRlwSWrK34l5jPB3Ovo7HbX7uAcuSU2NCniS85Pcn+SBJFdNNZQkaXMzBzzJccCfABcAZwOXJjl7qsEkSUc2Zg/8x4EHqupLVfUEcB1w0TRjSZI2k6qa7YHJxcD5VfWrw/XLgFdW1Vs33G8/sH+4eiZw/+zjLtTJwGOLHqIx128c12+c7uv3wqpa2njjtr8LpaoOAAe2ezvbLclKVS0veo6uXL9xXL9xduv6jTmE8hDwgnXXTxtukyTNwZiAfwY4I8npSZ4FXAJ8ZJqxJEmbmfkQSlUdSvJW4O+A44D3V9Xdk02287Q/DLRgrt84rt84u3L9Zv5HTEnSYnkmpiQ1ZcAlqaljKuBJ3pXk7iSfS3JnklcOt1+R5ISJtnFWkluTPJ7kyimec6eY0/r98vD8dyX5VJIfneJ5d4I5rd9F655/JclPTPG8O8E81m/dtl6R5NBwvsvOVVXHxAdwDnArcPxw/WTglOHyQeDkibbz/cArgN8Drlz06264fq8GThouXwDctujX3mz9TuTb/7b1EuC+Rb/2Tus3PN9xwCeAvwUuXvRrP9LHsbQH/nzgsap6HKCqHquqh5O8HTgFuDnJzQBJfnbYi74jyV8mOXG4/WCS3x/2Dv85yYs2bqSqHq2qzwBPzu+lzcW81u9TVfWfw9VPs3Z+wW4wr/X7Zg0VAvYCu+VdCnNZv8HbgA8Dj27/yxpp0d9B5vXB2p7JncAXgPcBP7XuawcZvoOz9p39k8De4fo7gXevu9+7hstvAm48wvZ+h921Bz7X9RvucyVwzaJfe7f1A34RuA/4D+CcRb/2TusHnAr8A2uHlz+Ae+A7Q1V9E3g5az+XZRX4iyRvfoa7voq1n674T0nuBC4HXrju69eu+3zOds2708x7/ZK8BngLa/8DtjfP9auqv6qqs4BfAH53gvEXbo7r917gnVX11CSDb7Nj6jfyVNX/ALcAtyS5i7X/uB/YcLcAN1XVpYd7msNc3vXmtX5JXgJcA1xQVf8+ZuadZN5//qrqk0l+KMnJVdX5BzkBc1u/ZeC6JLC2N//6JIeq6q9nn3z7HDN74EnOTHLGupt+DPjycPkbwLOHy58Gzv3W8bEke5P88LrHvWHd51u3b+KdZV7rl+QHgRuAy6rqC9O9gsWa4/q9KEN9krwMOB5o/01wXutXVadX1b6q2gdcD/zaTo03HFt74CcCf5zkucAh4AG+/WNuDwAfS/JwVb1m+KvZtUmOH77+26wdewM4KcnngMeB//ddPskPACvA9wBPJbkCOLuqvr4tr2p+5rJ+wLuB7wPeN3ToUO2OnyI3r/X7JeBNSZ4E/ht4Qw0Hd5ub1/q14qn0RyHJQWB5N/x1dBFcv3Fcv3F24/odM4dQJGm3cQ9ckppyD1ySmjLgktSUAZekpgy4JDVlwCWpqf8FE9p1aRmtvBAAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"aveTime = 1\n",
"stdDev = 0.5\n",
"\n",
"step1 = ProductionStep(aveTime, stdDev, 10000)\n",
"step2 = ProductionStep(aveTime, stdDev)\n",
"step3 = ProductionStep(aveTime, stdDev)\n",
"step4 = ProductionStep(aveTime, stdDev)\n",
"\n",
"line = ProductionLine([step1, step2, step3, step4])\n",
"\n",
"barX = []\n",
"barY = []\n",
"\n",
"for i in range(line.GetNumSteps()):\n",
" barX.append(f\"Step {i+1}\")\n",
" barY.append(0)\n",
"\n",
"fig = plt.figure()\n",
"ax = plt.axes(ylim=(0, 10))\n",
"\n",
"d1 = ax.bar(barX, barY)\n",
"\n",
"#plt.xticks(rotation=45, ha=\"right\", rotation_mode=\"anchor\") #rotate the x-axis values\n",
"#plt.subplots_adjust(bottom = 0.2, top = 0.9) #make the x-axis labels fit in the screen\n",
"\n",
"#plt.bar(barX, barY)\n",
"\n",
"def NextAnimationFrame(fi):\n",
" global line\n",
" line.RunForTime(0.08)\n",
" barY = line.GetOutTrayCounts()\n",
" for i, di in enumerate(d1):\n",
" di.set_height(barY[i])\n",
" return [d1]\n",
"\n",
"simulationTimeSeconds = 20\n",
"intervalMilliseconds = 80\n",
"frames = round(simulationTimeSeconds*1000/intervalMilliseconds)\n",
" \n",
"ani = animation.FuncAnimation(fig, NextAnimationFrame, interval = intervalMilliseconds, frames = frames)\n",
"\n",
"HTML(ani.to_html5_video())\n",
"#ani.save('basic_animation.mp4')\n",
"\n",
"#HTML(ani.to_jshtml())\n",
"#plt.show()\n",
"\n",
"#print(barY)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And here we discover our first big surprise: there's nothing particularly surprising here! Sure, progress is jumpy rather than predictable, as you would expect, but the output still proceeds at roughly one completed job per second.\n",
"\n",
"To understand where the inefficiencies the original article discusses arise, we need to dig a little deeper. Let's start by simultaneously plotting the *work in process* and *cycle time* as defined in the article, alongside the *Out Tray* counts."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 432x288 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"line.Reset()\n",
"\n",
"fig = plt.figure()\n",
"#ax = plt.axes(ylim=(0, 10))\n",
"fig, (ax1, ax2) = plt.subplots(1, 2)\n",
"\n",
"d1 = ax1.bar(barX, barY)\n",
"d2 = ax2.bar([\"WIP\", \"CT\"], [0, 0])\n",
"\n",
"#cycleTimes = []\n",
"\n",
"ax1.set_ylim((0, 10))\n",
"ax2.set_ylim((0, 20))\n",
"\n",
"#plt.xticks(rotation=45, ha=\"right\", rotation_mode=\"anchor\") #rotate the x-axis values\n",
"#plt.subplots_adjust(bottom = 0.2, top = 0.9) #make the x-axis labels fit in the screen\n",
"\n",
"#plt.bar(barX, barY)\n",
"\n",
"def NextAnimationFrame(fi):\n",
" global line\n",
" ct = line.RunForTime(0.08)\n",
" barY = line.GetOutTrayCounts()\n",
" for i, di in enumerate(d1):\n",
" di.set_height(barY[i])\n",
" d2[0].set_height(line.GetWIP())\n",
" if ct:\n",
" d2[1].set_height(ct)\n",
" return [d1, d2]\n",
"\n",
"simulationTimeSeconds = 30\n",
"intervalMilliseconds = 80\n",
"frames = round(simulationTimeSeconds*1000/intervalMilliseconds)\n",
" \n",
"ani = animation.FuncAnimation(fig, NextAnimationFrame, interval = intervalMilliseconds, frames = frames)\n",
"\n",
"HTML(ani.to_html5_video())\n",
"#ani.save('basic_animation.mp4')\n",
"\n",
"#HTML(ani.to_jshtml())\n",
"#plt.show()\n",
"\n",
"#print(barY)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hmm, that's strange - WIP and CT both start at expected values of about 3 jobs-in-progress and about 5 seconds of cycle time. But after 20 seconds of production, both metrics seem to start growing. Where are they going?\n",
"\n",
"To understand their trajectory, we need to simulate for far longer. Real-time animations start to lose their appeal at this point, so let's turn to pre-calculated results.\n",
"\n",
"Here's a plot of WIP and CT, verses seconds of production time. Since our average step time remains at 1 second for 1 completed job, we can keep the graph simple by using the same y-axis for both metrics. Jobs and seconds are approximately the same scale. This time however, we extend production time on the x-axis - all the way out to 1000 seconds."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x11960b910>]"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"line.Reset()\n",
"\n",
"wip = []\n",
"ct = []\n",
"newCt = 0\n",
"for i in range(1000):\n",
" for j in range(50):\n",
" thisCt = line.RunForTime(0.08)\n",
" if thisCt is not None:\n",
" newCt = thisCt\n",
" wip.append(line.GetWIP())\n",
" ct.append(newCt)\n",
"\n",
"\n",
"plt.plot(wip)\n",
"plt.plot(ct)\n",
"#line.GetOutTrayCounts()\n",
"#line.GetInTrayCounts()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ah ha! Our WIP and CT values soon depart predictable values (that is, roughly 3 jobs and 5 seconds respectively) and head a long way north. Where do they end up? Let's check with a few more simulations."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 432x288 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"#ax = plt.axes(ylim=(0, 10))\n",
"fig, (ax1, ax2, ax3, ax4) = plt.subplots(1, 4)\n",
"\n",
"for ax in [ax1, ax2, ax3, ax4]:\n",
" ax.set_ylim((0, 120))\n",
" if ax is not ax1:\n",
" ax.get_yaxis().set_visible(False)\n",
"\n",
" line.Reset()\n",
" \n",
" wip = []\n",
" ct = []\n",
" newCt = 0\n",
" for i in range(1000):\n",
" for j in range(50):\n",
" thisCt = line.RunForTime(0.08)\n",
" if thisCt is not None:\n",
" newCt = thisCt\n",
" wip.append(line.GetWIP())\n",
" ct.append(newCt)\n",
"\n",
"\n",
" ax.plot(wip)\n",
" ax.plot(ct)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Beyond 30 or 40 it's practically a random walk!\n",
"\n",
"And herein lies the core of the problem. As the original article puts it: \"The culprit is the variation.\"\n",
"\n",
"As soon as the *step time* has some randomness associated with it, WIP and CT grow unpredictably. Instead of predictable results like having each of the first three steps with a work in progress, or the cycle time of any particular job being 4 seconds from Step 1 to Step 4, we end up with WIP and CT values of at least 20, and potentially above 120. If production runs longer than 1000 seconds, even higher WIP and CT is possible.\n",
"\n",
"The net result is that if you have a process that has 4 steps, and each step takes 1 second, you can expect that it takes 4 seconds for a input to reach the output of the process. If you supply inputs as often as needed, you can expect each step will bank up at most one input before it completes the last. If however, real world effects result in each step taking more-or-less 1 second, with some statistical variation above and below, the process with gradually become less efficient. After running for some time you should expect that the time taken for an input to reach the output will blow out from 4 seconds to at least 20, and possibly much, much more. Similarly, you can expect that at any point in time there is likely to be many more than the ideal 3 works in progress.\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Given that no real-world process ever completes in a precisely predictable time, what are we to do? As the simulations demonstrate, the root cause of the inefficiency is the gradual accumulation of *backlog*.\n",
"\n",
"There are various ways to tackle *backlog*, depending on the constraints surrounding the process. One effective way to ensure *backlog* never accumulates unbounded, is to introduce process **slack**. Slack, as defined by Tom DeMarco in \"Slack: Getting Past Burnout, Busywork, and the Myth of Total Efficiency\", is defined as *the degree of freedom required to effect change*. DeMarco extolls the surprising benefits for ensuring productive work results in beneficial outcomes. He describes it as an opportunity for growth and improve effectiveness, not just efficiency.\n",
"\n",
"> For a primer on DeMarco's exploration of *slack*, see https://fs.blog/2021/05/slack/\n",
"\n",
"But, as it turns out, slack would also have a direct impact on efficiency, at least as modelled in these simulations. Let's attempt to introduce a little *slack* at each step in the production line. Let's gift individual steps in the production line with the ability to dwell for a moment, if they find themselves ahead of subsequent steps. More explicitly, we will model slack as time taken to do nothing, if the *Out Tray* is well stocked.\n",
"\n",
"---\n",
"\n",
"First we'll modify how a step behaves by introducing allowance for slack."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"class ProductionStepWithSlack(ProductionStep):\n",
" def RunForTime(self, timeDelta):\n",
" if self.outTrayCount >= 2: # Out Tray is already \"well\" stocked\n",
" return (False, False) # So allow a little slack, and do nothing.\n",
" else:\n",
" return super().RunForTime(timeDelta) # Otherwise, carry on as before"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And then we roll the dice again, just as before, only this time the steps have the slack feature. Note the last step is different - its out tray is the end of the production line and we haven't modelled any collection from the end of the line. To ensure it keeps working as the completed products pile up, we model it as a normal production step without the slack feature."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"aveTime = 1\n",
"stdDev = 0.5\n",
"\n",
"step1 = ProductionStepWithSlack(aveTime, stdDev, 10000)\n",
"step2 = ProductionStepWithSlack(aveTime, stdDev)\n",
"step3 = ProductionStepWithSlack(aveTime, stdDev)\n",
"step4 = ProductionStep(aveTime, stdDev)\n",
"\n",
"line = ProductionLine([step1, step2, step3, step4])\n",
"\n",
"barX = []\n",
"barY = []\n",
"\n",
"for i in range(line.GetNumSteps()):\n",
" barX.append(f\"Step {i+1}\")\n",
" barY.append(0)\n",
"\n",
"fig = plt.figure()\n",
"ax = plt.axes(ylim=(0, 10))\n",
"\n",
"d1 = ax.bar(barX, barY)\n",
"\n",
"#plt.xticks(rotation=45, ha=\"right\", rotation_mode=\"anchor\") #rotate the x-axis values\n",
"#plt.subplots_adjust(bottom = 0.2, top = 0.9) #make the x-axis labels fit in the screen\n",
"\n",
"#plt.bar(barX, barY)\n",
"\n",
"def NextAnimationFrame(fi):\n",
" global line\n",
" line.RunForTime(0.08)\n",
" barY = line.GetOutTrayCounts()\n",
" for i, di in enumerate(d1):\n",
" di.set_height(barY[i])\n",
" return [d1]\n",
"\n",
"simulationTimeSeconds = 20\n",
"intervalMilliseconds = 80\n",
"frames = round(simulationTimeSeconds*1000/intervalMilliseconds)\n",
" \n",
"ani = animation.FuncAnimation(fig, NextAnimationFrame, interval = intervalMilliseconds, frames = frames)\n",
"\n",
"HTML(ani.to_html5_video())\n",
"#ani.save('basic_animation.mp4')\n",
"\n",
"#HTML(ani.to_jshtml())\n",
"#plt.show()\n",
"\n",
"#print(barY)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As before, no big surprises here. Progress ticks along much like before with the output still proceedings at roughly one completed job per second, after an initial seed period of about 4 seconds.\n",
"\n",
"So as before, let's simultaneously plot the *work in process* and *cycle time* as defined in the article, alongside the *Out Tray* counts."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 432x288 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"line.Reset()\n",
"\n",
"fig = plt.figure()\n",
"#ax = plt.axes(ylim=(0, 10))\n",
"fig, (ax1, ax2) = plt.subplots(1, 2)\n",
"\n",
"d1 = ax1.bar(barX, barY)\n",
"d2 = ax2.bar([\"WIP\", \"CT\"], [0, 0])\n",
"\n",
"#cycleTimes = []\n",
"\n",
"ax1.set_ylim((0, 10))\n",
"ax2.set_ylim((0, 20))\n",
"\n",
"#plt.xticks(rotation=45, ha=\"right\", rotation_mode=\"anchor\") #rotate the x-axis values\n",
"#plt.subplots_adjust(bottom = 0.2, top = 0.9) #make the x-axis labels fit in the screen\n",
"\n",
"#plt.bar(barX, barY)\n",
"\n",
"def NextAnimationFrame(fi):\n",
" global line\n",
" ct = line.RunForTime(0.08)\n",
" barY = line.GetOutTrayCounts()\n",
" for i, di in enumerate(d1):\n",
" di.set_height(barY[i])\n",
" d2[0].set_height(line.GetWIP())\n",
" if ct:\n",
" d2[1].set_height(ct)\n",
" return [d1, d2]\n",
"\n",
"simulationTimeSeconds = 30\n",
"intervalMilliseconds = 80\n",
"frames = round(simulationTimeSeconds*1000/intervalMilliseconds)\n",
" \n",
"ani = animation.FuncAnimation(fig, NextAnimationFrame, interval = intervalMilliseconds, frames = frames)\n",
"\n",
"HTML(ani.to_html5_video())\n",
"#ani.save('basic_animation.mp4')\n",
"\n",
"\n",
"#HTML(ani.to_jshtml())\n",
"#plt.show()\n",
"\n",
"#print(barY)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ah ha! Now for the first time we can see the benefit of slack. Neither WIP nor CT grow much beyond their expected values. They're not as low as the ideal world of zero-variability (3 jobs-in-progress and 5 seconds of cycle time) but now at least they seem bounded.\n",
"\n",
"To be really sure, let's do just as before and simulate for much longer."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 432x288 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"#ax = plt.axes(ylim=(0, 10))\n",
"fig, (ax1, ax2, ax3, ax4) = plt.subplots(1, 4)\n",
"\n",
"for ax in [ax1, ax2, ax3, ax4]:\n",
" ax.set_ylim((0, 120))\n",
" if ax is not ax1:\n",
" ax.get_yaxis().set_visible(False)\n",
"\n",
" line.Reset()\n",
" \n",
" wip = []\n",
" ct = []\n",
" newCt = 0\n",
" for i in range(1000):\n",
" for j in range(50):\n",
" thisCt = line.RunForTime(0.08)\n",
" if thisCt is not None:\n",
" newCt = thisCt\n",
" wip.append(line.GetWIP())\n",
" ct.append(newCt)\n",
"\n",
"\n",
" ax.plot(wip)\n",
" ax.plot(ct)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Boom! Clear as day. By introducing slack, our production line's predictable behaviour is restored. Both WIP and CT stay well below 20, hovering about 10 or below. This is entirely predictable of course - now that each step in the line goes slack if it's more got at least 2 jobs already queued up for the next step in the line, there can't be any more than 9 jobs in progress. Consequently, any job entering the line will never have to for more than 9 other jobs ahead of it in the queue to get processed, so the cycle time is also well contained.\n",
"\n",
"So there you have it - if your workflow has enough complexity to exhibit *variability* in processing time at each step, you can keep your backlog low simply by introducing a little slack into the system.\n",
"\n",
"But that's not the whole story is it? Sure, our queues are shorter, but let's be honest - we didn't actually *improve* the output rate. That's stubbornly stuck at the average step time. Introducing slack isn't going to get more than an average of one job out of the line a second. So is there much point? Well of course, as [DeMarco explains](https://fs.blog/2021/05/slack/), the point is to:\n",
"\n",
"> reintroduce enough slack to allow the organization to breathe, reinvent itself, and make necessary change.\n",
"\n",
"Which demands the question: how much slack have we introduced? Let's check..."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, we add a variable to monitor slack."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"class ProductionStepWithSlack(ProductionStep):\n",
" def __init__(self, averageStepTime, standardDeviation, inTrayCount=0):\n",
" self.initialAccumulatedSlack = 0.0\n",
" return super().__init__(averageStepTime, standardDeviation, inTrayCount)\n",
" \n",
" def Reset(self):\n",
" self.accumulatedSlack = self.initialAccumulatedSlack\n",
" return super().Reset()\n",
" \n",
" def RunForTime(self, timeDelta):\n",
" if self.outTrayCount >= 2: # Out Tray is already \"well\" stocked\n",
" self.accumulatedSlack += timeDelta\n",
" return (False, False) # So allow a little slack, and do nothing.\n",
" else:\n",
" return super().RunForTime(timeDelta) # Otherwise, carry on as before"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then we run the whole production line again, this time plotting total accumulated slack alongside WIP and CT."
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 432x288 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#for step in line.steps[:-1]:\n",
"# step.accumulatedSlack = 0.0\n",
"\n",
"aveTime = 1\n",
"stdDev = 0.5\n",
"\n",
"step1 = ProductionStepWithSlack(aveTime, stdDev, 10000)\n",
"step2 = ProductionStepWithSlack(aveTime, stdDev)\n",
"step3 = ProductionStepWithSlack(aveTime, stdDev)\n",
"step4 = ProductionStep(aveTime, stdDev)\n",
"\n",
"line = ProductionLine([step1, step2, step3, step4])\n",
"\n",
"\n",
"\n",
"fig = plt.figure()\n",
"#ax = plt.axes(ylim=(0, 10))\n",
"fig, (ax1, ax2, ax3, ax4) = plt.subplots(1, 4)\n",
"\n",
"for ax in [ax1, ax2, ax3, ax4]:\n",
" ax.set_ylim((0, 20))\n",
" if ax is not ax1:\n",
" ax.get_yaxis().set_visible(False)\n",
"\n",
" line.Reset()\n",
" \n",
" wip = []\n",
" ct = []\n",
" slack = []\n",
" newCt = 0\n",
" for i in range(1000):\n",
" for j in range(50):\n",
" thisCt = line.RunForTime(0.08)\n",
" if thisCt is not None:\n",
" newCt = thisCt\n",
" wip.append(line.GetWIP())\n",
" ct.append(newCt)\n",
" \n",
" totalSlack = 0\n",
" for step in line.steps[:-1]:\n",
" totalSlack += step.accumulatedSlack\n",
" slack.append(totalSlack/60)\n",
" \n",
"\n",
"\n",
" ax.plot(wip)\n",
" ax.plot(ct)\n",
" ax.plot(slack)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note the y-axis has been zoomed in from a maximum of 120 to a maximum of 20 for clarity. Also note that accumulated slack has been divided by 60, so is in units of *minutes* while cycle time (in orange) and x-axis (run time) is in seconds.\n",
"\n",
"And there you have it. The sum of the time spent slacking by the first three steps in the production line rises fairly linearly to 15-18 minutes over the course of 16.7 minutes. That's an average of 5 to 6 minutes per step. In other words, each step can spend one-third of the time slacking, and not affect the production rate! Indeed, the time spent slacking actually *improves* the cycle time and work-in-progress metrics.\n",
"\n",
"But it gets better - each step has one third of the time \"to breathe, reinvent itself, and make necessary change\". That time might be spend sharpening tools, improving skills, recuperating or even thinking about how the bigger picture could be reframed.\n",
"\n",
"Imagine what you could do if your day incorporated a little slack."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment