2256 lines
No EOL
154 KiB
Text
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": []
|
|
}
|
|
]
|
|
} |