aoml/pds/cases/case_1/case1_student_notebook.ipynb
2023-12-09 18:05:57 +01:00

2256 lines
No EOL
154 KiB
Text

{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "case1_student_notebook.ipynb",
"provenance": [],
"toc_visible": true,
"collapsed_sections": [
"-P1-336gb1mL",
"7W7uTUrbcavk",
"i7HhY0Vqc4vT",
"mjVrfdcE8Wos",
"gVQE6YOq-Ic0"
]
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Case 1 - Student notebook\n",
"\n",
"Welcome to the helper notebook for case 1. This notebook contains prepared code that you can use to tackle case 1. Specifically, you can find here:\n",
"\n",
"- Code to load the case data.\n",
"- Simulation tools to test warehouse purchasing policies.\n",
"\n",
"This notebook is designed to be used in Google Colab. You can also export it and run it in any other Jupyter Notebook environment, but a thing or two will probably break and you will need to fix them yourself. Your choice."
],
"metadata": {
"id": "SIqkunrpbF0F"
}
},
{
"cell_type": "markdown",
"source": [
"## Imports and Data loading"
],
"metadata": {
"id": "-P1-336gb1mL"
}
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"id": "Nsf-Vl3-a82N"
},
"outputs": [],
"source": [
"# Import all the necessary packages\n",
"import io\n",
"import pandas as pd\n",
"import numpy as np\n",
"import seaborn as sns\n",
"from google.colab import files\n",
"from datetime import datetime, timedelta"
]
},
{
"cell_type": "code",
"source": [
"# Upload files from your computer here\n",
"# Run the cell and click the \"Browse\" button to upload the provided CSV \n",
"# files\n",
"uploaded = files.upload()"
],
"metadata": {
"colab": {
"resources": {
"http://localhost:8080/nbextensions/google.colab/files.js": {
"data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7CgpmdW5jdGlvbiBfdXBsb2FkRmlsZXMoaW5wdXRJZCwgb3V0cHV0SWQpIHsKICBjb25zdCBzdGVwcyA9IHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCk7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICAvLyBDYWNoZSBzdGVwcyBvbiB0aGUgb3V0cHV0RWxlbWVudCB0byBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgdGhlIG5leHQgY2FsbAogIC8vIHRvIHVwbG9hZEZpbGVzQ29udGludWUgZnJvbSBQeXRob24uCiAgb3V0cHV0RWxlbWVudC5zdGVwcyA9IHN0ZXBzOwoKICByZXR1cm4gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpOwp9CgovLyBUaGlzIGlzIHJvdWdobHkgYW4gYXN5bmMgZ2VuZXJhdG9yIChub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIHlldCksCi8vIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBhc3luY2hyb25vdXMgc3RlcHMgYW5kIHRoZSBQeXRob24gc2lkZSBpcyBnb2luZwovLyB0byBwb2xsIGZvciBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcC4KLy8gVGhpcyB1c2VzIGEgUHJvbWlzZSB0byBibG9jayB0aGUgcHl0aG9uIHNpZGUgb24gY29tcGxldGlvbiBvZiBlYWNoIHN0ZXAsCi8vIHRoZW4gcGFzc2VzIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHN0ZXAgYXMgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHN0ZXAuCmZ1bmN0aW9uIF91cGxvYWRGaWxlc0NvbnRpbnVlKG91dHB1dElkKSB7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICBjb25zdCBzdGVwcyA9IG91dHB1dEVsZW1lbnQuc3RlcHM7CgogIGNvbnN0IG5leHQgPSBzdGVwcy5uZXh0KG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSk7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0LnZhbHVlLnByb21pc2UpLnRoZW4oKHZhbHVlKSA9PiB7CiAgICAvLyBDYWNoZSB0aGUgbGFzdCBwcm9taXNlIHZhbHVlIHRvIG1ha2UgaXQgYXZhaWxhYmxlIHRvIHRoZSBuZXh0CiAgICAvLyBzdGVwIG9mIHRoZSBnZW5lcmF0b3IuCiAgICBvdXRwdXRFbGVtZW50Lmxhc3RQcm9taXNlVmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiBuZXh0LnZhbHVlLnJlc3BvbnNlOwogIH0pOwp9CgovKioKICogR2VuZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBiZXR3ZWVuIGVhY2ggYXN5bmMgc3RlcCBvZiB0aGUgdXBsb2FkCiAqIHByb2Nlc3MuCiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIGlucHV0IGZpbGUgcGlja2VyIGVsZW1lbnQuCiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXRJZCBFbGVtZW50IElEIG9mIHRoZSBvdXRwdXQgZGlzcGxheS4KICogQHJldHVybiB7IUl0ZXJhYmxlPCFPYmplY3Q+fSBJdGVyYWJsZSBvZiBuZXh0IHN0ZXBzLgogKi8KZnVuY3Rpb24qIHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpOwogIGlucHV0RWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlOwoKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIG91dHB1dEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7CgogIGNvbnN0IHBpY2tlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7CiAgICAgIHJlc29sdmUoZS50YXJnZXQuZmlsZXMpOwogICAgfSk7CiAgfSk7CgogIGNvbnN0IGNhbmNlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIGlucHV0RWxlbWVudC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGNhbmNlbCk7CiAgY2FuY2VsLnRleHRDb250ZW50ID0gJ0NhbmNlbCB1cGxvYWQnOwogIGNvbnN0IGNhbmNlbFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgY2FuY2VsLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9OwogIH0pOwoKICAvLyBXYWl0IGZvciB0aGUgdXNlciB0byBwaWNrIHRoZSBmaWxlcy4KICBjb25zdCBmaWxlcyA9IHlpZWxkIHsKICAgIHByb21pc2U6IFByb21pc2UucmFjZShbcGlja2VkUHJvbWlzZSwgY2FuY2VsUHJvbWlzZV0pLAogICAgcmVzcG9uc2U6IHsKICAgICAgYWN0aW9uOiAnc3RhcnRpbmcnLAogICAgfQogIH07CgogIGNhbmNlbC5yZW1vdmUoKTsKCiAgLy8gRGlzYWJsZSB0aGUgaW5wdXQgZWxlbWVudCBzaW5jZSBmdXJ0aGVyIHBpY2tzIGFyZSBub3QgYWxsb3dlZC4KICBpbnB1dEVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOwoKICBpZiAoIWZpbGVzKSB7CiAgICByZXR1cm4gewogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgICAgfQogICAgfTsKICB9CgogIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgbGkuYXBwZW5kKHNwYW4oZmlsZS5uYW1lLCB7Zm9udFdlaWdodDogJ2JvbGQnfSkpOwogICAgbGkuYXBwZW5kKHNwYW4oCiAgICAgICAgYCgke2ZpbGUudHlwZSB8fCAnbi9hJ30pIC0gJHtmaWxlLnNpemV9IGJ5dGVzLCBgICsKICAgICAgICBgbGFzdCBtb2RpZmllZDogJHsKICAgICAgICAgICAgZmlsZS5sYXN0TW9kaWZpZWREYXRlID8gZmlsZS5sYXN0TW9kaWZpZWREYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24vYSd9IC0gYCkpOwogICAgY29uc3QgcGVyY2VudCA9IHNwYW4oJzAlIGRvbmUnKTsKICAgIGxpLmFwcGVuZENoaWxkKHBlcmNlbnQpOwoKICAgIG91dHB1dEVsZW1lbnQuYXBwZW5kQ2hpbGQobGkpOwoKICAgIGNvbnN0IGZpbGVEYXRhUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4gewogICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTsKICAgICAgfTsKICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpOwogICAgfSk7CiAgICAvLyBXYWl0IGZvciB0aGUgZGF0YSB0byBiZSByZWFkeS4KICAgIGxldCBmaWxlRGF0YSA9IHlpZWxkIHsKICAgICAgcHJvbWlzZTogZmlsZURhdGFQcm9taXNlLAogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbnRpbnVlJywKICAgICAgfQogICAgfTsKCiAgICAvLyBVc2UgYSBjaHVua2VkIHNlbmRpbmcgdG8gYXZvaWQgbWVzc2FnZSBzaXplIGxpbWl0cy4gU2VlIGIvNjIxMTU2NjAuCiAgICBsZXQgcG9zaXRpb24gPSAwOwogICAgZG8gewogICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihmaWxlRGF0YS5ieXRlTGVuZ3RoIC0gcG9zaXRpb24sIE1BWF9QQVlMT0FEX1NJWkUpOwogICAgICBjb25zdCBjaHVuayA9IG5ldyBVaW50OEFycmF5KGZpbGVEYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTsKICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOwoKICAgICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7CiAgICAgIHlpZWxkIHsKICAgICAgICByZXNwb25zZTogewogICAgICAgICAgYWN0aW9uOiAnYXBwZW5kJywKICAgICAgICAgIGZpbGU6IGZpbGUubmFtZSwKICAgICAgICAgIGRhdGE6IGJhc2U2NCwKICAgICAgICB9LAogICAgICB9OwoKICAgICAgbGV0IHBlcmNlbnREb25lID0gZmlsZURhdGEuYnl0ZUxlbmd0aCA9PT0gMCA/CiAgICAgICAgICAxMDAgOgogICAgICAgICAgTWF0aC5yb3VuZCgocG9zaXRpb24gLyBmaWxlRGF0YS5ieXRlTGVuZ3RoKSAqIDEwMCk7CiAgICAgIHBlcmNlbnQudGV4dENvbnRlbnQgPSBgJHtwZXJjZW50RG9uZX0lIGRvbmVgOwoKICAgIH0gd2hpbGUgKHBvc2l0aW9uIDwgZmlsZURhdGEuYnl0ZUxlbmd0aCk7CiAgfQoKICAvLyBBbGwgZG9uZS4KICB5aWVsZCB7CiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICB9CiAgfTsKfQoKc2NvcGUuZ29vZ2xlID0gc2NvcGUuZ29vZ2xlIHx8IHt9OwpzY29wZS5nb29nbGUuY29sYWIgPSBzY29wZS5nb29nbGUuY29sYWIgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYi5fZmlsZXMgPSB7CiAgX3VwbG9hZEZpbGVzLAogIF91cGxvYWRGaWxlc0NvbnRpbnVlLAp9Owp9KShzZWxmKTsK",
"ok": true,
"headers": [
[
"content-type",
"application/javascript"
]
],
"status": 200,
"status_text": "OK"
}
},
"base_uri": "https://localhost:8080/",
"height": 142
},
"id": "4psao7htcAwr",
"outputId": "6bc57f2c-c1ca-49e6-a12c-cf88c5e04452"
},
"execution_count": 2,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<IPython.core.display.HTML object>"
],
"text/html": [
"\n",
" <input type=\"file\" id=\"files-e9a16b47-653b-4c1e-969c-3f40d9a0e212\" name=\"files[]\" multiple disabled\n",
" style=\"border:none\" />\n",
" <output id=\"result-e9a16b47-653b-4c1e-969c-3f40d9a0e212\">\n",
" Upload widget is only available when the cell has been executed in the\n",
" current browser session. Please rerun this cell to enable.\n",
" </output>\n",
" <script src=\"/nbextensions/google.colab/files.js\"></script> "
]
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"Saving sourcing_events.csv to sourcing_events.csv\n",
"Saving stock_state.csv to stock_state.csv\n",
"Saving demand_events.csv to demand_events.csv\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"# Read the files as pandas dataframes and print them so you can check that the\n",
"# process went fine\n",
"\n",
"demand_events = pd.read_csv(io.BytesIO(uploaded['demand_events.csv']))\n",
"sourcing_events = pd.read_csv(io.BytesIO(uploaded['sourcing_events.csv']))\n",
"stock_state = pd.read_csv(io.BytesIO(uploaded['stock_state.csv']))\n",
"\n",
"for table in (demand_events, sourcing_events, stock_state):\n",
" print(table.head())"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "X8N0PZ4qcOls",
"outputId": "b96a4d01-e827-4de7-8de0-7e0dfdc6c456"
},
"execution_count": 3,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" date demand_quantity\n",
"0 2021-01-01 54609.492813\n",
"1 2021-01-02 36208.636486\n",
"2 2021-01-03 77784.172768\n",
"3 2021-01-04 76481.813604\n",
"4 2021-01-05 52305.876589\n",
" request_date delivery_date amount\n",
"0 2021-06-18 2021-06-24 361622.084212\n",
"1 2021-04-08 2021-04-17 404943.208184\n",
"2 2021-08-02 2021-08-10 372079.374931\n",
"3 2021-03-23 2021-03-28 324410.868370\n",
"4 2021-07-14 2021-07-19 467167.833054\n",
" date amount_in_stock\n",
"0 2021-01-01 647479.251651\n",
"1 2021-01-02 611270.615165\n",
"2 2021-01-03 533486.442397\n",
"3 2021-01-04 457004.628793\n",
"4 2021-01-05 404698.752204\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"## Level 1\n",
"\n",
"From the case description:\n",
"\n",
" - Elisa wants you to measure the performance of the last year, providing\n",
" quantitative metrics. She knows it was a bad year, but hasn't looked at\n",
" the real data to summarize how bad it was. Remember that there is a\n",
" trade-off: too much stock, is not desired, but running out of stock and making\n",
" clients wait is also negative.\n",
" - Going one step further, Elisa wants to know: what was done wrong?\n",
"\n",
"Use this section to visualize/analyse data from last year to answer Elisa's request."
],
"metadata": {
"id": "7W7uTUrbcavk"
}
},
{
"cell_type": "code",
"source": [
"# Your code goes in cells in this section"
],
"metadata": {
"id": "ENVo0y5mc1Ud"
},
"execution_count": 4,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"## Level 2\n",
"\n",
"From the case description:\n",
"\n",
" - Elisa wants you to propose an ordering policy. This means, that you need\n",
" to define a rule that, once each day, should answer the questions: should\n",
" be place an order to request material today? If yes, how much should we\n",
" order?\n",
" - Use simulation to present metrics on what is the expected performance\n",
" with the policy you are proposing. Remember, you need to convince Elisa\n",
" that this is better than what happens today.\n",
" - As a specific constraint, Elisa explains that she wants that the\n",
" probability of a stockout to be at most of 5% on any given day.\n",
"\n",
"Use this Level 2 section to learn how to use the provided code and run your own analysis and simulations to answer Elisa's request."
],
"metadata": {
"id": "i7HhY0Vqc4vT"
}
},
{
"cell_type": "markdown",
"source": [
"### Prepared simulation code\n",
"\n",
"To help you out, I have prepared some code that will assist you in running simulations. The cells below contain the code and a small example showing you how to use."
],
"metadata": {
"id": "-pPzw48XdOtA"
}
},
{
"cell_type": "code",
"source": [
"# This is the helper code. Run the cell to load it.\n",
"\n",
"base = datetime(2022,1,1)\n",
"dates_in_2022 = [base + timedelta(days=x) for x in range(365)]\n",
"\n",
"class SimulationResult:\n",
"\n",
" def __init__(self, stock_states, demand_by_day, sourcing_events):\n",
" self.stock_states = stock_states\n",
" self.demand_by_day = demand_by_day\n",
" self.sourcing_events = sourcing_events\n",
"\n",
" def plot_stock_history(self):\n",
" sns.lineplot(x=dates_in_2022, y=self.stock_states)\n",
"\n",
" def plot_stock_distribution(self):\n",
" sns.histplot(x=self.stock_states, kde=True)\n",
"\n",
" def service_level(self):\n",
" return (self.stock_states > 0 ).astype(int).mean()\n",
"\n",
" def stock_level_summary(self):\n",
" print(\n",
" pd.DataFrame(self.stock_states).describe()\n",
" ) \n",
" \n",
" def mean_stock_level(self):\n",
" return self.stock_states.mean()\n",
"\n",
" def median_stock_level(self):\n",
" return np.median(self.stock_states)\n",
"\n",
" def stdev_stock_level(self):\n",
" return self.stock_states.std()\n",
"\n",
" def mean_demand(self):\n",
" return self.demand_by_day.mean()\n",
" \n",
" def number_of_purchase_orders_placed(self):\n",
" return len(self.sourcing_events)\n",
"\n",
"\n",
"class SimulationConfig:\n",
"\n",
" def __init__(self, starting_stock, demand_generator, lead_time_generator, purchaser):\n",
" self.starting_stock = starting_stock\n",
" self.demand_generator = demand_generator\n",
" self.lead_time_generator = lead_time_generator\n",
" self.purchaser = purchaser\n",
"\n",
"class PurchaseOrder:\n",
" \n",
" def __init__(self, amount, request_date, delivery_date):\n",
" self.amount = amount\n",
" self.request_date = request_date\n",
" self.delivery_date = delivery_date\n",
"\n",
" def __repr__(self):\n",
" return f\"Order of {self.amount:.0f}, requested on {self.request_date}, delivery on {self.delivery_date}.\"\n",
"\n",
"\n",
"class Simulation:\n",
" \n",
" def __init__(self, config: SimulationConfig, verbose=False):\n",
" self._config = config\n",
" self.verbose = verbose\n",
"\n",
" def run(self):\n",
"\n",
" stock_states = np.array([self._config.starting_stock])\n",
" opened_orders = []\n",
" ongoing_orders = {}\n",
" demand_by_day = np.array(list())\n",
" \n",
" for day in dates_in_2022:\n",
" if self.verbose:\n",
" print(f\"Simulating day: {day}\")\n",
" current_stock = stock_states[-1]\n",
" if self.verbose:\n",
" print(f\"Starting stock: {current_stock:.0f}\")\n",
" demand_for_this_day = self._config.demand_generator()\n",
" if self.verbose:\n",
" print(f\"Generated demand for today: {demand_for_this_day:.0f}\")\n",
" demand_by_day = np.append(demand_by_day, [demand_for_this_day])\n",
" goods_received_this_day = 0\n",
" if day in ongoing_orders:\n",
" order_delivered_today = ongoing_orders.pop(day)\n",
" goods_received_this_day = order_delivered_today.amount\n",
" if self.verbose:\n",
" print(f\"Goods received today: {goods_received_this_day:.0f}\")\n",
" \n",
" current_stock = current_stock + goods_received_this_day - demand_for_this_day\n",
" stock_states = np.append(stock_states, [current_stock])\n",
"\n",
"\n",
" order_to_make = self._config.purchaser(\n",
" day, \n",
" current_stock, \n",
" ongoing_orders,\n",
" self._config.lead_time_generator\n",
" )\n",
"\n",
" if order_to_make:\n",
" if self.verbose:\n",
" print(f\"Placing a new order: {order_to_make}\")\n",
" opened_orders.append(order_to_make)\n",
" ongoing_orders[order_to_make.delivery_date] = order_to_make\n",
" \n",
" stock_states = np.delete(stock_states, 0) # Remove starting stock\n",
" \n",
" self.results = SimulationResult(\n",
" stock_states=stock_states, \n",
" demand_by_day=demand_by_day, \n",
" sourcing_events=opened_orders \n",
" )\n",
"\n",
" return self.results\n",
"\n"
],
"metadata": {
"id": "JRN7MPU-c84s"
},
"execution_count": 5,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"### Guide on the prepared code"
],
"metadata": {
"id": "MB_4hRpBhsCd"
}
},
{
"cell_type": "markdown",
"source": [
"#### SimulationConfig and PurchaseOrder"
],
"metadata": {
"id": "hqWXp047lX1R"
}
},
{
"cell_type": "code",
"source": [
"# There are four relevant objects you need to know about: Simulation, \n",
"# SimulationConfig, PurchaseOrder and Simulation Result.\n",
"\n",
"# SimulationConfig specifies the context for a simulation. You need to create one\n",
"# to run a simulation.\n",
"\n",
"an_example_config = SimulationConfig(\n",
" # How much stock there is in the warehouse when the simulation begins.\n",
" starting_stock=100, \n",
" # A function that generates the daily demand. You can define any kind of \n",
" # function, as long as it returns a number and doesn't require any arguments.\n",
" # The example below generates samples from a normal distribution with a mean\n",
" # of 10 and variance of 1.\n",
" demand_generator=lambda: np.random.normal(10, 1),\n",
" # A function that generates the lead time (in days) for purchase orders. \n",
" # This way, we simulate how long it will take for goods to reach the \n",
" # warehouse after placing an order. You can define any kind of function, as \n",
" # long as it returns an integer number and doesn't require any arguments.\n",
" # The example below generates samples from a normal distribution with a mean\n",
" # of 5 and variance of 1, and rounds the result so that we get full days.\n",
" lead_time_generator=lambda: int(np.random.normal(5, 1)),\n",
" # A function that decides when and how much to buy. See more details below.\n",
" purchaser=lambda: \"ignore_me_for_now\",\n",
")\n",
"\n",
"# A PurchaseOrder represents an order from Caserta to Diemen requesting goods.\n",
"an_example_order = PurchaseOrder(\n",
" amount=100,\n",
" # We request a 100.\n",
" request_date=datetime.today(),\n",
" # We request time today\n",
" delivery_date=datetime.today() + timedelta(days=1)\n",
" # We receive them tomorrow\n",
")\n",
"\n",
"# The purchaser function is the logical definition of the proposal you need to\n",
"# make to Elisa, which is a policy on when, and how much to buy. \n",
"# The function receives information from the simulation (which day is it, what \n",
"# is the stocklevel, whether there are other ongoing purchase orders, etc.) and \n",
"# either does nothing or decides that a PurchaseOrder should be created.\n",
"# This function gets called one time on each day of the simulation, so each \n",
"# simulated day can have a purchase. \n",
"\n",
"def a_simple_purchaser(\n",
" day, # The current day\n",
" current_stock, # The level of stock on that day\n",
" ongoing_orders, # A dictionary with the open purchase orders\n",
" lead_time_generator # The same lead time generator you pass to the Simulation Config\n",
" ):\n",
" \n",
" if ongoing_orders or current_stock > 100:\n",
" # If we are already waiting for an order to arrive or we have enough stock\n",
" # we don't request more goods.\n",
" return None\n",
"\n",
" if current_stock <= 100:\n",
" # If the stock is going low, we request 200 more.\n",
" return PurchaseOrder(\n",
" amount=100,\n",
" request_date=day,\n",
" delivery_date=day + timedelta(days=lead_time_generator()) # We simulate the delay in the delivery\n",
" )\n",
"\n",
"# Now that we have a purchaser function, we can complete the SimulationConfig by\n",
"# using it.\n",
"\n",
"an_example_config = SimulationConfig(\n",
" starting_stock=100, \n",
" demand_generator=lambda: np.random.normal(10, 1),\n",
" lead_time_generator=lambda: int(np.random.normal(10, 1)),\n",
" purchaser=a_simple_purchaser\n",
")\n",
"\n"
],
"metadata": {
"id": "xBopZNA_dFb5"
},
"execution_count": 6,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"#### Simulation"
],
"metadata": {
"id": "aM8Xzx_zleds"
}
},
{
"cell_type": "code",
"source": [
"# The Simulation class is the code that actually runs a simulation. It takes a \n",
"# SimulationConfig as an input, and returns a SimulationResult as an output.\n",
"\n",
"example_simulation = Simulation(\n",
" config=an_example_config,\n",
" verbose=True # This shows daily details. Turn to False if you don't want to see them.\n",
")\n",
"\n",
"# Let's run the simulation and store the results\n",
"\n",
"example_simulation_results = example_simulation.run()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "hQObT4ITlg2G",
"outputId": "91c2253c-0740-420e-b084-8dc4a317c3ca"
},
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Simulating day: 2022-01-01 00:00:00\n",
"Starting stock: 100\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-01-01 00:00:00, delivery on 2022-01-09 00:00:00.\n",
"Simulating day: 2022-01-02 00:00:00\n",
"Starting stock: 89\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-03 00:00:00\n",
"Starting stock: 79\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-04 00:00:00\n",
"Starting stock: 70\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-05 00:00:00\n",
"Starting stock: 61\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-06 00:00:00\n",
"Starting stock: 53\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-07 00:00:00\n",
"Starting stock: 43\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-08 00:00:00\n",
"Starting stock: 34\n",
"Generated demand for today: 13\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-09 00:00:00\n",
"Starting stock: 21\n",
"Generated demand for today: 10\n",
"Goods received today: 100\n",
"Simulating day: 2022-01-10 00:00:00\n",
"Starting stock: 111\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-11 00:00:00\n",
"Starting stock: 102\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-01-11 00:00:00, delivery on 2022-01-19 00:00:00.\n",
"Simulating day: 2022-01-12 00:00:00\n",
"Starting stock: 93\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-13 00:00:00\n",
"Starting stock: 83\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-14 00:00:00\n",
"Starting stock: 74\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-15 00:00:00\n",
"Starting stock: 64\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-16 00:00:00\n",
"Starting stock: 54\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-17 00:00:00\n",
"Starting stock: 43\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-18 00:00:00\n",
"Starting stock: 32\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-19 00:00:00\n",
"Starting stock: 22\n",
"Generated demand for today: 11\n",
"Goods received today: 100\n",
"Simulating day: 2022-01-20 00:00:00\n",
"Starting stock: 112\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-01-20 00:00:00, delivery on 2022-01-28 00:00:00.\n",
"Simulating day: 2022-01-21 00:00:00\n",
"Starting stock: 100\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-22 00:00:00\n",
"Starting stock: 91\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-23 00:00:00\n",
"Starting stock: 80\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-24 00:00:00\n",
"Starting stock: 71\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-25 00:00:00\n",
"Starting stock: 61\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-26 00:00:00\n",
"Starting stock: 50\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-27 00:00:00\n",
"Starting stock: 39\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-28 00:00:00\n",
"Starting stock: 30\n",
"Generated demand for today: 11\n",
"Goods received today: 100\n",
"Simulating day: 2022-01-29 00:00:00\n",
"Starting stock: 120\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-30 00:00:00\n",
"Starting stock: 111\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-01-31 00:00:00\n",
"Starting stock: 101\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-01-31 00:00:00, delivery on 2022-02-09 00:00:00.\n",
"Simulating day: 2022-02-01 00:00:00\n",
"Starting stock: 93\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-02 00:00:00\n",
"Starting stock: 83\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-03 00:00:00\n",
"Starting stock: 73\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-04 00:00:00\n",
"Starting stock: 62\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-05 00:00:00\n",
"Starting stock: 53\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-06 00:00:00\n",
"Starting stock: 45\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-07 00:00:00\n",
"Starting stock: 34\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-08 00:00:00\n",
"Starting stock: 23\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-09 00:00:00\n",
"Starting stock: 13\n",
"Generated demand for today: 10\n",
"Goods received today: 100\n",
"Simulating day: 2022-02-10 00:00:00\n",
"Starting stock: 104\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-02-10 00:00:00, delivery on 2022-02-21 00:00:00.\n",
"Simulating day: 2022-02-11 00:00:00\n",
"Starting stock: 94\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-12 00:00:00\n",
"Starting stock: 85\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-13 00:00:00\n",
"Starting stock: 76\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-14 00:00:00\n",
"Starting stock: 66\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-15 00:00:00\n",
"Starting stock: 58\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-16 00:00:00\n",
"Starting stock: 49\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-17 00:00:00\n",
"Starting stock: 40\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-18 00:00:00\n",
"Starting stock: 31\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-19 00:00:00\n",
"Starting stock: 21\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-20 00:00:00\n",
"Starting stock: 12\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-21 00:00:00\n",
"Starting stock: 0\n",
"Generated demand for today: 9\n",
"Goods received today: 100\n",
"Placing a new order: Order of 100, requested on 2022-02-21 00:00:00, delivery on 2022-03-02 00:00:00.\n",
"Simulating day: 2022-02-22 00:00:00\n",
"Starting stock: 91\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-23 00:00:00\n",
"Starting stock: 81\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-24 00:00:00\n",
"Starting stock: 69\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-25 00:00:00\n",
"Starting stock: 59\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-26 00:00:00\n",
"Starting stock: 49\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-27 00:00:00\n",
"Starting stock: 39\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-02-28 00:00:00\n",
"Starting stock: 28\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-01 00:00:00\n",
"Starting stock: 20\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-02 00:00:00\n",
"Starting stock: 8\n",
"Generated demand for today: 9\n",
"Goods received today: 100\n",
"Placing a new order: Order of 100, requested on 2022-03-02 00:00:00, delivery on 2022-03-10 00:00:00.\n",
"Simulating day: 2022-03-03 00:00:00\n",
"Starting stock: 99\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-04 00:00:00\n",
"Starting stock: 89\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-05 00:00:00\n",
"Starting stock: 81\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-06 00:00:00\n",
"Starting stock: 70\n",
"Generated demand for today: 13\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-07 00:00:00\n",
"Starting stock: 57\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-08 00:00:00\n",
"Starting stock: 48\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-09 00:00:00\n",
"Starting stock: 36\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-10 00:00:00\n",
"Starting stock: 28\n",
"Generated demand for today: 11\n",
"Goods received today: 100\n",
"Simulating day: 2022-03-11 00:00:00\n",
"Starting stock: 117\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-12 00:00:00\n",
"Starting stock: 107\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-03-12 00:00:00, delivery on 2022-03-21 00:00:00.\n",
"Simulating day: 2022-03-13 00:00:00\n",
"Starting stock: 97\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-14 00:00:00\n",
"Starting stock: 86\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-15 00:00:00\n",
"Starting stock: 77\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-16 00:00:00\n",
"Starting stock: 68\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-17 00:00:00\n",
"Starting stock: 59\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-18 00:00:00\n",
"Starting stock: 49\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-19 00:00:00\n",
"Starting stock: 40\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-20 00:00:00\n",
"Starting stock: 31\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-21 00:00:00\n",
"Starting stock: 20\n",
"Generated demand for today: 9\n",
"Goods received today: 100\n",
"Simulating day: 2022-03-22 00:00:00\n",
"Starting stock: 111\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-23 00:00:00\n",
"Starting stock: 103\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-03-23 00:00:00, delivery on 2022-04-01 00:00:00.\n",
"Simulating day: 2022-03-24 00:00:00\n",
"Starting stock: 93\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-25 00:00:00\n",
"Starting stock: 83\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-26 00:00:00\n",
"Starting stock: 74\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-27 00:00:00\n",
"Starting stock: 65\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-28 00:00:00\n",
"Starting stock: 53\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-29 00:00:00\n",
"Starting stock: 43\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-30 00:00:00\n",
"Starting stock: 33\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-03-31 00:00:00\n",
"Starting stock: 22\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-01 00:00:00\n",
"Starting stock: 11\n",
"Generated demand for today: 10\n",
"Goods received today: 100\n",
"Simulating day: 2022-04-02 00:00:00\n",
"Starting stock: 101\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-04-02 00:00:00, delivery on 2022-04-11 00:00:00.\n",
"Simulating day: 2022-04-03 00:00:00\n",
"Starting stock: 91\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-04 00:00:00\n",
"Starting stock: 82\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-05 00:00:00\n",
"Starting stock: 73\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-06 00:00:00\n",
"Starting stock: 63\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-07 00:00:00\n",
"Starting stock: 51\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-08 00:00:00\n",
"Starting stock: 40\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-09 00:00:00\n",
"Starting stock: 30\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-10 00:00:00\n",
"Starting stock: 20\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-11 00:00:00\n",
"Starting stock: 11\n",
"Generated demand for today: 10\n",
"Goods received today: 100\n",
"Simulating day: 2022-04-12 00:00:00\n",
"Starting stock: 101\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-04-12 00:00:00, delivery on 2022-04-22 00:00:00.\n",
"Simulating day: 2022-04-13 00:00:00\n",
"Starting stock: 89\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-14 00:00:00\n",
"Starting stock: 79\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-15 00:00:00\n",
"Starting stock: 70\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-16 00:00:00\n",
"Starting stock: 60\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-17 00:00:00\n",
"Starting stock: 51\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-18 00:00:00\n",
"Starting stock: 41\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-19 00:00:00\n",
"Starting stock: 33\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-20 00:00:00\n",
"Starting stock: 22\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-21 00:00:00\n",
"Starting stock: 11\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-22 00:00:00\n",
"Starting stock: -1\n",
"Generated demand for today: 10\n",
"Goods received today: 100\n",
"Placing a new order: Order of 100, requested on 2022-04-22 00:00:00, delivery on 2022-05-02 00:00:00.\n",
"Simulating day: 2022-04-23 00:00:00\n",
"Starting stock: 89\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-24 00:00:00\n",
"Starting stock: 80\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-25 00:00:00\n",
"Starting stock: 70\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-26 00:00:00\n",
"Starting stock: 61\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-27 00:00:00\n",
"Starting stock: 50\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-28 00:00:00\n",
"Starting stock: 40\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-29 00:00:00\n",
"Starting stock: 30\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-04-30 00:00:00\n",
"Starting stock: 21\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-01 00:00:00\n",
"Starting stock: 13\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-02 00:00:00\n",
"Starting stock: 3\n",
"Generated demand for today: 9\n",
"Goods received today: 100\n",
"Placing a new order: Order of 100, requested on 2022-05-02 00:00:00, delivery on 2022-05-10 00:00:00.\n",
"Simulating day: 2022-05-03 00:00:00\n",
"Starting stock: 94\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-04 00:00:00\n",
"Starting stock: 84\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-05 00:00:00\n",
"Starting stock: 73\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-06 00:00:00\n",
"Starting stock: 63\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-07 00:00:00\n",
"Starting stock: 54\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-08 00:00:00\n",
"Starting stock: 43\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-09 00:00:00\n",
"Starting stock: 33\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-10 00:00:00\n",
"Starting stock: 21\n",
"Generated demand for today: 10\n",
"Goods received today: 100\n",
"Simulating day: 2022-05-11 00:00:00\n",
"Starting stock: 111\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-12 00:00:00\n",
"Starting stock: 101\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-05-12 00:00:00, delivery on 2022-05-23 00:00:00.\n",
"Simulating day: 2022-05-13 00:00:00\n",
"Starting stock: 91\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-14 00:00:00\n",
"Starting stock: 83\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-15 00:00:00\n",
"Starting stock: 72\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-16 00:00:00\n",
"Starting stock: 62\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-17 00:00:00\n",
"Starting stock: 51\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-18 00:00:00\n",
"Starting stock: 42\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-19 00:00:00\n",
"Starting stock: 31\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-20 00:00:00\n",
"Starting stock: 22\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-21 00:00:00\n",
"Starting stock: 12\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-22 00:00:00\n",
"Starting stock: 2\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-23 00:00:00\n",
"Starting stock: -6\n",
"Generated demand for today: 10\n",
"Goods received today: 100\n",
"Placing a new order: Order of 100, requested on 2022-05-23 00:00:00, delivery on 2022-06-01 00:00:00.\n",
"Simulating day: 2022-05-24 00:00:00\n",
"Starting stock: 84\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-25 00:00:00\n",
"Starting stock: 73\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-26 00:00:00\n",
"Starting stock: 63\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-27 00:00:00\n",
"Starting stock: 53\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-28 00:00:00\n",
"Starting stock: 43\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-29 00:00:00\n",
"Starting stock: 33\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-30 00:00:00\n",
"Starting stock: 23\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-05-31 00:00:00\n",
"Starting stock: 12\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-01 00:00:00\n",
"Starting stock: 4\n",
"Generated demand for today: 9\n",
"Goods received today: 100\n",
"Placing a new order: Order of 100, requested on 2022-06-01 00:00:00, delivery on 2022-06-11 00:00:00.\n",
"Simulating day: 2022-06-02 00:00:00\n",
"Starting stock: 95\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-03 00:00:00\n",
"Starting stock: 86\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-04 00:00:00\n",
"Starting stock: 76\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-05 00:00:00\n",
"Starting stock: 67\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-06 00:00:00\n",
"Starting stock: 57\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-07 00:00:00\n",
"Starting stock: 47\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-08 00:00:00\n",
"Starting stock: 37\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-09 00:00:00\n",
"Starting stock: 26\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-10 00:00:00\n",
"Starting stock: 17\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-11 00:00:00\n",
"Starting stock: 8\n",
"Generated demand for today: 9\n",
"Goods received today: 100\n",
"Placing a new order: Order of 100, requested on 2022-06-11 00:00:00, delivery on 2022-06-20 00:00:00.\n",
"Simulating day: 2022-06-12 00:00:00\n",
"Starting stock: 99\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-13 00:00:00\n",
"Starting stock: 90\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-14 00:00:00\n",
"Starting stock: 79\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-15 00:00:00\n",
"Starting stock: 68\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-16 00:00:00\n",
"Starting stock: 57\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-17 00:00:00\n",
"Starting stock: 47\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-18 00:00:00\n",
"Starting stock: 38\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-19 00:00:00\n",
"Starting stock: 28\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-20 00:00:00\n",
"Starting stock: 16\n",
"Generated demand for today: 10\n",
"Goods received today: 100\n",
"Simulating day: 2022-06-21 00:00:00\n",
"Starting stock: 106\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-06-21 00:00:00, delivery on 2022-06-29 00:00:00.\n",
"Simulating day: 2022-06-22 00:00:00\n",
"Starting stock: 97\n",
"Generated demand for today: 7\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-23 00:00:00\n",
"Starting stock: 90\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-24 00:00:00\n",
"Starting stock: 80\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-25 00:00:00\n",
"Starting stock: 70\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-26 00:00:00\n",
"Starting stock: 58\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-27 00:00:00\n",
"Starting stock: 49\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-28 00:00:00\n",
"Starting stock: 39\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-06-29 00:00:00\n",
"Starting stock: 28\n",
"Generated demand for today: 11\n",
"Goods received today: 100\n",
"Simulating day: 2022-06-30 00:00:00\n",
"Starting stock: 117\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-01 00:00:00\n",
"Starting stock: 107\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-07-01 00:00:00, delivery on 2022-07-10 00:00:00.\n",
"Simulating day: 2022-07-02 00:00:00\n",
"Starting stock: 96\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-03 00:00:00\n",
"Starting stock: 86\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-04 00:00:00\n",
"Starting stock: 77\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-05 00:00:00\n",
"Starting stock: 68\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-06 00:00:00\n",
"Starting stock: 56\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-07 00:00:00\n",
"Starting stock: 46\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-08 00:00:00\n",
"Starting stock: 37\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-09 00:00:00\n",
"Starting stock: 28\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-10 00:00:00\n",
"Starting stock: 17\n",
"Generated demand for today: 9\n",
"Goods received today: 100\n",
"Simulating day: 2022-07-11 00:00:00\n",
"Starting stock: 108\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-07-11 00:00:00, delivery on 2022-07-19 00:00:00.\n",
"Simulating day: 2022-07-12 00:00:00\n",
"Starting stock: 99\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-13 00:00:00\n",
"Starting stock: 89\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-14 00:00:00\n",
"Starting stock: 79\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-15 00:00:00\n",
"Starting stock: 71\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-16 00:00:00\n",
"Starting stock: 61\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-17 00:00:00\n",
"Starting stock: 50\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-18 00:00:00\n",
"Starting stock: 41\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-19 00:00:00\n",
"Starting stock: 29\n",
"Generated demand for today: 10\n",
"Goods received today: 100\n",
"Simulating day: 2022-07-20 00:00:00\n",
"Starting stock: 119\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-21 00:00:00\n",
"Starting stock: 109\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-22 00:00:00\n",
"Starting stock: 101\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-07-22 00:00:00, delivery on 2022-07-30 00:00:00.\n",
"Simulating day: 2022-07-23 00:00:00\n",
"Starting stock: 89\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-24 00:00:00\n",
"Starting stock: 80\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-25 00:00:00\n",
"Starting stock: 70\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-26 00:00:00\n",
"Starting stock: 59\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-27 00:00:00\n",
"Starting stock: 50\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-28 00:00:00\n",
"Starting stock: 40\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-29 00:00:00\n",
"Starting stock: 28\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-07-30 00:00:00\n",
"Starting stock: 18\n",
"Generated demand for today: 10\n",
"Goods received today: 100\n",
"Simulating day: 2022-07-31 00:00:00\n",
"Starting stock: 108\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-07-31 00:00:00, delivery on 2022-08-09 00:00:00.\n",
"Simulating day: 2022-08-01 00:00:00\n",
"Starting stock: 96\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-02 00:00:00\n",
"Starting stock: 84\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-03 00:00:00\n",
"Starting stock: 74\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-04 00:00:00\n",
"Starting stock: 65\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-05 00:00:00\n",
"Starting stock: 55\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-06 00:00:00\n",
"Starting stock: 45\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-07 00:00:00\n",
"Starting stock: 37\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-08 00:00:00\n",
"Starting stock: 26\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-09 00:00:00\n",
"Starting stock: 17\n",
"Generated demand for today: 10\n",
"Goods received today: 100\n",
"Simulating day: 2022-08-10 00:00:00\n",
"Starting stock: 106\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-08-10 00:00:00, delivery on 2022-08-18 00:00:00.\n",
"Simulating day: 2022-08-11 00:00:00\n",
"Starting stock: 96\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-12 00:00:00\n",
"Starting stock: 87\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-13 00:00:00\n",
"Starting stock: 78\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-14 00:00:00\n",
"Starting stock: 68\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-15 00:00:00\n",
"Starting stock: 58\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-16 00:00:00\n",
"Starting stock: 47\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-17 00:00:00\n",
"Starting stock: 36\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-18 00:00:00\n",
"Starting stock: 26\n",
"Generated demand for today: 9\n",
"Goods received today: 100\n",
"Simulating day: 2022-08-19 00:00:00\n",
"Starting stock: 117\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-20 00:00:00\n",
"Starting stock: 107\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-08-20 00:00:00, delivery on 2022-08-28 00:00:00.\n",
"Simulating day: 2022-08-21 00:00:00\n",
"Starting stock: 97\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-22 00:00:00\n",
"Starting stock: 88\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-23 00:00:00\n",
"Starting stock: 78\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-24 00:00:00\n",
"Starting stock: 68\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-25 00:00:00\n",
"Starting stock: 60\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-26 00:00:00\n",
"Starting stock: 51\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-27 00:00:00\n",
"Starting stock: 42\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-28 00:00:00\n",
"Starting stock: 32\n",
"Generated demand for today: 11\n",
"Goods received today: 100\n",
"Simulating day: 2022-08-29 00:00:00\n",
"Starting stock: 122\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-30 00:00:00\n",
"Starting stock: 112\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-08-31 00:00:00\n",
"Starting stock: 102\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-08-31 00:00:00, delivery on 2022-09-09 00:00:00.\n",
"Simulating day: 2022-09-01 00:00:00\n",
"Starting stock: 92\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-02 00:00:00\n",
"Starting stock: 84\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-03 00:00:00\n",
"Starting stock: 75\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-04 00:00:00\n",
"Starting stock: 64\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-05 00:00:00\n",
"Starting stock: 52\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-06 00:00:00\n",
"Starting stock: 42\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-07 00:00:00\n",
"Starting stock: 31\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-08 00:00:00\n",
"Starting stock: 20\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-09 00:00:00\n",
"Starting stock: 12\n",
"Generated demand for today: 11\n",
"Goods received today: 100\n",
"Simulating day: 2022-09-10 00:00:00\n",
"Starting stock: 101\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-09-10 00:00:00, delivery on 2022-09-19 00:00:00.\n",
"Simulating day: 2022-09-11 00:00:00\n",
"Starting stock: 94\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-12 00:00:00\n",
"Starting stock: 84\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-13 00:00:00\n",
"Starting stock: 74\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-14 00:00:00\n",
"Starting stock: 63\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-15 00:00:00\n",
"Starting stock: 53\n",
"Generated demand for today: 7\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-16 00:00:00\n",
"Starting stock: 46\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-17 00:00:00\n",
"Starting stock: 35\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-18 00:00:00\n",
"Starting stock: 26\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-19 00:00:00\n",
"Starting stock: 16\n",
"Generated demand for today: 10\n",
"Goods received today: 100\n",
"Simulating day: 2022-09-20 00:00:00\n",
"Starting stock: 106\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-09-20 00:00:00, delivery on 2022-10-01 00:00:00.\n",
"Simulating day: 2022-09-21 00:00:00\n",
"Starting stock: 96\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-22 00:00:00\n",
"Starting stock: 85\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-23 00:00:00\n",
"Starting stock: 76\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-24 00:00:00\n",
"Starting stock: 67\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-25 00:00:00\n",
"Starting stock: 56\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-26 00:00:00\n",
"Starting stock: 47\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-27 00:00:00\n",
"Starting stock: 36\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-28 00:00:00\n",
"Starting stock: 27\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-29 00:00:00\n",
"Starting stock: 16\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-09-30 00:00:00\n",
"Starting stock: 8\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-01 00:00:00\n",
"Starting stock: -1\n",
"Generated demand for today: 11\n",
"Goods received today: 100\n",
"Placing a new order: Order of 100, requested on 2022-10-01 00:00:00, delivery on 2022-10-12 00:00:00.\n",
"Simulating day: 2022-10-02 00:00:00\n",
"Starting stock: 88\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-03 00:00:00\n",
"Starting stock: 78\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-04 00:00:00\n",
"Starting stock: 67\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-05 00:00:00\n",
"Starting stock: 55\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-06 00:00:00\n",
"Starting stock: 44\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-07 00:00:00\n",
"Starting stock: 34\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-08 00:00:00\n",
"Starting stock: 26\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-09 00:00:00\n",
"Starting stock: 16\n",
"Generated demand for today: 7\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-10 00:00:00\n",
"Starting stock: 9\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-11 00:00:00\n",
"Starting stock: -2\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-12 00:00:00\n",
"Starting stock: -14\n",
"Generated demand for today: 9\n",
"Goods received today: 100\n",
"Placing a new order: Order of 100, requested on 2022-10-12 00:00:00, delivery on 2022-10-22 00:00:00.\n",
"Simulating day: 2022-10-13 00:00:00\n",
"Starting stock: 77\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-14 00:00:00\n",
"Starting stock: 66\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-15 00:00:00\n",
"Starting stock: 57\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-16 00:00:00\n",
"Starting stock: 47\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-17 00:00:00\n",
"Starting stock: 38\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-18 00:00:00\n",
"Starting stock: 27\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-19 00:00:00\n",
"Starting stock: 17\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-20 00:00:00\n",
"Starting stock: 8\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-21 00:00:00\n",
"Starting stock: -3\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-22 00:00:00\n",
"Starting stock: -13\n",
"Generated demand for today: 9\n",
"Goods received today: 100\n",
"Placing a new order: Order of 100, requested on 2022-10-22 00:00:00, delivery on 2022-11-02 00:00:00.\n",
"Simulating day: 2022-10-23 00:00:00\n",
"Starting stock: 78\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-24 00:00:00\n",
"Starting stock: 68\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-25 00:00:00\n",
"Starting stock: 57\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-26 00:00:00\n",
"Starting stock: 48\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-27 00:00:00\n",
"Starting stock: 38\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-28 00:00:00\n",
"Starting stock: 26\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-29 00:00:00\n",
"Starting stock: 16\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-30 00:00:00\n",
"Starting stock: 8\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-10-31 00:00:00\n",
"Starting stock: -1\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-01 00:00:00\n",
"Starting stock: -13\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-02 00:00:00\n",
"Starting stock: -23\n",
"Generated demand for today: 9\n",
"Goods received today: 100\n",
"Placing a new order: Order of 100, requested on 2022-11-02 00:00:00, delivery on 2022-11-12 00:00:00.\n",
"Simulating day: 2022-11-03 00:00:00\n",
"Starting stock: 68\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-04 00:00:00\n",
"Starting stock: 57\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-05 00:00:00\n",
"Starting stock: 47\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-06 00:00:00\n",
"Starting stock: 36\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-07 00:00:00\n",
"Starting stock: 27\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-08 00:00:00\n",
"Starting stock: 17\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-09 00:00:00\n",
"Starting stock: 6\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-10 00:00:00\n",
"Starting stock: -4\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-11 00:00:00\n",
"Starting stock: -14\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-12 00:00:00\n",
"Starting stock: -25\n",
"Generated demand for today: 12\n",
"Goods received today: 100\n",
"Placing a new order: Order of 100, requested on 2022-11-12 00:00:00, delivery on 2022-11-21 00:00:00.\n",
"Simulating day: 2022-11-13 00:00:00\n",
"Starting stock: 63\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-14 00:00:00\n",
"Starting stock: 54\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-15 00:00:00\n",
"Starting stock: 44\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-16 00:00:00\n",
"Starting stock: 34\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-17 00:00:00\n",
"Starting stock: 24\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-18 00:00:00\n",
"Starting stock: 14\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-19 00:00:00\n",
"Starting stock: 3\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-20 00:00:00\n",
"Starting stock: -7\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-21 00:00:00\n",
"Starting stock: -17\n",
"Generated demand for today: 11\n",
"Goods received today: 100\n",
"Placing a new order: Order of 100, requested on 2022-11-21 00:00:00, delivery on 2022-12-01 00:00:00.\n",
"Simulating day: 2022-11-22 00:00:00\n",
"Starting stock: 73\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-23 00:00:00\n",
"Starting stock: 64\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-24 00:00:00\n",
"Starting stock: 55\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-25 00:00:00\n",
"Starting stock: 45\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-26 00:00:00\n",
"Starting stock: 35\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-27 00:00:00\n",
"Starting stock: 26\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-28 00:00:00\n",
"Starting stock: 16\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-29 00:00:00\n",
"Starting stock: 5\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-11-30 00:00:00\n",
"Starting stock: -6\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-01 00:00:00\n",
"Starting stock: -17\n",
"Generated demand for today: 12\n",
"Goods received today: 100\n",
"Placing a new order: Order of 100, requested on 2022-12-01 00:00:00, delivery on 2022-12-09 00:00:00.\n",
"Simulating day: 2022-12-02 00:00:00\n",
"Starting stock: 71\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-03 00:00:00\n",
"Starting stock: 60\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-04 00:00:00\n",
"Starting stock: 51\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-05 00:00:00\n",
"Starting stock: 40\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-06 00:00:00\n",
"Starting stock: 31\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-07 00:00:00\n",
"Starting stock: 20\n",
"Generated demand for today: 12\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-08 00:00:00\n",
"Starting stock: 8\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-09 00:00:00\n",
"Starting stock: -3\n",
"Generated demand for today: 12\n",
"Goods received today: 100\n",
"Placing a new order: Order of 100, requested on 2022-12-09 00:00:00, delivery on 2022-12-18 00:00:00.\n",
"Simulating day: 2022-12-10 00:00:00\n",
"Starting stock: 86\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-11 00:00:00\n",
"Starting stock: 76\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-12 00:00:00\n",
"Starting stock: 66\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-13 00:00:00\n",
"Starting stock: 56\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-14 00:00:00\n",
"Starting stock: 46\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-15 00:00:00\n",
"Starting stock: 36\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-16 00:00:00\n",
"Starting stock: 27\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-17 00:00:00\n",
"Starting stock: 17\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-18 00:00:00\n",
"Starting stock: 7\n",
"Generated demand for today: 9\n",
"Goods received today: 100\n",
"Placing a new order: Order of 100, requested on 2022-12-18 00:00:00, delivery on 2022-12-27 00:00:00.\n",
"Simulating day: 2022-12-19 00:00:00\n",
"Starting stock: 98\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-20 00:00:00\n",
"Starting stock: 88\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-21 00:00:00\n",
"Starting stock: 77\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-22 00:00:00\n",
"Starting stock: 66\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-23 00:00:00\n",
"Starting stock: 56\n",
"Generated demand for today: 9\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-24 00:00:00\n",
"Starting stock: 47\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-25 00:00:00\n",
"Starting stock: 36\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-26 00:00:00\n",
"Starting stock: 27\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-27 00:00:00\n",
"Starting stock: 16\n",
"Generated demand for today: 8\n",
"Goods received today: 100\n",
"Simulating day: 2022-12-28 00:00:00\n",
"Starting stock: 108\n",
"Generated demand for today: 8\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-29 00:00:00\n",
"Starting stock: 100\n",
"Generated demand for today: 11\n",
"Goods received today: 0\n",
"Placing a new order: Order of 100, requested on 2022-12-29 00:00:00, delivery on 2023-01-09 00:00:00.\n",
"Simulating day: 2022-12-30 00:00:00\n",
"Starting stock: 89\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n",
"Simulating day: 2022-12-31 00:00:00\n",
"Starting stock: 79\n",
"Generated demand for today: 10\n",
"Goods received today: 0\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"# That was a simulation of a full year with the passed parameters. If you go \n",
"# carefully through the output, you can see the stock, demand and goods received\n",
"# on each date, as well as the placing of orders."
],
"metadata": {
"id": "UkFu2DpXoj99"
},
"execution_count": 8,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"#### Simulation Results"
],
"metadata": {
"id": "Fg4955v-p56d"
}
},
{
"cell_type": "code",
"source": [
"# The SimulationResults objects allows to get some summarized statistics from \n",
"# a simulation. For example, let's plot the stock in the warehouse over that \n",
"# simulation.\n",
"\n",
"example_simulation_results.plot_stock_history()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 265
},
"id": "svQJQPCZoxFK",
"outputId": "d17e6edc-d51c-41f4-8669-9438bf870fef"
},
"execution_count": 9,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"# We can also visualize the distribution of the stock level during the full year\n",
"\n",
"example_simulation_results.plot_stock_distribution()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 265
},
"id": "b5ANCHLmrT6t",
"outputId": "01e1f1cd-459a-4cfc-8ef3-78a6c2ec99c9"
},
"execution_count": 10,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"# And check the details of the distribution\n",
"\n",
"example_simulation_results.stock_level_summary()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ekTLMm_6salj",
"outputId": "6f1a3f50-bbbd-49eb-95ca-f1bb8b5e5a10"
},
"execution_count": 11,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" 0\n",
"count 365.000000\n",
"mean 54.411392\n",
"std 32.615996\n",
"min -24.762915\n",
"25% 29.047827\n",
"50% 54.524196\n",
"75% 79.744893\n",
"max 121.614883\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"# SimulationResults contains some other helpful functions. See the examples \n",
"# below:\n",
"\n",
"service_level = example_simulation_results.service_level()\n",
"mean_stock_level = example_simulation_results.mean_stock_level()\n",
"median_stock_level = example_simulation_results.median_stock_level()\n",
"stdev_stock_level = example_simulation_results.stdev_stock_level()\n",
"number_of_purchase_orders = example_simulation_results.number_of_purchase_orders_placed()\n",
"\n",
"\n",
"print(f\"Demand was properly satisfied on {service_level * 100}% of simulated days.\")\n",
"print(f\"The mean and median stock level were: {mean_stock_level} and {median_stock_level}.\")\n",
"print(f\"There was a total of {number_of_purchase_orders} orders during the simulation.\")"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "3nORekD6ptpB",
"outputId": "770cf04f-c722-4cf0-fb04-7bab92a11287"
},
"execution_count": 12,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Demand was properly satisfied on 95.06849315068493% of simulated days.\n",
"The mean and median stock level were: 54.41139166431389 and 54.52419638372521.\n",
"There was a total of 37 orders during the simulation.\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"### Your turn\n",
"\n",
"Now that you are familiar with the provided simulation objects, use them to answer Elisa's requests on level 2."
],
"metadata": {
"id": "GMzPWTWF7kdi"
}
},
{
"cell_type": "code",
"source": [
"# Your code goes in cells in this section"
],
"metadata": {
"id": "PpS5hsrP8Tw5"
},
"execution_count": 13,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"## Level 3\n",
"\n",
"From the case description:\n",
"\n",
" - Right after you finished designing your policy for level 2, Elisa called\n",
" with some news: she has just been informed by the management in Diemen\n",
" that a new Minimum Order Quantity (MOQ) rule will begin soon. This rule\n",
" means that, when the Caserta warehouse places an order to request\n",
" material from, the order should be of at least 500,000 kgs of beans, and\n",
" not less than that.\n",
" - Elisa wants you to take this into account. Does it affect the policy you\n",
" proposed for level 2? If so, you need to come up with a new one that\n",
" adapts to this rule and compare it to the previous one."
],
"metadata": {
"id": "mjVrfdcE8Wos"
}
},
{
"cell_type": "code",
"source": [
"# Your code goes in cells in this section"
],
"metadata": {
"id": "jRAEfGGu8hUs"
},
"execution_count": 14,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"## Level 4\n",
"\n",
"From the case description:\n",
"\n",
" - Elisa briefly discussed with you in one meeting that there is an option\n",
" to come to an agreement with the team in Diemen to improve the lead time\n",
" stability. The proposal from Diemen is that, if the target lead time was\n",
" set to something higher that the current 7 days target, providing a more\n",
" stable delivery would be feasible.\n",
" - The specific proposal from Diemen is: if the lead time target is changed\n",
" to 15 days, they provide a 100% guarantee that orders will be delivered\n",
" in exactly 15 days.\n",
" - Elisa would love if you could take some additional time to study this\n",
" proposal. What is better for Caserta? The current 7 days target\n",
" lead-time, with unstable deliveries? Or a fixed, 15-day lead time?\n",
" - The MOQ rule of level 3 still applies."
],
"metadata": {
"id": "gVQE6YOq-Ic0"
}
},
{
"cell_type": "code",
"source": [
"# Your code goes in cells in this section"
],
"metadata": {
"id": "0q7asO3L-ieE"
},
"execution_count": 15,
"outputs": []
}
]
}