{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "9hBrO0SNlv6f",
"tags": []
},
"source": [
"```{index} single: AMPL; sets\n",
"```\n",
"```{index} single: solver; highs\n",
"```\n",
"```{index} single: application; production planning\n",
"```\n",
"```{index} single: application; demand forecasts\n",
"```\n",
"```{index} pandas dataframe\n",
"```\n",
"\n",
"# BIM production using demand forecasts"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"id": "yTpDN8LKRX8X",
"outputId": "c286c270-0647-470f-c776-213c0410a726",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Using default Community Edition License for Colab. Get yours at: https://ampl.com/ce\n",
"Licensed to AMPL Community Edition License for the AMPL Model Colaboratory (https://colab.ampl.com).\n"
]
}
],
"source": [
"# install dependencies and select solver\n",
"%pip install -q amplpy numpy matplotlib\n",
"\n",
"SOLVER = \"highs\"\n",
"\n",
"from amplpy import AMPL, ampl_notebook\n",
"\n",
"ampl = ampl_notebook(\n",
" modules=[\"highs\"], # modules to install\n",
" license_uuid=\"default\", # license to use\n",
") # instantiate AMPL object and register magics"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "r2U31yV2RX8a"
},
"source": [
"## The problem: Optimal material acquisition and production planning using demand forecasts\n",
"\n",
"This example is a continuation of the BIM chip production problem illustrated [here](bim.ipynb). Recall hat BIM produces logic and memory chips using copper, silicon, germanium, and plastic and that each chip requires the following quantities of raw materials:\n",
"\n",
"| chip | copper | silicon | germanium | plastic |\n",
"|:-------|-------:|--------:|----------:|--------:|\n",
"|logic | 0.4 | 1 | - | 1 |\n",
"|memory | 0.2 | - | 1 | 1 |\n",
"\n",
"BIM needs to carefully manage the acquisition and inventory of these raw materials based on the forecasted demand for the chips. Data analysis led to the following prediction of monthly demands:\n",
"\n",
"| chip | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec |\n",
"|:-------|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|\n",
"|logic | 88 | 125 | 260 | 217 | 238 | 286 | 248 | 238 | 265 | 293 | 259 | 244 |\n",
"|memory | 47 | 62 | 81 | 65 | 95 | 118 | 86 | 89 | 82 | 82 | 84 | 66 |\n",
"\n",
"At the beginning of the year, BIM has the following stock:\n",
"\n",
"|copper|silicon|germanium|plastic|\n",
"|-----:|------:|--------:|------:|\n",
"| 480| 1000 | 1500| 1750 |\n",
"\n",
"The company would like to have at least the following stock at the end of the year:\n",
"\n",
"|copper|silicon|germanium|plastic|\n",
"|-----:|------:|--------:|------:|\n",
"| 200| 500 | 500| 1000 |\n",
"\n",
"Each raw material can be acquired at each month, but the unit prices vary as follows:\n",
"\n",
"| product | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec |\n",
"|:---------|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|\n",
"|copper | 1 | 1 | 1 | 2 | 2 | 3 | 3 | 2 | 2 | 1 | 1 | 2 |\n",
"|silicon | 4 | 3 | 3 | 3 | 5 | 5 | 6 | 5 | 4 | 3 | 3 | 5 |\n",
"|germanium | 5 | 5 | 5 | 3 | 3 | 3 | 3 | 2 | 3 | 4 | 5 | 6 |\n",
"|plastic | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 |\n",
"\n",
"The inventory is limited by a capacity of a total of 9000 units per month, regardless of the type of material of products in stock. The holding costs of the inventory are 0.05 per unit per month regardless of the material type. Due to budget constraints, BIM cannot spend more than 5000 per month on acquisition.\n",
"\n",
"BIM aims at minimizing the acquisition and holding costs of the materials while meeting the required quantities for production. The production is made to order, meaning that no inventory of chips is kept.\n",
"\n",
"Let us model the material acquisition planning and solve it optimally based on the forecasted chip demand above."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "26k2j4ifRX8d"
},
"source": [
"Let us first import both the price and forecast chip demand as Pandas dataframes."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 332
},
"id": "rvWwY74i7qEy",
"outputId": "499b7523-47b1-4b75-ea3f-e98097a20904"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
" Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\n",
"chip \n",
"logic 88 125 260 217 238 286 248 238 265 293 259 244\n",
"memory 47 62 81 65 95 118 86 89 82 82 84 66"
],
"text/html": [
"\n",
"
\n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Jan \n",
" Feb \n",
" Mar \n",
" Apr \n",
" May \n",
" Jun \n",
" Jul \n",
" Aug \n",
" Sep \n",
" Oct \n",
" Nov \n",
" Dec \n",
" \n",
" \n",
" chip \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" logic \n",
" 88 \n",
" 125 \n",
" 260 \n",
" 217 \n",
" 238 \n",
" 286 \n",
" 248 \n",
" 238 \n",
" 265 \n",
" 293 \n",
" 259 \n",
" 244 \n",
" \n",
" \n",
" memory \n",
" 47 \n",
" 62 \n",
" 81 \n",
" 65 \n",
" 95 \n",
" 118 \n",
" 86 \n",
" 89 \n",
" 82 \n",
" 82 \n",
" 84 \n",
" 66 \n",
" \n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
]
},
"metadata": {}
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\n",
"product \n",
"copper 1.0 1.0 1.0 2.0 2.0 3.0 3.0 2.0 2.0 1.0 1.0 2.0\n",
"silicon 4.0 3.0 3.0 3.0 5.0 5.0 6.0 5.0 4.0 3.0 3.0 5.0\n",
"germanium 5.0 5.0 5.0 3.0 3.0 3.0 3.0 2.0 3.0 4.0 5.0 6.0\n",
"plastic 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1"
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Jan \n",
" Feb \n",
" Mar \n",
" Apr \n",
" May \n",
" Jun \n",
" Jul \n",
" Aug \n",
" Sep \n",
" Oct \n",
" Nov \n",
" Dec \n",
" \n",
" \n",
" product \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" copper \n",
" 1.0 \n",
" 1.0 \n",
" 1.0 \n",
" 2.0 \n",
" 2.0 \n",
" 3.0 \n",
" 3.0 \n",
" 2.0 \n",
" 2.0 \n",
" 1.0 \n",
" 1.0 \n",
" 2.0 \n",
" \n",
" \n",
" silicon \n",
" 4.0 \n",
" 3.0 \n",
" 3.0 \n",
" 3.0 \n",
" 5.0 \n",
" 5.0 \n",
" 6.0 \n",
" 5.0 \n",
" 4.0 \n",
" 3.0 \n",
" 3.0 \n",
" 5.0 \n",
" \n",
" \n",
" germanium \n",
" 5.0 \n",
" 5.0 \n",
" 5.0 \n",
" 3.0 \n",
" 3.0 \n",
" 3.0 \n",
" 3.0 \n",
" 2.0 \n",
" 3.0 \n",
" 4.0 \n",
" 5.0 \n",
" 6.0 \n",
" \n",
" \n",
" plastic \n",
" 0.1 \n",
" 0.1 \n",
" 0.1 \n",
" 0.1 \n",
" 0.1 \n",
" 0.1 \n",
" 0.1 \n",
" 0.1 \n",
" 0.1 \n",
" 0.1 \n",
" 0.1 \n",
" 0.1 \n",
" \n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
]
},
"metadata": {},
"execution_count": 2
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from io import StringIO\n",
"import pandas as pd\n",
"\n",
"demand_data = \"\"\"chip,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec\n",
"logic,88,125,260,217,238,286,248,238,265,293,259,244\n",
"memory,47,62,81,65,95,118,86,89,82,82,84,66\"\"\"\n",
"price_data = \"\"\"product,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec\n",
"copper,1,1,1,2,2,3,3,2,2,1,1,2\n",
"silicon,4,3,3,3,5,5,6,5,4,3,3,5\n",
"germanium,5,5,5,3,3,3,3,2,3,4,5,6\n",
"plastic,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1\"\"\"\n",
"\n",
"demand_chips = pd.read_csv(StringIO(demand_data), index_col=\"chip\")\n",
"display(demand_chips)\n",
"\n",
"price = pd.read_csv(StringIO(price_data), index_col=\"product\")\n",
"price"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tm2MaCYUlv6j"
},
"source": [
"We can also add a small dataframe with the consumptions and obtain the monthly demand for each raw material using a simple matrix multiplication."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 332
},
"id": "I0Wl0BXOlv6j",
"outputId": "1ed8c1ff-3da9-4aca-c2df-43e37c1b4b57"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
" logic memory\n",
"silicon 1 0\n",
"plastic 1 1\n",
"copper 4 2\n",
"germanium 0 1"
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" logic \n",
" memory \n",
" \n",
" \n",
" \n",
" \n",
" silicon \n",
" 1 \n",
" 0 \n",
" \n",
" \n",
" plastic \n",
" 1 \n",
" 1 \n",
" \n",
" \n",
" copper \n",
" 4 \n",
" 2 \n",
" \n",
" \n",
" germanium \n",
" 0 \n",
" 1 \n",
" \n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
]
},
"metadata": {}
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\n",
"silicon 88 125 260 217 238 286 248 238 265 293 259 244\n",
"plastic 135 187 341 282 333 404 334 327 347 375 343 310\n",
"copper 446 624 1202 998 1142 1380 1164 1130 1224 1336 1204 1108\n",
"germanium 47 62 81 65 95 118 86 89 82 82 84 66"
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Jan \n",
" Feb \n",
" Mar \n",
" Apr \n",
" May \n",
" Jun \n",
" Jul \n",
" Aug \n",
" Sep \n",
" Oct \n",
" Nov \n",
" Dec \n",
" \n",
" \n",
" \n",
" \n",
" silicon \n",
" 88 \n",
" 125 \n",
" 260 \n",
" 217 \n",
" 238 \n",
" 286 \n",
" 248 \n",
" 238 \n",
" 265 \n",
" 293 \n",
" 259 \n",
" 244 \n",
" \n",
" \n",
" plastic \n",
" 135 \n",
" 187 \n",
" 341 \n",
" 282 \n",
" 333 \n",
" 404 \n",
" 334 \n",
" 327 \n",
" 347 \n",
" 375 \n",
" 343 \n",
" 310 \n",
" \n",
" \n",
" copper \n",
" 446 \n",
" 624 \n",
" 1202 \n",
" 998 \n",
" 1142 \n",
" 1380 \n",
" 1164 \n",
" 1130 \n",
" 1224 \n",
" 1336 \n",
" 1204 \n",
" 1108 \n",
" \n",
" \n",
" germanium \n",
" 47 \n",
" 62 \n",
" 81 \n",
" 65 \n",
" 95 \n",
" 118 \n",
" 86 \n",
" 89 \n",
" 82 \n",
" 82 \n",
" 84 \n",
" 66 \n",
" \n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
]
},
"metadata": {},
"execution_count": 3
}
],
"source": [
"use = dict()\n",
"use[\"logic\"] = {\"silicon\": 1, \"plastic\": 1, \"copper\": 4}\n",
"use[\"memory\"] = {\"germanium\": 1, \"plastic\": 1, \"copper\": 2}\n",
"use = pd.DataFrame.from_dict(use).fillna(0).astype(int)\n",
"display(use)\n",
"\n",
"demand = use.dot(demand_chips)\n",
"demand"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "vdP8MDxkRX8k"
},
"source": [
"## The optimization model\n",
"\n",
"Define the set of raw material $P=\\{\\text{copper},\\text{silicon},\\text{germanium},\\text{plastic}\\}$ and $T$ the set of the $12$ months of the year. Let\n",
"\n",
"- $x_{pt} \\geq 0$ be the variable describing the amount of raw material $p \\in P$ acquired in month $t \\in T$;\n",
"\n",
"- $s_{pt} \\geq 0$ be the variable describing the amount of raw material $p \\in P$ left in stock at the end of month $t \\in T$. Note that these values are uniquely determined by the $x$ variables, but we keep these additional variables to ease the modeling.\n",
"\n",
"The total cost is the objective function of our optimal acquisition and production problem. If $\\pi_{pt}$ is the unit price of product $p \\in P$ in month $t \\in T$ and $h_{pt}$ the unit holding costs (which happen to be constant) we can express the total cost as:\n",
"\n",
"$$\n",
" \\sum_{p\\in P}\\sum_{t \\in T}\\pi_{pt}x_{pt} + \\sum_{p\\in P}\\sum_{t \\in T} h_{pt} s_{pt}.\n",
"$$\n",
"\n",
"Let us now focus on the constraints. If $\\beta \\geq 0$ denotes the monthly acquisition budget, the budget constraint can be expressed as:\n",
"\n",
"$$\n",
" \\sum_{p\\in P} \\pi_{pt}x_{pt} \\leq \\beta \\quad \\forall t \\in T.\n",
"$$\n",
"\n",
"Further, we constrain the inventory to be always the storage capacity $\\ell \\geq 0$ using:\n",
"\n",
"$$\n",
" \\sum_{p\\in P} s_{pt} \\leq \\ell \\quad \\forall t \\in T.\n",
"$$\n",
"\n",
"Next, we add another constraint to fix the value of the variables $s_{pt}$ by balancing the acquired amounts with the previous inventory and the demand $\\delta_{pt}$ which for each month is implied by the total demand for the chips of both types. Note that $t-1$ is defined as the initial stock when $t$ is the first period, that is \\texttt{January}. This can be obtained with additional variables $s$ made equal to those values or with a rule that specializes, as in the code below. \n",
"\n",
"$$\n",
" x_{pt} + s_{p,t-1} = \\delta_{pt} + s_{pt} \\quad \\forall p \\in P, t \\in T.\n",
"$$\n",
"\n",
"Finally, we capture the required minimum inventory levels in December with the constraint.\n",
"\n",
"$$\n",
" s_{p \\textrm{Dec}} \\geq \\Omega_p \\quad \\forall p \\in P,\n",
"$$\n",
"\n",
"where $(\\Omega_p)_{p \\in P}$ is the vector with the desired end inventories.\n",
"\n",
"Here is the AMPL implementation of this LP."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"id": "Wmw8D1E7RX8l",
"outputId": "34c5a422-5eb8-49b9-e811-3099cf8b364e",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Overwriting BIMProductAcquisitionAndInventory.mod\n"
]
}
],
"source": [
"%%writefile BIMProductAcquisitionAndInventory.mod\n",
"\n",
"set T ordered;\n",
"set P;\n",
"\n",
"var x{P, T} >= 0;\n",
"var s{P, T} >= 0;\n",
"\n",
"param pi{P, T};\n",
"param h{P, T} default 0.05;\n",
"param delta{P, T};\n",
"param existing{P};\n",
"param desired{P};\n",
"param month_budget;\n",
"param stock_limit;\n",
"\n",
"var acquisition_cost = sum{p in P, t in T} pi[p,t] * x[p,t];\n",
"var inventory_cost = sum{p in P, t in T} h[p,t] * s[p,t];\n",
"\n",
"minimize total_cost: acquisition_cost + inventory_cost;\n",
"\n",
"s.t. balance {p in P, t in T}:\n",
" (if t == first(T) then\n",
" existing[p] + x[p,t]\n",
" else\n",
" x[p,t] + s[p,prev(t)])\n",
" == delta[p,t] + s[p,t];\n",
"s.t. finish {p in P}: s[p, last(T)] >= desired[p];\n",
"s.t. inventory {t in T}: sum{p in P} s[p,t] <= stock_limit;\n",
"s.t. budget {t in T}: sum{p in P} pi[p,t] * x[p,t] <= month_budget;"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"id": "Fh4-5RMORX8n"
},
"outputs": [],
"source": [
"def ShowTableOfAmplVariables(m, X):\n",
" P = m.set[\"P\"].to_list()\n",
" T = m.set[\"T\"].to_list()\n",
"\n",
" df = pd.DataFrame(m.var[X].to_list(), columns=[\"P\", \"T\", \"values\"]).round(\n",
" decimals=2\n",
" )\n",
" df = df.pivot(index=\"P\", columns=\"T\", values=\"values\")\n",
" df = df.reindex(P)\n",
" df = df[T]\n",
"\n",
" return df\n",
"\n",
"\n",
"def BIMProductAcquisitionAndInventory(\n",
" demand, acquisition_price, existing, desired, stock_limit, month_budget\n",
"):\n",
" m = AMPL()\n",
" m.read(\"BIMProductAcquisitionAndInventory.mod\")\n",
" m.set[\"T\"] = list(demand.columns)\n",
" m.set[\"P\"] = demand.index.values\n",
" m.param[\"pi\"] = acquisition_price\n",
" m.param[\"delta\"] = demand\n",
" m.param[\"existing\"] = existing\n",
" m.param[\"desired\"] = desired\n",
" m.param[\"month_budget\"] = month_budget\n",
" m.param[\"stock_limit\"] = stock_limit\n",
"\n",
" return m"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kBam8g-jRX8o"
},
"source": [
"We now can create an instance of the model using the provided data and solve it."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"id": "Wk9DTUU4RX8p",
"outputId": "96c4b4d7-5a40-4682-c4bf-d4f3a366bde7",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 951
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"HiGHS 1.5.3: \b\b\b\b\b\b\b\b\b\b\b\b\bHiGHS 1.5.3: optimal solution; objective 21152.655\n",
"29 simplex iterations\n",
"0 barrier iterations\n",
" \n",
"\n",
"The optimal amount of raw materials to acquire in each month is:\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"T Jan Feb Mar Apr May Jun Jul Aug Sep Oct \\\n",
"P \n",
"silicon 0.0 0.0 0.0 965.0 0.0 0.0 0.0 0.0 0.0 1078.1 \n",
"plastic 0.0 0.0 0.0 0.0 0.0 0.0 266.0 327.0 347.0 375.0 \n",
"copper 0.0 0.0 3548.0 0.0 0.0 0.0 0.0 0.0 962.0 1336.0 \n",
"germanium 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"\n",
"T Nov Dec \n",
"P \n",
"silicon 217.9 0.0 \n",
"plastic 343.0 1310.0 \n",
"copper 4312.0 0.0 \n",
"germanium 0.0 0.0 "
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" T \n",
" Jan \n",
" Feb \n",
" Mar \n",
" Apr \n",
" May \n",
" Jun \n",
" Jul \n",
" Aug \n",
" Sep \n",
" Oct \n",
" Nov \n",
" Dec \n",
" \n",
" \n",
" P \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" silicon \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 965.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 1078.1 \n",
" 217.9 \n",
" 0.0 \n",
" \n",
" \n",
" plastic \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 266.0 \n",
" 327.0 \n",
" 347.0 \n",
" 375.0 \n",
" 343.0 \n",
" 1310.0 \n",
" \n",
" \n",
" copper \n",
" 0.0 \n",
" 0.0 \n",
" 3548.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 962.0 \n",
" 1336.0 \n",
" 4312.0 \n",
" 0.0 \n",
" \n",
" \n",
" germanium \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" \n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
]
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"\n",
"The corresponding optimal stock levels in each months are:\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"T Jan Feb Mar Apr May Jun Jul Aug \\\n",
"P \n",
"silicon 912.0 787.0 527.0 1275.0 1037.0 751.0 503.0 265.0 \n",
"plastic 1615.0 1428.0 1087.0 805.0 472.0 68.0 0.0 0.0 \n",
"copper 4354.0 3730.0 6076.0 5078.0 3936.0 2556.0 1392.0 262.0 \n",
"germanium 1453.0 1391.0 1310.0 1245.0 1150.0 1032.0 946.0 857.0 \n",
"\n",
"T Sep Oct Nov Dec \n",
"P \n",
"silicon 0.0 785.1 744.0 500.0 \n",
"plastic 0.0 0.0 0.0 1000.0 \n",
"copper 0.0 0.0 3108.0 2000.0 \n",
"germanium 775.0 693.0 609.0 543.0 "
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" T \n",
" Jan \n",
" Feb \n",
" Mar \n",
" Apr \n",
" May \n",
" Jun \n",
" Jul \n",
" Aug \n",
" Sep \n",
" Oct \n",
" Nov \n",
" Dec \n",
" \n",
" \n",
" P \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" silicon \n",
" 912.0 \n",
" 787.0 \n",
" 527.0 \n",
" 1275.0 \n",
" 1037.0 \n",
" 751.0 \n",
" 503.0 \n",
" 265.0 \n",
" 0.0 \n",
" 785.1 \n",
" 744.0 \n",
" 500.0 \n",
" \n",
" \n",
" plastic \n",
" 1615.0 \n",
" 1428.0 \n",
" 1087.0 \n",
" 805.0 \n",
" 472.0 \n",
" 68.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" 1000.0 \n",
" \n",
" \n",
" copper \n",
" 4354.0 \n",
" 3730.0 \n",
" 6076.0 \n",
" 5078.0 \n",
" 3936.0 \n",
" 2556.0 \n",
" 1392.0 \n",
" 262.0 \n",
" 0.0 \n",
" 0.0 \n",
" 3108.0 \n",
" 2000.0 \n",
" \n",
" \n",
" germanium \n",
" 1453.0 \n",
" 1391.0 \n",
" 1310.0 \n",
" 1245.0 \n",
" 1150.0 \n",
" 1032.0 \n",
" 946.0 \n",
" 857.0 \n",
" 775.0 \n",
" 693.0 \n",
" 609.0 \n",
" 543.0 \n",
" \n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
]
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"\n",
"The stock levels can be visualized as follows\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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T5+uq6++uszbeuutt3TZZZdpwIABat68ue6///7g/Bbt2rXTkiVLtHjxYl1yySWaNGmS0tPTQybwRCF6YAAAAAAAcIJmzZppxYoVJ103f/78kPtr1qwJub979+6Q+9WqVdMrr7xyyufq37+/+vfvf8r1J25PKpwc9HxDDwwAAAAAAGB7FDAAAAAAAIDtUcAAAAAAAAC2RwEDAAAAAADYHgUMAAAAAABgexQwAAAAAACA7VHAAAAAAAAAtkcBAwAAAAAA2B4FDAAAAAAAYHsUMAAAAAAAKKMGDRro2WefPafP0aVLF40dO/acPkckcVgdAAAAAAAA57M1a9aoa9euOnz4sKpUqRJc/vbbb8vpdFoXmM1QwAAAAAAAwIaqVatmdQi2whASAAAAAABO0KVLF40ePVqjR49W5cqVdcEFF+jhhx+WaZonbf/MM8+oZcuWio+PV0pKiu644w4dO3YsuP4///mPrr32WlWtWlXx8fFq0aKFli9frt27d6tr166SpKpVq8owDA0ZMiQYQ/EhJPn5+Ro/frxSUlIUExOjRo0aae7cuecsB3ZDDwwAFY7H77E6hFPy+/3yml55/B755LM6nNNyO9wyDMPqMAAAQEVjmpIvt/B2IFB42xstRZXD7+vOOKkM328WLFigYcOGacOGDfriiy80YsQI1atXT7fddluJtlFRUZo1a5YaNmyof//737rjjjt0//3364UXXpAkjRo1Sl6vV2vXrlV8fLy2b9+uhIQEpaSk6K233lL//v21c+dOJSYmyu12nzSeQYMGKSsrS7NmzVLr1q21a9cu/fe///1tuYhAZSpgTJ48WVOmTAlZ1rRpU3377beSpLy8PN1zzz1avHix8vPzlZaWphdeeEFJSUnB9nv27NHIkSP10UcfKSEhQYMHD9bUqVPlcPwaypo1azRu3Dht27ZNKSkpmjhxYrACBQBn0mVJF6tDOKP0JelWh3BGbWu21YLeCyhiAACA8PLlSk/UllQ4JKBKeT73gz9KrvhSN09JSdGMGTNkGIaaNm2qrVu3asaMGSctYBTvKdGgQQM99thjuv3224MFjD179qh///5q2bKlJOnCCy8Mti8aKlKzZs2QOTCK++6777RkyRJlZmaqR48eJbZxPihziatFixbav39/8N+nn34aXHf33Xfrvffe0xtvvKGPP/5YP/74o2644Ybg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AAARoUxDSPbt26cBAwbo0KFDqlGjhq644gqtW7dONWrUkCTNmDFDUVFR6t+/v/Lz85WWlqYXXngh+Pjo6Gi9//77GjlypFJTUxUfH6/BgwcrPT092KZhw4ZatmyZ7r77bs2cOVN169bVyy+/zCVUAQAAAADl5sThG7BemQoYixcvPu362NhYPf/883r++edP2aZ+/fpavnz5abfTpUsXbd68uSyhAQAAAACACsw+s3oAAAAAAACcAgUMAAAAAABgexQwAAAAAACA7VHAAAAAAAAAtkcBAwAAAAAA2B4FDAAAAAAAYHsUMAAAAAAAgO1RwAAAAAAAoIIoKChQIBCwOoxzggIGAAAAAAAnEQgE9OSTT6pRo0aKiYlRvXr19Pjjj0uStm7dqm7dusntdqt69eoaMWKEjh07FnzskCFD1K9fP02ZMkU1atRQYmKibr/9dnm93mCbLl26aPTo0Ro9erQqV66sCy64QA8//LBM0wy2yc/P17333qs6deooPj5eHTp00Jo1a4Lr58+frypVqmjp0qW65JJLlJSUpD179pz75FjAYXUAAAAAAIDzh2ma8vg9kgoLBB6/Rw6fQ1FR5/73dbfDLcMwSt1+woQJeumllzRjxgxdccUV2r9/v7799lsdP35caWlpSk1N1caNG3Xw4EENHz5co0eP1vz584OPX7VqlWJjY7VmzRrt3r1bf/rTn1S9evVgEUSSFixYoGHDhmnDhg364osvNGLECNWrV0+33XabJGn06NHavn27Fi9erNq1a+udd95R7969tXXrVjVu3FiSlJubq2nTpulvf/ubYmJiVLNmzfAkzGYoYAAAAAAAyo3H71GHRR0see71f1ivOGdcqdoePXpUM2fO1OzZszV48GBJ0kUXXaQrrrhCL730kvLy8vTqq68qPj5ekjR79mxde+21mjZtmpKSkiRJLpdLr7zyiuLi4tSiRQulp6frvvvu06OPPhos2KSkpGjGjBkyDENNmzbV1q1bNWPGDN12223as2eP5s2bpz179qh27dqSpHvvvVcrVqzQvHnz9MQTT0iSfD6fXnjhBbVs2VI5OTmKiyvdPkYahpAAAAAAAHCCHTt2KD8/X927dz/putatWweLF5LUqVMnBQIB7dy5M7isdevWIcWE1NRUHTt2THv37g0u69ixY0ivkNTUVH3//fcqKCjQ1q1bVVBQ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hlHi8U6n89e4/rf+ZMsCgYAk6amnntLMmTP17LPPqmXLloqPj9fYsWPl9XpPud2i7RRt40RFOS8+tMbn85021qJtluV5woUCBgAAAACg3BiG8eswjkBAUX6/ouLiLL0yx8lceOGFcjqd2rhxo+rVqydJ+uWXX/Tdd9+pc+fOatu2rQoKCnTw4EFdeeWV5zyezz77TNddd53++Mc/SiosbHz33Xdq3rz5b95mjRo1JIVeWnXLli1nHeu5clZHyF/+8hcZhhGcgVUqnFhk1KhRql69uhISEtS/f38dOBA6omnPnj3q06eP4uLiVLNmTd13333y+/0hbdasWaN27dopJiZGjRo10vz5888mVAAAAAAASq1SpUoaPHiw7rvvPn300Ufatm2bhg0bpqioKBmGoSZNmmjgwIEaNGiQ3n77be3atUsbNmzQ1KlTtWzZsrDH07hxY2VmZurzzz/Xjh079Oc//7nEuXZZNWrUSCkpKZo8ebK+//57LVu2TNOnTw9TxOH3mwsYGzdu1F//+tcSY3nuvvtuvffee3rjjTf08ccf68cff9QNN9wQXF9QUKA+ffrI6/Xq888/14IFCzR//nxNmjQp2GbXrl3q06ePunbtqi1btmjs2LEaPny4MjIyfmu4AAAAAACUyTPPPKPU1FT17dtXPXr0UKdOndSsWTPFxsZKKpzUc9CgQbrnnnvUtGlT9evXL6THRjhNnDhR7dq1U1pamrp06aLk5GT169fvrLbpdDr12muv6dtvv1WrVq00bdo0PfbYY+EJ+Bz4TUNIjh07poEDB+qll14K2blffvlFc+fO1aJFi9StWzdJhX/QZs2aad26derYsaNWrlyp7du368MPP1RSUpLatGmjRx99VOPHj9fkyZPlcrn04osvqmHDhsHKT7NmzfTpp59qxowZSktLC8NuAwAAAABwepUqVdLChQuD948fP64pU6ZoxIgRkgoLAFOmTNGUKVNO+vghQ4ZoyJAhJZbv3r27xLITL/HaoEGDkGXVqlXTu+++e9p4V69erZycnJBlJz7mxOfp1KmTvv7661O2Odk+TJ48WZMnTw5ZVh6jJn5TAWPUqFHq06ePevToEVLA2LRpk3w+n3r06BFcdvHFF6tevXrKyspSx44dlZWVpZYtWwZnVJWktLQ0jRw5Utu2bVPbtm2VlZUVso2iNsWHqpwoPz9f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nFHbmm21oPcCihgWYggJAAAAAFQwHr8nYooXkWLzwc2279FS0ZWpB8acOXM0Z84c7d69W5LUokULTZo0SVdffbUkKS8vT/fcc48WL16s/Px8paWl6YUXXlBSUlJwG3v27NHIkSP10UcfKSEhQYMHD9bUqVPlcPwaypo1azRu3Dht27ZNKSkpmjhxooYMGXL2ewsAAAAA55k1N62R2+G2OoyT8vv9ysjIUFpaWsg5oZ14/B51WdLF6jCgMhYw6tatq7/85S9q3LixTNPUggULdN1112nz5s1q0aKF7r77bi1btkxvvPGGKleurNGjR+uGG27QZ599JkkqKChQnz59lJycrM8//1z79+/XoEGD5HQ69cQTT0iSdu3apT59+uj222/XwoULtWrVKg0fPly1atVSWlpa+DMAAAAAABWY2+FWnDPO6jBOyiefXIZLbodbTqfT6nBgc2UqYFx77bUh9x9//HHNmTNH69atU926dTV37lwtWrRI3bp1kyTNmzdPzZo107p169SxY0etXLlS27dv14cffqikpCS1adNGjz76qMaPH6/JkyfL5XLpxRdfVMOGDTV9+nRJUrNmzfTpp59qxowZFDAAAAAAADhP/eY+OgUFBXrjjTd0/PhxpaamatOmTfL5fOrRo0ewzcUXX6x69eopKytLHTt2VFZWllq2bBkypCQtLU0jR47Utm3b1LZtW2VlZYVso6jN2LFjTxtPfn6+8vPzg/dzcnIkST6fTz6fvWezLa4o1kiK2a7IZfiQy/Ahl+Fl93z6/f6Q23aeXd3uuYwk5DJ8yGV4kc/wiYRcRspnELkMr0jI54nKEmuZCxhbt25Vamqq8vLylJCQoHfeeUfNmzfXli1b5HK5VKVKlZD2SUlJys7OliRlZ2eHFC+K1hetO12bnJwceTweud0nH7s1depUTZkypcTylStXKi7Ont2lTiczM9PqECoMchk+5DJ8yGV42TWfXtMbvJ2RkSGX4bIwmtKxay4jEbkMH3IZXuQzfOycy0j7DCKX4WXnfJ4oNze31G3LXMBo2rSptmzZol9++UVvvvmmBg8erI8//rismwm7CRMmaNy4ccH7OTk5SklJUa9evZSYmGhhZGXj8/mUmZmpnj17MgbsLJHL8CGX4UMuw8vu+fT4PcHLwqWlpdl2AjXJ/rmMJOQyfMhleJHP8ImEXEbKZxC5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+KJWrVql1NRU/fzzz1aHGBFiY2M1bdo0HT582OpQIl7Ruc/u3bv1wQcfqGvXrrrrrrvUt29f+f1+q8MrVxQwLLJixQpdccUVqlKliqpXr66+ffvqX//6V3D97t27ZRiG3n77bXXt2lVxcXFq3bq1srKyLIzaPop+XSj+Lzo6Wv/85z/Vrl07xcbG6sILL9SUKVNKvKj379+vq6++Wm63WxdeeKHefPNNi/bCeu3atVNKSorefvvt4LK3335b9erVU9u2bYPLSnu8vv7667rqqqsUGxurhQsXluu+2MGxY8f0+uuva+TIkerTp4/mz58fXFf0S8yyZcvUqlUrxcbGqmPHjvrmm2+CbebPn68qVapo6dKlat68uWJiYrRnzx4L9sRa4Touu3XrptGjR4ds+6effpLL5dKqVavO/Y7YWIMGDfTss8+GLGvTpo0mT54cvG8Yhl5++WVdf/31iouLU+PGjbV06dLyDTSClCan+NXp3i+L3guLO9mvto899phq1qypSpUqafjw4XrggQfUpk2bcx+8zRw5ckSffPKJpk2bpq5du6p+/fq6/PLLNWHCBP2///f/gm2GDx+uGjVqKDExUd26ddNXX30V3MbkyZPVpk0b/fWvf1VKSori4uJ000036ZdffrFqtyw1atQouVwurVy5UldddZXq1aunq6++Wh9++KH+7//+Tw899JAkKT8/X+PHj1dKSopiYmLUqFEjzZ07V7t371bXrl0lSVWrVj1vew/26NFDycnJmjp16inbvPXWW2rRooViYmLUoEEDTZ8+PbjuwQcfVIcOHUo8pnXr1kpPTz8nMdtV0blPnTp11K5dOz344IP65z//qQ8++CD4/nmm17kkvffee7rssssUGxurCy64QNdff70Fe3N2KGBY5Pjx4xo3bpy++OILrVq1SlFRUbr++utL/Nr60EMP6d5779WWLVvUpEkTDRgw4LyrspXWJ598okGDBumuu+7S9u3b9de//lXz58/X448/HtLu4YcfVv/+/fXVV19p4MCBuuWWW7Rjxw6Lorbe0KFDNW/evOD9V155RX/6059C2pT2eH3ggQd01113aceOHUpLSyuX+O1kyZIluvjii9W0aVP98Y9/1CuvvCLTNEPa3HfffZo+fbo2btyoGjVq6Nprrw3prZKbm6tp06bp5Zdf1rZt21SzZs3y3g1bCMdx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840bN57z+CNJ8+bN9e6776pdu3bKzs6Ww+EI9lQ7mT179ujHH38MFpbWrVunqKgoNW3atJwitofq1aurZ8+eeuGFF3T33XeHnPRlZ2dr4cKFGjRokFq2bKlAIKCPP/5YPXr0KLEdl8slScGeBOe7v/zlL2rTpk3I8dSsWbMSl/r97LPP1KRJE0VHR0uS6tatq6uuukoLFy6Ux+NRz549z9v5wU60evVqbd26VXfffbfq1q17xtd5q1attGrVqhJzikUaChgWqFq1qqpXr66//e1vqlWrlvbs2aMHHnjA6rAi3qRJk9S3b1/Vq1dPv//97xUVFaWvvvpK33zzjR577LFguzfeeEPt27fXFVdcoYULF2rDhg1l6rZaEUVHRwe79RV9YBTheD2z999/X4cPH9awYcNUuXLlkHX9+/fX3Llz9dRTT0mS0tPTVb16dSUlJemhhx7SBRdcoH79+lkQtf2F67gcPny4Ro8erfj4+Iicbftc6Natm+bPn69rr71WVapU0aRJk0rkGGVDTkunNO+XGRkZiouL04MPPqg777xT69evD7lKiSSNGTNGt912m9q3b6/f/e53ev311/X111/rwgsvLMe9sYdDhw7pxhtv1NChQ9WqVStVqlRJX3zxhZ588kldd9116tGjh1JTU9WvXz89+eSTatKkiX788cfghH5Fwz9jY2M1ePBgPf3008rJydGdd96pm266ScnJyRbvYfmbPXu2fve73yktLU2PPfaYGjZsqG3btum+++5TnTp19Pjjj6tatWoaPHiwhg4dqlmzZql169b6z3/+o4MHD+qmm25S/fr1ZRiG3n//fV1zzTVyu91KSEiwetcs07JlSw0cOFCzZs0KLrvnnnt02WWX6dFHH9XNN9+srKwszZ49Wy+88ELIYwcOHKhHHnlEXq9XM2bMKO/QbSE/P1/Z2dkqKCjQgQMHtGLFCk2dOlV9+/bVoEGDFBUVdcbX+SOPPKLu3bvroosu0i233CK/36/ly5dr/PjxVu9emTAHRjkKBAJyOByKiorS4sWLtWnTJl1yySW6++67gyc3+O3S0tL0/vvva+XKlbrsssvUsWNHzZgxo0R38SlTpmjx4sVq1aqVXn31Vb322mtq3ry5RVHbR2JiohITE0ss53g9s7lz56pHjx4lvoxLhV/Iv/jiC3399deSCn+BuOuuu3TppZcqOztb7733XvBXGpQUjuNywIABcjgcGjBgwHk9nKzoM0iSJkyYoKuuukp9+/ZVnz591K9fP1100UUWRxh5yGnZleb9ct++ffrHP/6h5cuXq2XLlnrttddKXI524MCBmjBhgu699161a9dOu3bt0pAhQ87L13hCQoI6dOigGTNmqHPnzrrkkkv08MMP67bbbtPs2bNlGIaWL1+uzp07609/+pOaNGmiW265Rf/5z3+UlJQU3E6jRo10ww036JprrlGvXr3UqlWrEieS54vGjRvriy++0IUXXqibbrpJF110kUaMGKGuXbsqKytL1apVkyTNmTNHv//973XHHXfo4osv1m233abjx49LkurUqaMpU6bogQceUFJSUonLep+P0tPTQ4YhtmvXTkuWLNHixYt1ySWXaNKkSUpPTy8xzOT3v/+9Dh06pNzc3PP2R58VK1aoVq1aatCggXr37q2PPvpIs2bN0j//+U9FR0eX6nXepUsXvfHGG1q6dKnatGmjbt26acOGDRbvWdkZ5plmqEHY9O7dW40aNaILM3AeWrNmjbp27arDhw8z5ric7d69WxdddJE2btyodu3aWR2OZfgMCj9yai89e/ZUcnKy/v73v1sdSsSZPHmy3n333RJDdQDAbhhCUg4OHz6szz77TGvWrNHtt99udTgAcF7w+Xw6dOiQJk6cqI4dO563xQs+g8KPnFovNzdXL774otLS0hQdHa3XXntNH374oTIzM60ODQBwDlHAKAdDhw7Vxo0bdc899+i6666zOhwAOC989tln6tq1q5o0aaI333zT6nAsw2dQ+JFT6xV1l3788ceVl5enpk2b6q233jrpZIoAgIqDISQAAAAAAMD2mMQTAAAAAADYHgUMAAAAAABgexQwAAAAAACA7VHAAAAAAAAAtkcBAwAAAAAA2B4FDAAAYFuGYZz23+TJk60OEQAAlBOH1QEAAACcyv79+4O3X3/9dU2aNEk7d+4MLktISLAiLAAAYAEKGAAAwLaSk5ODtytXrizDMEKWAQCA8wdDSAAAAAAAgO1RwAAAAAAAALZHAQMAAAAAANgeBQwAAAAAAGB7FDAAAAAAAIDtUcAAAAAAAAC2RwEDAAAAAADYnmGapml1EAAAAAAAAKdDDwwAAAAAAGB7FDAAAAAAAIDtUcAAAAAAAAC2RwEDAAAAAADYHgUMAAAAAABgexQwAAAAAACA7VHAAAAAAAAAtkcBAwAAAAAA2B4FDAAAAAAAYHsUMAAAAAAAgO1RwAAAAAAAALZHAQMAAAAAANje/weSlpRoJcFSkwAAAABJRU5ErkJggg==\n"
},
"metadata": {}
}
],
"source": [
"budget = 5000\n",
"m = BIMProductAcquisitionAndInventory(\n",
" demand,\n",
" price,\n",
" {\"silicon\": 1000, \"germanium\": 1500, \"plastic\": 1750, \"copper\": 4800},\n",
" {\"silicon\": 500, \"germanium\": 500, \"plastic\": 1000, \"copper\": 2000},\n",
" 9000,\n",
" budget,\n",
")\n",
"\n",
"m.option[\"solver\"] = SOLVER\n",
"m.solve()\n",
"\n",
"print(\"\\nThe optimal amount of raw materials to acquire in each month is:\")\n",
"display(ShowTableOfAmplVariables(m, \"x\"))\n",
"print(\"\\nThe corresponding optimal stock levels in each months are:\")\n",
"stock = ShowTableOfAmplVariables(m, \"s\")\n",
"display(stock)\n",
"print(\"\\nThe stock levels can be visualized as follows\")\n",
"stock.T.plot(drawstyle=\"steps-mid\", grid=True, figsize=(13, 4))\n",
"plt.xticks(np.arange(len(stock.columns)), stock.columns)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "V4peVgMaRX8q"
},
"source": [
"Here is a different solution corresponding to the situation where the budget is much lower, namely 2000."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"id": "XTJC2Q_4RX8q",
"outputId": "17123ad5-05d0-48fd-f005-319507fec504",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 951
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"HiGHS 1.5.3: \b\b\b\b\b\b\b\b\b\b\b\b\bHiGHS 1.5.3: optimal solution; objective 25908.12917\n",
"44 simplex iterations\n",
"0 barrier iterations\n",
" \n",
"\n",
"The optimal amount of raw materials to acquire in each month is:\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"T Jan Feb Mar Apr May Jun Jul Aug \\\n",
"P \n",
"silicon 444.67 559.0 0.0 666.67 0.0 400.0 65.05 0.00 \n",
"plastic 0.00 0.0 0.0 0.00 0.0 0.0 266.00 327.00 \n",
"copper 221.33 323.0 2000.0 0.00 1000.0 0.0 0.00 983.65 \n",
"germanium 0.00 0.0 0.0 0.00 0.0 0.0 0.00 0.00 \n",
"\n",
"T Sep Oct Nov Dec \n",
"P \n",
"silicon 125.62 0.0 0.0 0.0 \n",
"plastic 1065.00 0.0 0.0 1310.0 \n",
"copper 695.52 2000.0 2000.0 934.5 \n",
"germanium 0.00 0.0 0.0 0.0 "
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" T \n",
" Jan \n",
" Feb \n",
" Mar \n",
" Apr \n",
" May \n",
" Jun \n",
" Jul \n",
" Aug \n",
" Sep \n",
" Oct \n",
" Nov \n",
" Dec \n",
" \n",
" \n",
" P \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" silicon \n",
" 444.67 \n",
" 559.0 \n",
" 0.0 \n",
" 666.67 \n",
" 0.0 \n",
" 400.0 \n",
" 65.05 \n",
" 0.00 \n",
" 125.62 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" \n",
" \n",
" plastic \n",
" 0.00 \n",
" 0.0 \n",
" 0.0 \n",
" 0.00 \n",
" 0.0 \n",
" 0.0 \n",
" 266.00 \n",
" 327.00 \n",
" 1065.00 \n",
" 0.0 \n",
" 0.0 \n",
" 1310.0 \n",
" \n",
" \n",
" copper \n",
" 221.33 \n",
" 323.0 \n",
" 2000.0 \n",
" 0.00 \n",
" 1000.0 \n",
" 0.0 \n",
" 0.00 \n",
" 983.65 \n",
" 695.52 \n",
" 2000.0 \n",
" 2000.0 \n",
" 934.5 \n",
" \n",
" \n",
" germanium \n",
" 0.00 \n",
" 0.0 \n",
" 0.0 \n",
" 0.00 \n",
" 0.0 \n",
" 0.0 \n",
" 0.00 \n",
" 0.00 \n",
" 0.00 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" \n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
]
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"\n",
"The corresponding optimal stock levels in each months are:\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"T Jan Feb Mar Apr May Jun Jul \\\n",
"P \n",
"silicon 1356.67 1790.67 1530.67 1980.33 1742.33 1856.33 1673.38 \n",
"plastic 1615.00 1428.00 1087.00 805.00 472.00 68.00 0.00 \n",
"copper 4575.33 4274.33 5072.33 4074.33 3932.33 2552.33 1388.33 \n",
"germanium 1453.00 1391.00 1310.00 1245.00 1150.00 1032.00 946.00 \n",
"\n",
"T Aug Sep Oct Nov Dec \n",
"P \n",
"silicon 1435.38 1296.0 1003.0 744.0 500.0 \n",
"plastic 0.00 718.0 343.0 0.0 1000.0 \n",
"copper 1241.98 713.5 1377.5 2173.5 2000.0 \n",
"germanium 857.00 775.0 693.0 609.0 543.0 "
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" T \n",
" Jan \n",
" Feb \n",
" Mar \n",
" Apr \n",
" May \n",
" Jun \n",
" Jul \n",
" Aug \n",
" Sep \n",
" Oct \n",
" Nov \n",
" Dec \n",
" \n",
" \n",
" P \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" silicon \n",
" 1356.67 \n",
" 1790.67 \n",
" 1530.67 \n",
" 1980.33 \n",
" 1742.33 \n",
" 1856.33 \n",
" 1673.38 \n",
" 1435.38 \n",
" 1296.0 \n",
" 1003.0 \n",
" 744.0 \n",
" 500.0 \n",
" \n",
" \n",
" plastic \n",
" 1615.00 \n",
" 1428.00 \n",
" 1087.00 \n",
" 805.00 \n",
" 472.00 \n",
" 68.00 \n",
" 0.00 \n",
" 0.00 \n",
" 718.0 \n",
" 343.0 \n",
" 0.0 \n",
" 1000.0 \n",
" \n",
" \n",
" copper \n",
" 4575.33 \n",
" 4274.33 \n",
" 5072.33 \n",
" 4074.33 \n",
" 3932.33 \n",
" 2552.33 \n",
" 1388.33 \n",
" 1241.98 \n",
" 713.5 \n",
" 1377.5 \n",
" 2173.5 \n",
" 2000.0 \n",
" \n",
" \n",
" germanium \n",
" 1453.00 \n",
" 1391.00 \n",
" 1310.00 \n",
" 1245.00 \n",
" 1150.00 \n",
" 1032.00 \n",
" 946.00 \n",
" 857.00 \n",
" 775.0 \n",
" 693.0 \n",
" 609.0 \n",
" 543.0 \n",
" \n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
]
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"\n",
"The stock levels can be visualized as follows\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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AEDF2L17t2rVqmV1GKeFAgYAAAAAABWgqKhIhmEoLs66wRApKSmW/e4zxRASAAAAAACO4+DBgxowYICqVaum+vXra8aMGeratavGjBkjSSosLNQ999yjs88+W9WqVVPHjh2Vm5sbvn9WVpZq1qypd999V61atVJ8fLx27Nihxo0b69FHH9XAgQOVmJiotLQ0vfvuu9q/f7+uueYaJSYmqk2bNlq7dm34WD/99JP69++vs88+W16vV61bt9bChQsj4u3evbvGjx+v8ePHq3bt2kpJSdGkSZMi2hw7hCQ3N1eGYejAgQPh/Rs2bJBhGNq+fXvEObz//vtq0aKFvF6vbrjhBhUUFGj+/Plq3LixatWqpT/84Q8qKiqKVuqPiwIGAAAAAKDCmKapUEHB//75fJG3y/GfaZplinXcuHFasWKF3n33XeXk5Oizzz7Tl19+Gd4/atQo5eXl6dVXX9XXX3+t3/72t+rTp4++//77cJuCggJNnTpVL7zwgjZt2qR69epJkmbMmKHOnTtr/fr16tu3r2699VYNHDhQv/vd7/Tll1/q3HPP1cCBA8MxHzlyRBdeeKEWL16sb775RnfccYduvfVWrV69OiLmhQsXqlq1alq1apWeeOIJZWZmKicn53T/XOFzmDVrll599VUtWbJEubm5uu666/TBBx/ogw8+0Msvv6znnntOb7zxxhn9nlNhCAkAAAAAoMKYPp+2drgwYtveCvrdLb5cJ8PrLVXbgwcPav78+VqwYIF69OghSZo3b54aNGggSdqxY4fmzZunHTt2hLfdc889WrJkiebNm6fHH39ckhQIBPTMM8+obdu2Ece/8sor9fvf/16SNHHiRM2ZM0cXX3yxfvvb30qSxo8fr/T0dO3du1cpKSk6++yzdc8994Tvf9dddyk7O1uLFi3SJZdcEt5+/vnna+LEiYqLi1OzZs00e/ZsLVu2TL169TqdlIXPYc6cOTr33HMlSTfccINefvll7d27V4mJiWrVqpW6deumjz/+WDfddNNp/55ToYABAAAAAMCv/Otf/1IgEIgoDtSoUUMtWrSQJG3cuFFFRUVq3rx5xP0KCwtVp06d8G232602bdqUOP6x25KTkyVJrVu3LrFt3759SklJUVFRkR5//HEtWrRI//d//ye/36/CwkJ5f1WQOf/88yNu169fX/v27SvTuf+a1+sN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107PPfecUlNT5fV6deONN+qXX36x6rQsNXLkSLndbi1dulSXX365GjVqpCuuuEIfffSR/u///k8PPPCAJKmwsFDjx49Xamqq4uPj1bRpU82dO1fbt29Xt27dJEm1atWqsr0He/bsqZSUFE2ZMuWEbd58802df/75io+PV+PGjTVt2rTwvj/+8Y/q2LFjifu0bdtWmZmZ5RKzXRV/9jn77LPVoUMH/fGPf9Tf//53ffjhh+Hnz1M9ziXpvffe08UXX6yEhASdddZZuu666yw4mzNDAcMihw8f1rhx47R27VotW7ZMcXFxuu6660p82/rAAw/onnvu0YYNG9S8eXP179+/ylXZSuuzzz7TwIEDNXr0aG3evFnPPfecsrKy9Nhjj0W0e+ihh9SvXz999dVXGjBggG6++WZt2bLFoqitN2TIEM2bNy98+8UXX9Rtt90W0aa01+v999+v0aNHa8uWLcrIyKiQ+O1k0aJFOu+889SiRQv97ne/04svvijTNCPa3HvvvZo2bZrWrFmjunXr6uqrr47orVJQUKCpU6fqhRde0KZNm1SvXr2KPg1biMZ1OWzYMC1YsECFhYXh+/ztb3/T2Wefre7du1fMicS4yZMn68Ybb9TXX3+tK6+8UgMGDOCbR0RFaZ4vT+aVV17RY489pqlTp2rdunVq1KiR5syZU44R21diYqISExP1zjvvRDzfHeu3v/2t9u3bpw8//FDr1q1Thw4d1KNHj4jH8z/+8Q8tWrRI7733npYsWaL169frzjvvrKjTsI3//Oc/ys7O1p133imPxxOxLyUlRQMGDNBrr70m0zQ1cOBALVy4ULNmzdKWLVv03HPPKTExUampqXrzzTclSVu3btXu3bv15JNPWnE6lnI4HHr88cf11FNP6ccffyyxf926dbrxxht18803a+PGjZo0aZIeeuih8AfyAQMGaPXq1RFfTmzatElff/21brnlloo6Ddvq3r272rZtG/7C51SP88WLF+u6667TlVdeqfXr12vZsmW65JJLrDyF02OiwgwaNMi85pprjrtv//79piRz48aNpmma5rZt20xJ5gsvvBBus2nTJlOSuWXLlooI17YGDRpkOhwOs1q1auF/N9xwg9mjRw/z8ccfj2j78ssvm/Xr1w/flmQOHz48ok3Hjh3NESNGVEjsdlJ8Pe7bt8+Mj483t2/fbm7fvt1MSEgw9+/fb15zzTXmoEGDjnvfE12vM2fOrMAzsJ/f/OY34RwEAgHzrLPOMj/++GPTNE3z448/NiWZr776arj9Tz/9ZHo8HvO1114zTdM0582bZ0oyN2zYUOGx20U0r0ufz2fWqlUrnF/TNM02bdqYkyZNqohTsZ1jX4PS0tLMGTNmROxv27at+fDDD4dvSzIffPDB8O1Dhw6ZkswPP/ywAqKNDaeT07fffrvC4rOzkz1fzps3z6xRo0ZE+7fffts89m1rx44dzZEjR0a06dy5s9m2bdvyDNu23njjDbNWrVpmQkKC+Zvf/MacMGGC+dVXX5mmaZqfffaZmZSUZB45ciTiPueee6753HPPmaZpmg8//LDpcDjMH3/8Mbz/ww8/NOPi4szdu3dX3InYwMqVK0/6WJ0+fbopyVy1apUpyczJyTluu+LX/Z9//rn8grWxY58fO3XqZA4ZMsQ0zcjH8i233GL26tUr4n733nuv2apVq/Dttm3bmpmZmeHbEyZMMDt27FjO0dvLyT5D3nTTTWbLli1L9ThPT083BwwYUN7hljt6YFjk+++/V//+/XXOOecoKSlJjRs3lqQS3cXbtGkT/rl+/fqSpH379lVYnHbVrVs3bdiwIfxv1qxZ+uqrr5SZmRn+JiIxMVG33367du/erYKCgvB909PTI46Vnp5epXtg1K1bN9x9d968eerbt6/OOuusiDalvV4vuuiiigrbdrZu3arVq1erf//+kiSn06mbbrpJc+fOjWh37PVXu3ZttWjRIuL6c7vdEY/7qioa12VCQoJuvfVWvfjii5KkL7/8Ut98802V7MZ7uo69FqtVq6akpCReg3DGSvt8eapj/Pqbw5j8JjFK+vXrp127dundd99Vnz59lJubqw4dOigrK0tfffWVDh06pDp16kS8R9q2bVvEN9uNGjXS2WefHb6dnp6uUCikrVu3WnFKljNP0SNo+/btcjgcuvzyyysootg1depUzZ8/v8T77S1btqhz584R2zp37qzvv/9eRUVFko72wliwYIGko3+ThQsXasCAARUTeAwwTVOGYZTqcb5hwwb16NHD4ojPnNPqAKqqq6++WmlpaXr++efVoEEDhUIhXXDBBfL7/RHtXC5X+OfisZ9VcVK/X6tWrZqaNm0ase3QoUOaPHmyrr/++hLtExISKiq0mDRkyJDwXAFPP/10if2lvV6rVatWIfHa0dy5cxUMBtWgQYPwNtM0FR8fr9mzZ5f6OB6Ph9m5/ysa1+WwYcPUrl07/fjjj5o3b566d++utLS0CjsHu4qLiyvx5vx4E+8e+xokHX0d4jXo+EqbU5z6+ZJcnp6EhAT16tVLvXr10kMPPaRhw4bp4Ycf1p133qn69esrNze3xH1+PdcIpKZNm8owDG3ZsuW48wNs2bJFtWrVKjG8BCfWpUsXZWRkaMKECWX+EqF///4aP368vvzyS/l8Pu3cuVM33XRT+QQag7Zs2aImTZro0KFDp3ycV5ZrlgKGBX766Sdt3bpVzz//vC677DJJ0ueff25xVLGvQ4cO2rp1a4nCxq+tXLlSAwcOjLh97MSAVVGfPn3k9/tlGEaJuSu4Xk8tGAzqpZde0rRp09S7d++Ifddee60WLlyo8847T9LR6614JY2ff/5Z3333nVq2bFnhMceCaFyXrVu31kUXXaTnn39eCxYsKFMxqTKrW7eudu/eHb6dn5+vbdu2WRhR7COnpVOa58u0tDQdPHhQhw8fDhfGN2zYENG2RYsWWrNmTcTr+Zo1a8o9/ljSqlUrvfPOO+rQoYP27Nkjp9MZ7ql2PDt27NCuXbvChaWVK1cqLi5OLVq0qKCI7aFOnTrq1auXnnnmGY0dOzbiQ9+ePXv0yiuvaODAgWrdurVCoZA++eQT9ezZs8Rx3G63JIV7ElR1f/rTn9SuXbuI66lly5YllvpdsWKFmjdvLofDIUlq2LChLr/8cr3yyivy+Xzq1atXlZ0f7NeWL1+ujRs3auzYsWrYsOEpH+dt2rTRsmXLSswpFmsoYFigVq1aqlOnjv7617+qfv362rFjh+6//36rw4p5EydO1FVXXaVGjRrphhtuUFxcnL766it98803evTRR8PtXn/9dV100UW69NJL9corr2j16tVl6rZaGTkcjnC3vuIXjGJcr6f2/vvv6+eff9bQoUNVo0aNiH39+vXT3Llz9ec//1mSlJmZqTp16ig5OVkPPPCAzjrrLF177bUWRG1/0bouhw0bplGjRqlatWoxOdt2eejevbuysrJ09dVXq2bNmpo4cWKJHKNsyGnplOb5Mjs7W16vV3/84x/1hz/8QatWrYpYpUSS7rrrLt1+++266KKL9Jvf/Eavvfaavv76a51zzjkVeDb28NNPP+m3v/2thgwZojZt2qh69epau3atnnjiCV1zzTXq2bOn0tPTde211+qJJ55Q8+bNtWvXrvCEfsXDPxMSEjRo0CD95S9/UX5+vv7whz/oxhtvVEpKisVnWPFmz56t3/zmN8rIyNCjjz6qJk2aaNOmTbr33nt19tln67HHHlPt2rU1aNAgDRkyRLNmzVLbtm31ww8/aN++fbrxxhuVlpYmwzD0/vvv68orr5TH41FiYqLVp2aZ1q1ba8CAAZo1a1Z42913362LL75YjzzyiG666Sbl5eVp9uzZeuaZZyLuO2DAAD388MPy+/2aMWNGRYduC4WFhdqzZ4+Kioq0d+9eLVmyRFOmTNFVV12lgQMHKi4u7pSP84cfflg9evTQueeeq5tvvlnBYFAffPCBxo8fb/XplQlzYFSgUCgkp9OpuLg4vfrqq1q3bp0uuOACjR07NvzhBqcvIyND77//vpYuXaqLL75YnTp10owZM0p0F588ebJeffVVtWnTRi+99JIWLlyoVq1aWRS1fSQlJSkpKanEdq7XU5s7d6569uxZ4s24dPQN+dq1a/X1119LOvoNxOjRo3XhhRdqz549eu+998Lf0qCkaFyX/fv3l9PpVP/+/av0cLLi1yBJmjBhgi6//HJdddVV6tu3r6699lqde+65FkcYe8hp2ZXm+fLHH3/U3/72N33wwQdq3bq1Fi5cWGI52gEDBmjChAm655571KFDB23btk2DBw+uko/xxMREdezYUTNmzFCXLl10wQUX6KGHHtLtt9+u2bNnyzAMffDBB+rSpYtuu+02NW/eXDfffLN++OEHJScnh4/TtGlTXX/99bryyivVu3dvtWnTpsQHyaqiWbNmWrt2rc455xzdeOONOvfcc3XHHXeoW7duysvLU+3atSVJc+bM0Q033KA777xT5513nm6//XYdPnxYknT22Wdr8uTJuv/++5WcnFxiWe+qKDMzM2IYYocOHbRo0SK9+uqruuCCCzRx4kRlZmaWGGZyww036KefflJBQUGV/dJnyZIlql+/vho3bqw+ffro448/1qxZs/T3v/9dDoejVI/zrl276vXXX9e7776rdu3aqXv37lq9erXFZ1Z2hnmqGWoQNX369FHTpk3pwgxUQbm5uerWrZt+/vlnxhxXsO3bt+vcc8/VmjVr1KFDB6vDsQyvQdFHTu2lV69eSklJ0csvv2x1KDFn0qRJeuedd0oM1QEAu2EISQX4+eeftWLFCuXm5mr48OFWhwMAVUIgENBPP/2kBx98UJ06daqyxQteg6KPnFqvoKBAzz77rDIyMuRwOLRw4UJ99NFHysnJsTo0AEA5ooBRAYYMGaI1a9bo7rvv1jXXXGN1OABQJaxYsULdunVT8+bN9cYbb1gdjmV4DYo+cmq94u7Sjz32mI4cOaIWLVrozTffPO5kigCAyoMhJAAAAAAAwPaYxBMAAAAAANgeBQwAAAAAAGB7FDAAAAAAAIDtUcAAAAAAAAC2RwEDAAAAAADYHgUMAABgW4ZhnPTfpEmTrA4RAABUEKfVAQAAAJzI7t27wz+/9tprmjhxorZu3RrelpiYaEVYAADAAhQwAACAbaWkpIR/rlGjhgzDiNgGAACqDoaQAAAAAAAA26OAAQAAAAAAbI8CBgAAAAAAsD0KGAAAAAAAwPYoYAAAAAAAANujgAEAAAAAAGyPAgYAAAAAALA9wzRN0+ogAAAAAAAAToYeGAAAAAAAwPYoYAAAAAAAANujgAEAAAAAAGyPAgYAAAAAALA9ChgAAAAAAMD2KGAAAAAAAADbo4ABAAAAAABsjwIGAAAAAACwPQoYAAAAAADA9ihgAAAAAAAA26OAAQAAAAAAbI8CBgAAAAAAsL3/D4SwO8/s/McAAAAAAElFTkSuQmCC\n"
},
"metadata": {}
}
],
"source": [
"budget = 2000\n",
"m = BIMProductAcquisitionAndInventory(\n",
" demand,\n",
" price,\n",
" {\"silicon\": 1000, \"germanium\": 1500, \"plastic\": 1750, \"copper\": 4800},\n",
" {\"silicon\": 500, \"germanium\": 500, \"plastic\": 1000, \"copper\": 2000},\n",
" 9000,\n",
" budget,\n",
")\n",
"\n",
"m.option[\"solver\"] = SOLVER\n",
"m.solve()\n",
"\n",
"print(\"\\nThe optimal amount of raw materials to acquire in each month is:\")\n",
"display(ShowTableOfAmplVariables(m, \"x\"))\n",
"print(\"\\nThe corresponding optimal stock levels in each months are:\")\n",
"stock = ShowTableOfAmplVariables(m, \"s\")\n",
"display(stock)\n",
"print(\"\\nThe stock levels can be visualized as follows\")\n",
"stock.T.plot(drawstyle=\"steps-mid\", grid=True, figsize=(13, 4))\n",
"plt.xticks(np.arange(len(stock.columns)), stock.columns)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "7alXsDy-RX8s"
},
"source": [
"Looking at the two optimal solutions corresponding to different budgets, we can note that:\n",
"* The budget is not limitative;\n",
"* With the initial budget of 5000 the solution remains integer;\n",
"* Lowering the budget to 2000 forces acquiring fractional quantities;\n",
"* Lower values of the budget end up making the problem infeasible."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uafykWyPRX8s"
},
"source": [
"### A more parsimonious model\n",
"\n",
"We can create a more parsimonious model with fewer variabels by getting rid of the auxiliary variables $s_{pt}$. Here is the corresponding implementation in AMPL:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"id": "L1Y3s9H3RX8t",
"outputId": "c55b3743-d767-4aaf-b2e1-26007c022082",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Overwriting BIMProductAcquisitionAndInventory_v2.mod\n"
]
}
],
"source": [
"%%writefile BIMProductAcquisitionAndInventory_v2.mod\n",
"\n",
"set T ordered;\n",
"set P;\n",
"param pi{P, T};\n",
"param h{P, T} default 0.05;\n",
"param delta{P, T};\n",
"\n",
"param existing{P};\n",
"param desired{P};\n",
"\n",
"param month_budget;\n",
"param stock_limit;\n",
"var x{P,T} >= 0;\n",
"param acquisition_price{P,T};\n",
"var s{p in P, t in T} = if t == first(T) then\n",
" existing[p] + x[p,t] - delta[p,t]\n",
" else\n",
" x[p,t] + s[p,prev(t)] - delta[p,t];\n",
"s.t. non_negative_stock {p in P, t in T}: s[p,t] >= 0;\n",
"var acquisition_cost = sum{p in P, t in T} pi[p,t] * x[p,t];\n",
"var inventory_cost = sum{p in P, t in T} h[p,t] * s[p,t];\n",
"minimize total_cost: acquisition_cost + inventory_cost;\n",
"s.t. finish {p in P}: s[p,last(T)] >= desired[p];\n",
"s.t. inventory {t in T}: sum{p in P} s[p,t] <= stock_limit;\n",
"s.t. budget {t in T}: sum{p in P} pi[p,t] * x[p,t] <= month_budget;"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"id": "J4GgDt5nRX8u"
},
"outputs": [],
"source": [
"def BIMProductAcquisitionAndInventory_v2(\n",
" demand, acquisition_price, existing, desired, stock_limit, month_budget\n",
"):\n",
" m = AMPL()\n",
" m.read(\"BIMProductAcquisitionAndInventory_v2.mod\")\n",
"\n",
" m.set[\"T\"] = list(demand.columns)\n",
" m.set[\"P\"] = demand.index.values\n",
"\n",
" m.param[\"pi\"] = acquisition_price\n",
" m.param[\"delta\"] = demand\n",
" m.param[\"existing\"] = existing\n",
" m.param[\"desired\"] = desired\n",
" m.param[\"month_budget\"] = month_budget\n",
" m.param[\"stock_limit\"] = stock_limit\n",
"\n",
" return m"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"id": "YclWEP5vRX8v",
"outputId": "36be8a1c-104d-48af-f56b-98cafb384271",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 951
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"HiGHS 1.5.3: \b\b\b\b\b\b\b\b\b\b\b\b\bHiGHS 1.5.3: optimal solution; objective 25908.12917\n",
"21 simplex iterations\n",
"0 barrier iterations\n",
" \n",
"\n",
"The optimal amount of raw materials to acquire in each month is:\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"T Jan Feb Mar Apr May Jun Jul Aug \\\n",
"P \n",
"silicon 444.67 559.0 0.0 666.67 0.0 400.0 56.88 0.0 \n",
"plastic 0.00 0.0 0.0 0.00 0.0 0.0 593.00 0.0 \n",
"copper 221.33 323.0 2000.0 0.00 1000.0 0.0 0.00 1000.0 \n",
"germanium 0.00 0.0 0.0 0.00 0.0 0.0 0.00 0.0 \n",
"\n",
"T Sep Oct Nov Dec \n",
"P \n",
"silicon 133.79 0.0 0.0 0.0 \n",
"plastic 1065.00 0.0 0.0 1310.0 \n",
"copper 679.17 2000.0 2000.0 934.5 \n",
"germanium 0.00 0.0 0.0 0.0 "
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" T \n",
" Jan \n",
" Feb \n",
" Mar \n",
" Apr \n",
" May \n",
" Jun \n",
" Jul \n",
" Aug \n",
" Sep \n",
" Oct \n",
" Nov \n",
" Dec \n",
" \n",
" \n",
" P \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" silicon \n",
" 444.67 \n",
" 559.0 \n",
" 0.0 \n",
" 666.67 \n",
" 0.0 \n",
" 400.0 \n",
" 56.88 \n",
" 0.0 \n",
" 133.79 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" \n",
" \n",
" plastic \n",
" 0.00 \n",
" 0.0 \n",
" 0.0 \n",
" 0.00 \n",
" 0.0 \n",
" 0.0 \n",
" 593.00 \n",
" 0.0 \n",
" 1065.00 \n",
" 0.0 \n",
" 0.0 \n",
" 1310.0 \n",
" \n",
" \n",
" copper \n",
" 221.33 \n",
" 323.0 \n",
" 2000.0 \n",
" 0.00 \n",
" 1000.0 \n",
" 0.0 \n",
" 0.00 \n",
" 1000.0 \n",
" 679.17 \n",
" 2000.0 \n",
" 2000.0 \n",
" 934.5 \n",
" \n",
" \n",
" germanium \n",
" 0.00 \n",
" 0.0 \n",
" 0.0 \n",
" 0.00 \n",
" 0.0 \n",
" 0.0 \n",
" 0.00 \n",
" 0.0 \n",
" 0.00 \n",
" 0.0 \n",
" 0.0 \n",
" 0.0 \n",
" \n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
]
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"\n",
"The corresponding optimal stock levels in each months are:\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"T Jan Feb Mar Apr May Jun Jul \\\n",
"P \n",
"silicon 1356.67 1790.67 1530.67 1980.33 1742.33 1856.33 1665.21 \n",
"plastic 1615.00 1428.00 1087.00 805.00 472.00 68.00 327.00 \n",
"copper 4575.33 4274.33 5072.33 4074.33 3932.33 2552.33 1388.33 \n",
"germanium 1453.00 1391.00 1310.00 1245.00 1150.00 1032.00 946.00 \n",
"\n",
"T Aug Sep Oct Nov Dec \n",
"P \n",
"silicon 1427.21 1296.0 1003.0 744.0 500.0 \n",
"plastic 0.00 718.0 343.0 0.0 1000.0 \n",
"copper 1258.33 713.5 1377.5 2173.5 2000.0 \n",
"germanium 857.00 775.0 693.0 609.0 543.0 "
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" T \n",
" Jan \n",
" Feb \n",
" Mar \n",
" Apr \n",
" May \n",
" Jun \n",
" Jul \n",
" Aug \n",
" Sep \n",
" Oct \n",
" Nov \n",
" Dec \n",
" \n",
" \n",
" P \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" silicon \n",
" 1356.67 \n",
" 1790.67 \n",
" 1530.67 \n",
" 1980.33 \n",
" 1742.33 \n",
" 1856.33 \n",
" 1665.21 \n",
" 1427.21 \n",
" 1296.0 \n",
" 1003.0 \n",
" 744.0 \n",
" 500.0 \n",
" \n",
" \n",
" plastic \n",
" 1615.00 \n",
" 1428.00 \n",
" 1087.00 \n",
" 805.00 \n",
" 472.00 \n",
" 68.00 \n",
" 327.00 \n",
" 0.00 \n",
" 718.0 \n",
" 343.0 \n",
" 0.0 \n",
" 1000.0 \n",
" \n",
" \n",
" copper \n",
" 4575.33 \n",
" 4274.33 \n",
" 5072.33 \n",
" 4074.33 \n",
" 3932.33 \n",
" 2552.33 \n",
" 1388.33 \n",
" 1258.33 \n",
" 713.5 \n",
" 1377.5 \n",
" 2173.5 \n",
" 2000.0 \n",
" \n",
" \n",
" germanium \n",
" 1453.00 \n",
" 1391.00 \n",
" 1310.00 \n",
" 1245.00 \n",
" 1150.00 \n",
" 1032.00 \n",
" 946.00 \n",
" 857.00 \n",
" 775.0 \n",
" 693.0 \n",
" 609.0 \n",
" 543.0 \n",
" \n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
]
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"\n",
"The stock levels can be visualized as follows\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAABDAAAAFzCAYAAADIYPlzAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABgJUlEQVR4nO3deXhU5fn/8c/JLMkMIWxCAhICyiIoqwukKLIHRX8uWBWpgIAWBMviglRFiAvFlkVE0SoStIDiWhUlRDAuGBYRFAHRtiD4Za0VA2TIzGTO7w+aKWNYEpjknEner+viInPOMyf3uXNmu+dZDNM0TQEAAAAAANhYnNUBAAAAAAAAnAoFDAAAAAAAYHsUMAAAAAAAgO1RwAAAAAAAALZHAQMAAAAAANgeBQwAAAAAAGB7FDAAAAAAAIDtUcAAAAAAAAC257Q6gPISCoW0a9cuVa9eXYZhWB0OAAAAAAD4FdM0dfDgQTVo0EBxcSfvY1FpCxi7du1Samqq1WEAAAAAAIBT2Llzpxo2bHjSNpW2gFG9enVJR5OQlJRkcTSlFwgEtGzZMvXu3Vsul8vqcGIauYwechk95DK6yGf0kMvoIZfRQy6ji3xGD7mMHnIZXbGYz/z8fKWmpoY/w59MpS1gFA8bSUpKirkChtfrVVJSUsxccHZFLqOHXEYPuYwu8hk95DJ6yGX0kMvoIp/RQy6jh1xGVyznszRTPzCJJwAAAAAAsD0KGAAAAAAAwPYoYAAAAAAAANurtHNgAAAAAADso6ioSIFAIGJbIBCQ0+nUkSNHVFRUZFFklYdd8+lyueRwOM74OBQwAAAAAADl6tChQ/rxxx9lmmbEdtM0lZKSop07d5ZqEkecnF3zaRiGGjZsqMTExDM6DgUMAAAAAEC5KSoq0o8//iiv16u6detGfLAOhUI6dOiQEhMTFRfHDAdnyo75NE1T+/fv148//qhmzZqdUU8MChgAAAAAgHITCARkmqbq1q0rj8cTsS8UCsnv9yshIcE2H7hjmV3zWbduXW3fvl2BQOCMChj2OSMAAAAAQKVlpyENqFjR+ttTwAAAAAAAALbHEBLAYqZpyhf0WR3GSQWDQflNv3xBnwIKnPoOFvI4PVT3AQAAgEqoTAWMSZMmafLkyRHbWrRooW+//VaSdOTIEd1999165ZVXVFhYqIyMDD3zzDNKTk4Ot9+xY4dGjBihjz76SImJiRo0aJCmTJkip/N/oeTm5mrcuHHatGmTUlNT9eCDD2rw4MFncJqAPZmmqYEfDNSG/RusDqVUMhdnWh3CKbWv117z+8yniAEAAABUMmUeQnL++edr9+7d4X+fffZZeN/YsWP17rvv6rXXXtPHH3+sXbt26frrrw/vLyoqUt++feX3+/X5559r/vz5ysrK0sSJE8Nttm3bpr59+6pbt27asGGDxowZo2HDhik7O/sMTxWwH1/QFzPFi1ixft962/doAQAAQNUwePBgGYYhwzDkdrvVtGlTZWZmKhgMWh1aTCrzEBKn06mUlJQS23/55RfNnTtXCxcuVPfu3SVJ8+bNU8uWLbVq1Sp16tRJy5Yt0+bNm/Xhhx8qOTlZ7dq10yOPPKLx48dr0qRJcrvdevbZZ9WkSRNNmzZNktSyZUt99tlnmjFjhjIyMs7wdAH7yr0xVx6n59QNLRAMBpWdna2MjIyI3lJ24gv61HVxV6vDAAAAACL06dNH8+bNU2Fhod5//32NHDlSLpdLEyZMsDq0mFPmTyLff/+9GjRooISEBKWnp2vKlClq1KiR1q1bp0AgoJ49e4bbnnfeeWrUqJHy8vLUqVMn5eXlqXXr1hFDSjIyMjRixAht2rRJ7du3V15eXsQxituMGTPm9M8SiAEep0del9fqMI4roIDchlsep0cul8vqcAAAAICYER8fH+4EMGLECL311lt65513KGCchjIVMDp27KisrCy1aNFCu3fv1uTJk3XZZZfpm2++0Z49e+R2u1WzZs2I+yQnJ2vPnj2SpD179kQUL4r3F+87WZv8/Hz5fL4S6wYXKywsVGFhYfh2fn6+pKNrDgcC9p508FjFscZSzHYVC7k8tutYMBi07QSZ5DJ6YiGXsYR8Rg+5jB5yGT3kMrrIZ/SQy7IJBAIyTVOhUEihUChin2ma4f9/va8yME2zxLklJCTop59+KpfztWs+Q6GQTNNUIBCQw+GI2FeWx1GZChhXXHFF+Oc2bdqoY8eOSktL0+LFi09YWKgoU6ZMKTHBqCQtW7ZMXq89v9U+mZycHKtDqDTsnEu/6Q//nJ2dLbfhtjCaUyOX0WPnXMYi8hk95DJ6yGX0kMvoIp/RQy5Lp3gagkOHDsnv9x+3zcGDBys4qooRCAQUDAaVn58v0zT18ccfa9myZbr99tvDX7qXB7vl0+/3y+fz6ZNPPikx/0dBQUGpj3NGg9lr1qyp5s2b6x//+Id69eolv9+vAwcORPTC2Lt3b7i7TEpKitasWRNxjL1794b3Ff9fvO3YNklJSSctkkyYMEHjxo0L387Pz1dqaqp69+6tpKSkMznNChUIBJSTk6NevXrRVf8MxUIufUFfeGWPjIwM286BQS6jJxZyGUvIZ/SQy+ghl9FDLqOLfEYPuSybI0eOaOfOnUpMTFRCQkLEPtM0dfDgQVWvXr1SriLncrmUnZ2thg0bKhAIKBQKqX///nr88cdVrVq1qP8+u+bzyJEj8ng86tKlS4lroCyFnDMqYBw6dEj//Oc/deutt+rCCy+Uy+XS8uXL1a9fP0nS1q1btWPHDqWnp0uS0tPT9dhjj2nfvn2qV6+epKNVy6SkJLVq1Src5v3334/4PTk5OeFjnEh8fLzi4+NLbHe5XDH5pBKrcduRnXN57DAHp9Np2ziLkcvosXMuYxH5jB5yGT3kMnrIZXSRz+ghl6VTVFQkwzAUFxenuLjIhTCLhzkU769sDMNQt27dNGfOHLndbjVo0KBcJ8W3az7j4uJkGMZxHzNleQyVKXP33HOPrr76aqWlpWnXrl16+OGH5XA41L9/f9WoUUNDhw7VuHHjVLt2bSUlJemuu+5Senq6OnXqJEnq3bu3WrVqpVtvvVVPPPGE9uzZowcffFAjR44MFx+GDx+u2bNn67777tOQIUO0YsUKLV68WEuWLClLqAAAAAAAWK5atWpq2rSp1WFUCmUqYPz444/q37+/fvrpJ9WtW1eXXnqpVq1apbp160qSZsyYobi4OPXr10+FhYXKyMjQM888E76/w+HQe++9pxEjRig9PV3VqlXToEGDlJmZGW7TpEkTLVmyRGPHjtWTTz6phg0b6oUXXmAJVQAAAAAAqrAyFTBeeeWVk+5PSEjQ008/raeffvqEbdLS0koMEfm1rl27av369WUJDQAAAAAAVGLlN/gGAAAAAIAqLCsry+oQKhX7zOoBAAAAAABwAhQwAAAAAACA7VHAAAAAAAAAtkcBAwAAAAAA2B4FDAAAAAAAYHsUMAAAAAAAgO1RwAAAAAAAALZHAQMAAAAAANgeBQwAAAAAAMpg8ODBuvbaa8O3u3btqjFjxoRvN27cWDNnzqzwuCo7p9UBAAAAAAAQS5588kmZpnnC/WvXrlW1atUqMKKqgQIGAAAAAABlUKNGjZPur1u3bgVFUrUwhAQAAAAAgON4/fXX1bp1a3k8HtWpU0c9e/bU4cOHSwwh+bVfDyE5cOCAfv/73ys5OVkJCQm64IIL9N5774X3v/HGGzr//PMVHx+vxo0ba9q0aSWO9/jjj2vIkCGqXr26GjVqpL/+9a/RPl3bowcGAAAAAKDCmKYpX6BIkhQKheTzF8npDyourvy/X/e4HDIMo1Rtd+/erf79++uJJ57Qddddp4MHD+rTTz896dCR4wmFQrriiit08OBB/e1vf9O5556rzZs3y+FwSJLWrVunG2+8UZMmTdJNN92kzz//XHfeeafq1KmjwYMHh48zbdo0PfLII/rjH/+o119/XSNGjNDll1+uFi1alCmeWEYBAwAAAABQYXyBIrWamG3J796cmSGvu3Qfg3fv3q1gMKjrr79eaWlpkqTWrVuX+Xd++OGHWrNmjbZs2aLmzZtLks4555zw/unTp6tHjx566KGHJEnNmzfX5s2b9ec//zmigHHllVfqzjvvlCSNHz9eM2bM0EcffUQBA9YwTVO+oE9+0y9f0KeAAlaHdEIep6fUlUsAAAAAiDVt27ZVjx491Lp1a2VkZKh379664YYbVKtWrTIdZ8OGDWrYsGG4ePFrW7Zs0TXXXBOxrXPnzpo5c6aKiorCPTXatGkT3m8YhlJSUrRv374ynlVso4BhI76gT50Xd5YkZS7OtDiak2tfr73m95lPEQMAAABAmXhcDm3OzJB0dHjFwfyDqp5UvcKGkJSWw+FQTk6OPv/8cy1btkxPPfWUHnjgAa1evbpsv9PjKWuYx+VyuSJuG4ahUCgUlWPHCgoYOC3r962XL+iT1+W1OhQAAAAAMcQwjPAwjlAopKDbIa/bWSEFjLIyDEOdO3dW586dNXHiRKWlpemtt94q0zHatGmjH3/8Ud99991xe2G0bNlSK1eujNi2cuVKNW/ePNz7AkdRwLARj9OjlTeuVHZ2tjIyMuR02u/P4wv61HVxV6vDAAAAAIBytXr1ai1fvly9e/dWvXr1tHr1au3fv18tW7bU119/XerjXH755erSpYv69eun6dOnq2nTpvr2229lGIb69Omju+++WxdffLEeeeQR3XTTTcrLy9Ps2bP1zDPPlOPZxSb7fUKuwgzDkMfpkdtwy+P0lOgiBAAAAACoGElJSfrkk080c+ZM5efnKy0tTdOmTdMVV1yhV199tUzHeuONN3TPPfeof//+Onz4sJo2bao//elPkqQOHTpo8eLFmjhxoh555BHVr19fmZmZERN44igKGAAAAAAA/ErLli21dOnS4+7LysqKuJ2bmxtxe/v27RG3a9eurRdffPGEv6tfv37q16/fCff/+njS0clBqxr7DTICAAAAAAD4FQoYAAAAAADA9ihgAAAAAAAA26OAAQAAAAAAbI8CBgAAAAAAsD0KGAAAAAAAwPYoYAAAAAAAANujgAEAAAAAAGyPAgYAAAAAALA9ChgAAAAAAJRR48aNNXPmzHL9HV27dtWYMWPK9XfEEqfVAQAAAAAAUJXl5uaqW7du+vnnn1WzZs3w9jfffFMul8u6wGyGAgZOmy/oszqEkwoGg/KbfvmCPgUUsDqc47J7DgEAAABYp3bt2laHYCsUMHDaui7uanUIpZK5ONPqEAAAAADEmK5du+qCCy6QJL388styuVwaMWKEMjMzZRhGifbTp0/XvHnz9K9//Uu1a9fW1VdfrSeeeEKJiYmSpB9++EGjRo3SZ599Jr/fr8aNG+vPf/6zWrVqpW7dukmSatWqJUkaNGiQsrKy1LVrV7Vr1y48VKWwsFATJ07UwoULtW/fPqWmpmrChAkaOnRoBWTEehQwUCYep0ft67XX+n3rrQ6lUmlfr708To/VYQAAAADlzzSlQMHRn0Ohoz/7HVJcBUzR6PJKxyk+nMj8+fM1dOhQrVmzRl988YXuuOMONWrUSLfffnuJtnFxcZo1a5aaNGmif/3rX7rzzjt133336ZlnnpEkjRw5Un6/X5988omqVaumzZs3KzExUampqXrjjTfUr18/bd26VUlJSfJ4jv/ZYODAgcrLy9OsWbPUtm1bbdu2Tf/+979PLxcxiAIGysQwDM3vMz8mhj4Eg0FlZ2crIyNDTqe9L3WP03PcKi4AAABQ6QQKpMcbSDq6qkTNivzdf9wluauVunlqaqpmzJghwzDUokULbdy4UTNmzDhuAePYyTYbN26sRx99VMOHDw8XMHbs2KF+/fqpdevWkqRzzjkn3L54qEi9evUi5sA41nfffafFixcrJydHPXv2LHGMqsDen+pgS4ZhyOvyWh3GKQUUkNtwy+P0MPENAAAAgDLr1KlTxBeN6enpmjZtmoqKikq0/fDDDzVlyhR9++23ys/PVzAY1JEjR1RQUCCv16s//OEPGjFihJYtW6aePXuqX79+atOmTalj2bBhgxwOhy6//PKonFssooABAAAAAKg4Lu/RnhCSQqGQ8g8eVFL16oqrqCEk5WD79u266qqrNGLECD322GOqXbu2PvvsMw0dOlR+v19er1fDhg1TRkaGlixZomXLlmnKlCmaNm2a7rrrrlL9jhMNK6lKKuAKAQAAAADgvwzj6DCO4n8ub+Tt8vxXxmHbq1evjri9atUqNWvWTA6HI2L7unXrFAqFNG3aNHXq1EnNmzfXrl27ShwvNTVVw4cP15tvvqm7775bzz//vCTJ7XZL0nF7dhRr3bq1QqGQPv744zKdQ2VCAQMAAAAAgOPYsWOHxo0bp61bt2rRokV66qmnNHr06BLtmjZtqkAgoKeeekr/+te/9PLLL+vZZ5+NaDNmzBhlZ2dr27Zt+vLLL/XRRx+pZcuWkqS0tDQZhqH33ntP+/fv16FDh0r8jsaNG2vQoEEaMmSI3n77bW3btk25ublavHhx+Zy8DVHAAAAAAADgOAYOHCifz6dLLrlEI0eO1OjRo3XHHXeUaNe2bVtNnz5dU6dO1QUXXKAFCxZoypQpEW2Kioo0cuRItWzZUn369FHz5s3DE3yeffbZmjx5su6//34lJydr1KhRx41nzpw5uuGGG3TnnXfqvPPO0+23367Dhw9H/8RtijkwAAAAAAA4DpfLpZkzZ2rOnDkl9m3fvj3i9tixYzV27NiIbbfeemv456eeeuqkv+uhhx7SQw89FLEtNzc34nZCQoKmT5+u6dOnlyL6yoceGAAAAAAAwPbogQGg0vEFfVaHcELBYFB+0y9f0KeAAlaHc1Iepydi2TAAAADAShQwAFQ6XRd3tTqEU8pcnGl1CKfUvl57ze8znyIGAACokn49fAPWO6MhJH/6059kGIbGjBkT3nbkyBGNHDlSderUUWJiovr166e9e/dG3G/Hjh3q27evvF6v6tWrp3vvvVfBYDCiTW5urjp06KD4+Hg1bdpUWVlZZxIqgErO4/Sofb32VodRqazft97WvVkAAABQtZx2D4y1a9fqueeeU5s2bSK2jx07VkuWLNFrr72mGjVqaNSoUbr++uu1cuVKSUdnXu3bt69SUlL0+eefa/fu3Ro4cKBcLpcef/xxSdK2bdvUt29fDR8+XAsWLNDy5cs1bNgw1a9fXxkZGWdwugAqK8MwNL/PfNt/4A4Gg8rOzlZGRoacTnt2gvMFfTHRiwUAAABVy2m9ez506JAGDBig559/Xo8++mh4+y+//KK5c+dq4cKF6t69uyRp3rx5atmypVatWqVOnTpp2bJl2rx5sz788EMlJyerXbt2euSRRzR+/HhNmjRJbrdbzz77rJo0aaJp06ZJklq2bKnPPvtMM2bMoIAB4IQMw5DX5bU6jJMKKCC34ZbH6ZHL5bI6HAAAACBmnFYBY+TIkerbt6969uwZUcBYt26dAoGAevbsGd523nnnqVGjRsrLy1OnTp2Ul5en1q1bKzk5OdwmIyNDI0aM0KZNm9S+fXvl5eVFHKO4zbFDVX6tsLBQhYWF4dv5+fmSpEAgoEDA3hPlHas41liK2a7IZfSQy+iJhVweO6QvGAzaerLRWMhnrCCX0UMuo4dcRhf5jB5yWTaBQECmaSoUCikUCkXsM00z/P+v96Hs7JrPUCgk0zQVCATkcDgi9pXlcVTmAsYrr7yiL7/8UmvXri2xb8+ePXK73apZs2bE9uTkZO3Zsyfc5tjiRfH+4n0na5Ofny+fzyePx1Pid0+ZMkWTJ08usX3ZsmXyeu39jezx5OTkWB1CpUEuo4dcRo+dc+k3/eGfs7Oz5TbcFkZTOnbOZ6whl9FDLqOHXEYX+Yweclk6TqdTKSkpOnTokPx+/3HbHDx4sIKjqtzslk+/3y+fz6dPPvmkxPyXBQUFpT5OmQoYO3fu1OjRo5WTk6OEhISy3LXcTZgwQePGjQvfzs/PV2pqqnr37q2kpCQLIyubQCCgnJwc9erVi+7lZ4hcRg+5jJ5YyKUv6AuvkpKRkSGPs2TR2C5iIZ+xglxGD7mMHnIZXeQzeshl2Rw5ckQ7d+5UYmJiic+Rpmnq4MGDql69OiufRYFd83nkyBF5PB516dKlxDVQPHqiNMpUwFi3bp327dunDh06hLcVFRXpk08+0ezZs5WdnS2/368DBw5E9MLYu3evUlJSJEkpKSlas2ZNxHGLVyk5ts2vVy7Zu3evkpKSjtv7QpLi4+MVHx9fYrvL5YrJJ5VYjduOyGX0kMvosXMujx0yElBAThuvuB00gvKbfgWN4KkbW8jj9NjqTcTJ2PnajDXkMnrIZXSRz+ghl6VTVFQkwzAUFxenuLjIhTCLhzkU78eZsWs+4+LiZBjGcR8zZXkMleldaY8ePbRx48aIbbfddpvOO+88jR8/XqmpqXK5XFq+fLn69esnSdq6dat27Nih9PR0SVJ6eroee+wx7du3T/Xq1ZN0tOtVUlKSWrVqFW7z/vvvR/yenJyc8DEAABUjVlYjKe4xYlft67XX/D7zY6aIAQAAYEdlKmBUr15dF1xwQcS2atWqqU6dOuHtQ4cO1bhx41S7dm0lJSXprrvuUnp6ujp16iRJ6t27t1q1aqVbb71VTzzxhPbs2aMHH3xQI0eODPegGD58uGbPnq377rtPQ4YM0YoVK7R48WItWbIkGucMADgJj9Oj9vXaa/2+9VaHUmms37devqDP9qvkAACA2FdUVKRQKGSrHhjREvV+wTNmzFBcXJz69eunwsJCZWRk6Jlnngnvdzgceu+99zRixAilp6erWrVqGjRokDIz//ftWZMmTbRkyRKNHTtWTz75pBo2bKgXXniBJVQBoAIYhqH5febLF/RZHcopBYNBZWdnKyMjQ06n/Ya6+IK+mOnFAgAASgqFQvrLX/6iv/71r9q5c6eSk5P1+9//Xg888IA2btyo0aNHKy8vT16vV/369dP06dOVmJgoSRo8eLAOHDig9u3ba/bs2SosLNQtt9yiWbNmye0+Okl6165dw50BXn75ZblcLo0YMUKZmZnhnpuFhYV64IEHtGjRIh04cEAXXHCBpk6dqq5du0qSsrKyNGbMGL300ku6//779d133+m7777TOeecU/EJK2dn/G4vNzc34nZCQoKefvppPf300ye8T1paWokhIr/WtWtXrV/Pt38AYAXDMGKit0BAAbkNtzxOD2OQAQCIEaZphr8oCYVC8gV9cgacFdJjoKzzUk2YMEHPP/+8ZsyYoUsvvVS7d+/Wt99+q8OHDysjI0Pp6elau3at9u3bp2HDhmnUqFHKysoK33/58uVKSEhQbm6utm/frttuu0116tTRY489Fm4zf/58DR06VGvWrNEXX3yhO+64Q40aNdLtt98uSRo1apQ2b96sV155RQ0aNNBbb72lPn36aOPGjWrWrJmkoyt5TJ06VX/9618VHx8fnq6hsrHf11UAAAAAgErLF/Sp48KOlvzu1besLvWXNAcPHtSTTz6p2bNna9CgQZKkc889V5deeqmef/55HTlyRC+99JKqVasmSZo9e7auvvpqTZ06VcnJyZIkt9utF198UV6vV+eff74yMzN177336pFHHgkXbFJTUzVjxgwZhqEWLVpo48aNmjFjhm6//Xbt2LFD8+bN044dO9SgQQNJ0j333KOlS5dq3rx5evzxxyUdXRnnmWeeUevWrZWfny+v1/5fRJ2OyjcoBgAAAACAM7RlyxYVFhaqR48ex93Xtm3bcPFCkjp37qxQKKStW7eGt7Vt2zaimJCenq5Dhw5p586d4W2dOnWK6BWSnp6u77//XkVFRdq4caOKiorUvHlzJSYmhv99/PHH+uc//xm+j9vtVps2baJ27nZFDwwAAAAAQIXxOD1afctqSUeHkBw8eFDVq1evsCEkpW7rKX3b8nLo0CE5HA6tW7dODocjYl/xXBvS0VgNw5BpmhUdYoWigAEAAAAAqDDHzrUVCoUUdAbldXltt2pGs2bN5PF4tHz5cg0bNixiX8uWLZWVlaXDhw+He2GsXLlScXFxatGiRbjdV199JZ/PFy6GrFq1SomJiUpNTQ23Wb16dcSxV61apWbNmsnhcKh9+/YqKirSvn37dNlll5XXqcYMe10hAAAAAADYQEJCgsaPH6/77rtPL730kv75z39q1apVmjt3rgYMGKCEhAQNGjRI33zzjT766CPddddduvXWW8PzX0iS3+/X0KFDtXnzZr3//vt6+OGHNWrUqIhizY4dOzRu3Dht3bpVixYt0lNPPaXRo0dLkpo3b64BAwZo4MCBevPNN7Vt2zatWbNGU6ZM0ZIlSyo8J1ajBwYAAAAAAMfx0EMPyel0auLEidq1a5fq16+v4cOHy+v1Kjs7W6NHj9bFF18csYzqsXr06KFmzZqpS5cuKiwsVP/+/TVp0qSINgMHDpTP59Mll1wih8Oh0aNH64477gjvnzdvnh599FHdfffd+r//+z+dddZZ6tSpk6666qqKSIGtUMAAAAAAAOA44uLi9MADD+iBBx4osa9169ZasWLFKY8xefJkTZ48+YT7XS6XZs6cqTlz5pxw/8mOMXjwYA0ePPiUcVQGDCEBAAAAAAC2RwEDAAAAAADYHkNIAAAAAACIsqysrFO2yc3NLfc4KhN6YAAAAAAAANujgAEAAAAAAGyPAgYAAAAAALA9ChgAAAAAAMD2KGAAAAAAAADbo4ABAAAAAABsjwIGAAAAAABVhGEYevvtt60O47Q4rQ4AAAAAAABUjN27d6tWrVpWh3FaKGAAAAAAAFABioqKZBiG4uKsGwyRkpJi2e8+UwwhAQAAAADgOA4ePKgBAwaoWrVqql+/vmbMmKGuXbtqzJgxkqTCwkLdc889Ovvss1WtWjV17NhRubm54ftnZWWpZs2aeuedd9SqVSvFx8drx44daty4sR599FENHDhQiYmJSktL0zvvvKP9+/frmmuuUWJiotq0aaMvvvgifKyffvpJ/fv319lnny2v16vWrVtr0aJFEfF2795d48eP1/jx41W7dm2lpKRo0qRJEW2OHUKSm5srwzB04MCB8P4NGzbIMAxt37494hzee+89tWjRQl6vVzfccIMKCgo0f/58NW7cWLVq1dIf/vAHFRUVRSv1x0UBAwAAAABQYUzTVKig4H//fL7I2+X4zzTNMsU6btw4rVy5Uu+8845ycnL06aef6ssvvwzvHzVqlPLy8vTKK6/o66+/1m9/+1v16dNH33//fbhNQUGBpk6dqhdeeEGbNm1SvXr1JEkzZsxQ586dtX79evXt21e33nqrBg4cqN/97nf68ssvde6552rgwIHhmI8cOaILL7xQS5Ys0TfffKM77rhDt956q9asWRMR86JFi1StWjWtXr1aTzzxhDIzM5WTk3O6f67wOcyaNUuvvPKKli5dqtzcXF133XV6//339f777+vll1/Wc889p9dff/2Mfs+pMIQEAAAAAFBhTJ9PWztcGLFtbwX97hZfrpPh9Zaq7cGDBzV//nwtXLhQPXr0kCTNmzdPDRo0kCTt2LFD8+bN044dO8Lb7rnnHi1dulTz5s3T448/LkkKBAJ65pln1LZt24jjX3nllfr9738vSZo4caLmzJmjiy++WL/97W8lSePHj1d6err27t2rlJQUnX322brnnnvC97/rrruUnZ2txYsX65JLLglvP//88zVx4kTFxcWpWbNmmj17tpYvX65evXqdTsrC5zBnzhyde+65kqQbbrhBL7/8svbu3avExES1atVK3bp100cffaSbbrrptH/PqVDAAAAAAADgV/71r38pEAhEFAdq1KihFi1aSJI2btyooqIiNW/ePOJ+hYWFqlOnTvi22+1WmzZtShz/2G3JycmSpNatW5fYtm/fPqWkpKioqEiPP/64Fi9erP/7v/+T3+9XYWGhvL8qyJx//vkRt+vXr699+/aV6dx/zev1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ALA9ChgAAAAAAMD2KGCgSjEMQ2+//bbVYQAAqiBegwAAODMUMCrQ4MGDde2111odRswbPHiwDMMo8e8f//iH1aHFlOI8Dh8+vMS+kSNHyjAMDR48uOIDi3F5eXlyOBzq27ev1aHEJK7L8sNrUPSR0zPD82X07N+/XyNGjFCjRo0UHx+vlJQUZWRkaOXKlVaHFrN27typIUOGqEGDBnK73UpLS9Po0aP1008/ler+ubm5MgxDBw4cKN9Abar49fxPf/pTxPa3335bhmFYFFVsOvazj8vlUnJysnr16qUXX3xRoVDI6vAqHAUMxKQ+ffpo9+7dEf+aNGlidVgxJzU1Va+88op8Pl9425EjR7Rw4UI1atTojI4dCATONLyYNHfuXN1111365JNPtGvXrjM6VlFRUZV8YSrP6xKAfUTz+bKq69evn9avX6/58+fru+++0zvvvKOuXbuW+sM2Iv3rX//SRRddpO+//16LFi3SP/7xDz377LNavny50tPT9Z///MfqEGNCQkKCpk6dqp9//tnqUGJe8Wef7du364MPPlC3bt00evRoXXXVVQoGg1aHV6EoYFhk6dKluvTSS1WzZk3VqVNHV111lf75z3+G92/fvl2GYejNN99Ut27d5PV61bZtW+Xl5VkYtX0Uf7tw7D+Hw6G///3v6tChgxISEnTOOedo8uTJJR7Uu3fv1hVXXCGPx6NzzjlHr7/+ukVnYb0OHTooNTVVb775Znjbm2++qUaNGql9+/bhbaW9Xl999VVdfvnlSkhI0IIFCyr0XOzg0KFDevXVVzVixAj17dtXWVlZ4X3F38QsWbJEbdq0UUJCgjp16qRvvvkm3CYrK0s1a9bUO++8o1atWik+Pl47duyw4EysFa3rsnv37ho1alTEsffv3y+3263ly5eX/4nYWOPGjTVz5syIbe3atdOkSZPCtw3D0AsvvKDrrrtOXq9XzZo10zvvvFOxgcaQ0uQU/3Oy58vi58JjHe9b20cffVT16tVT9erVNWzYMN1///1q165d+QdvMwcOHNCnn36qqVOnqlu3bkpLS9Mll1yiCRMm6P/9v/8XbjNs2DDVrVtXSUlJ6t69u7766qvwMSZNmqR27drpueeeU2pqqrxer2688Ub98ssvVp2WpUaOHCm3261ly5bp8ssvV6NGjXTFFVfoww8/1P/93//pgQcekCQV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5s1T9+7dlZaWVmHnYFdxcXEl3pwfb+LdY1+DpKOvQ7wGHV9pc4pTP1+Sy9OTkJCgXr16qVevXnrooYc0bNgwPfzww7rzzjtVv3595ebmlrjPr+cagdS0aVMZhqEtW7Ycd36ALVu2qFatWiWGl+DEunTpooyMDE2YMKHMXyL0799f48eP15dffimfz6edO3fqpptuKp9AY9CWLVvUpEkTHTp06JSP88pyzVLAsMBPP/2krVu36vnnn9dll10mSfrss88sjir2dejQQVu3bi1R2Pi1VatWaeDAgRG3j50YsCrq06eP/H6/DMMoMXcF1+upBYNBvfTSS5o2bZp69+4dse/aa6/VokWLdN5550k6er0Vr6Tx888/67vvvlPLli0rPOZYEI3rsnXr1rrooov0/PPPa+HChWUqJlVmdevW1e7du8O38/PztW3bNgsjin3ktHRK83yZlpamgwcP6vDhw+HC+IYNGyLatmjRQmvXro14PV+7dm25xx9LWrVqpbffflsdOnTQnj175HQ6wz3VjmfHjh3atWtXuLC0atUqxcXFqUWLFhUUsT3UqVNHvXr10jPPPKOxY8dGfOjbs2ePFixYoIEDB6p169YKhUL6+OOP1bNnzxLHcbvdkhTuSVDV/elPf1K7du0irqeWLVuWWOp35cqVat68uRwOhySpYcOGuvzyy7VgwQL5fD716tWrys4P9msrVqzQxo0bNXbsWDVs2PCUj/M2bdpo+fLlJeYUizUUMCxQq1Yt1alTR3/9619Vv3597dixQ/fff7/VYcW8iRMn6qqrrlKjRo10ww03KC4uTl999ZW++eYbPfroo+F2r732mi666CJdeumlWrBggdasWVOmbquVkcPhCHfrK37BKMb1emrvvfeefv75Zw0dOlQ1atSI2NevXz/NnTtXf/7znyVJmZmZqlOnjpKTk/XAAw/orLPO0rXXXmtB1PYXrety2LBhGjVqlKpVqxaTs22Xh+7duysrK0tXX321atasqYkTJ5bIMcqGnJZOaZ4vs7Oz5fV69cc//lF/+MMftHr16ohVSiTprrvu0u23366LLrpIv/nNb/Tqq6/q66+/1jnnnFOBZ2MPP/30k377299qyJAhatOmjapXr64vvvhCTzzxhK655hr17NlT6enpuvbaa/XEE0+oefPm2rVrV3hCv+LhnwkJCRo0aJD+8pe/KD8/X3/4wx904403KiUlxeIzrHizZ8/Wb37zG2VkZOjRRx9VkyZNtGnTJt177706++yz9dhjj6l27doaNGiQhgwZolmzZqlt27b64YcftG/fPt14441KS0uTYRh67733dOWVV8rj8SgxMdHqU7NM69atNWDAAM2aNSu87e6779bFF1+sRx55RDfddJPy8vI0e/ZsPfPMMxH3HTBggB5++GH5/X7NmDGjokO3hcLCQu3Zs0dFRUXau3evli5dqilTpuiqq67SwIEDFRcXd8rH+cMPP6wePXro3HPP1c0336xgMKj3339f48ePt/r0yoQ5MCpQKBSS0+lUXFycXnnlFa1bt04XXHCBxo4dG/5wg9OXkZGh9957T8uWLdPFF1+sTp06acaMGSW6i0+ePFmvvPKK2rRpo5deekmLFi1Sq1atLIraPpKSkpSUlFRiO9frqc2dO1c9e/Ys8WZcOvqG/IsvvtDXX38t6eg3EKNHj9aFF16oPXv26N133w1/S4OSonFd9u/fX06nU/3796/Sw8mKX4MkacKECbr88st11VVXqW/fvrr22mt17rnnWhxh7CGnZVea58sff/xRf/vb3/T++++rdevWWrRoUYnlaAcMGKAJEybonnvuUYcOHbRt2zYNHjy4Sj7GExMT1bFjR82YMUNdunTRBRdcoIceeki33367Zs+eLcMw9P7776tLly667bbb1Lx5c91888364YcflJycHD5O06ZNdf311+vKK69U79691aZNmxIfJKuKZs2a6YsvvtA555yjG2+8Ueeee67uuOMOdevWTXl5eapdu7Ykac6cObrhhht055136rzzztPtt9+uw4cPS5LOPvtsTZ48Wffff7+Sk5NLLOtdFWVmZkYMQ+zQoYMWL16sV155RRdccIEmTpyozMzMEsNMbrjhBv30008qKCiosl/6LF26VPXr11fjxo3Vp08fffTRR5o1a5b+/ve/y+FwlOpx3rVrV7322mt655131K5dO3Xv3l1r1qyx+MzKzjBPNUMNoqZPnz5q2rQpXZiBKig3N1fdunXTzz//zJjjCrZ9+3ade+65Wrt2rTp06GB1OJbhNSj6yKm99OrVSykpKXr55ZetDiXmTJo0SW+//XaJoToAYDcMIakAP//8s1auXKnc3FwNHz7c6nAAoEoIBAL66aef9OCDD6pTp05VtnjBa1D0kVPrFRQU6Nlnn1VGRoYcDocWLVqkDz/8UDk5OVaHBgAoRxQwKsCQIUO0du1a3X333brmmmusDgcAqoSVK1eqW7duat68uV5//XWrw7EMr0HRR06tV9xd+rHHHtORI0fUokULvfHGG8edTBEAUHkwhAQAAAAAANgek3gCAAAAAADbo4ABAAAAAABsjwIGAAAAAACwPQoYAAAAAADA9ihgAAAAAAAA26OAAQAAbMswjJP+mzRpktUhAgCACuK0OgAAAIAT2b17d/jnV199VRMnTtTWrVvD2xITE60ICwAAWIACBgAAsK2UlJTwzzVq1JBhGBHbAABA1cEQEgAAAAAAYHsUMAAAAAAAgO1RwAAAAAAAALZHAQMAAAAAANgeBQwAAAAAAGB7FDAAAAAAAIDtUcAAAAAAAAC2Z5imaVodBAAAAAAAwMnQAwMAAAAAANgeBQwAAAAAAGB7FDAAAAAAAIDtUcAAAAAAAAC2RwEDAAAAAADYHgUMAAAAAABgexQwAAAAAACA7VHAAAAAAAAAtkcBAwAAAAAA2B4FDAAAAAAAYHsUMAAAAAAAgO1RwAAAAAAAALb3/wGF21nP+3aavgAAAABJRU5ErkJggg==\n"
},
"metadata": {}
}
],
"source": [
"m = BIMProductAcquisitionAndInventory_v2(\n",
" demand,\n",
" price,\n",
" {\"silicon\": 1000, \"germanium\": 1500, \"plastic\": 1750, \"copper\": 4800},\n",
" {\"silicon\": 500, \"germanium\": 500, \"plastic\": 1000, \"copper\": 2000},\n",
" 9000,\n",
" 2000,\n",
")\n",
"\n",
"m.option[\"solver\"] = SOLVER\n",
"m.solve()\n",
"\n",
"print(\"\\nThe optimal amount of raw materials to acquire in each month is:\")\n",
"display(ShowTableOfAmplVariables(m, \"x\"))\n",
"print(\"\\nThe corresponding optimal stock levels in each months are:\")\n",
"stock = ShowTableOfAmplVariables(m, \"s\")\n",
"display(stock)\n",
"print(\"\\nThe stock levels can be visualized as follows\")\n",
"stock.T.plot(drawstyle=\"steps-mid\", grid=True, figsize=(13, 4))\n",
"plt.xticks(np.arange(len(stock.columns)), stock.columns)\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.2"
},
"colab": {
"provenance": []
}
},
"nbformat": 4,
"nbformat_minor": 0
}