Created
April 17, 2022 05:17
-
-
Save ytakashina/044d0e40c26a87578b321083a9ee89fb to your computer and use it in GitHub Desktop.
model-building-example-5.2.ipynb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"name": "model-building-example-5.2.ipynb", | |
"provenance": [], | |
"collapsed_sections": [], | |
"authorship_tag": "ABX9TyNF9PMC5VQnfKiX6wq4JP/N", | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3" | |
}, | |
"language_info": { | |
"name": "python" | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/ytakashina/044d0e40c26a87578b321083a9ee89fb/model-building-example-5-2.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"id": "R4JxWuBcQIHp", | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"outputId": "afce9415-eb2b-448b-e327-999a79b26425" | |
}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Requirement already satisfied: pulp in /usr/local/lib/python3.7/dist-packages (2.6.0)\n" | |
] | |
} | |
], | |
"source": [ | |
"!pip install pulp\n", | |
"# !pip install git+https://github.com/coin-or/pulp.git\n", | |
"# !pip freeze" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"import pandas as pd\n", | |
"import pulp as pl\n", | |
"import numpy as np\n", | |
"import networkx as nx" | |
], | |
"metadata": { | |
"id": "DmkHBNmeQJlW" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"# Model Building in Mathematical Programming\n", | |
"## Example 5.2: A Transportation Problem\n" | |
], | |
"metadata": { | |
"id": "8DdMzGs87lNr" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"### A conventional LP model" | |
], | |
"metadata": { | |
"id": "2STc6iIbFvGV" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"" | |
], | |
"metadata": { | |
"id": "2THfHNrNtTT2" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# Sets\n", | |
"S = pd.Index([f\"S{i}\" for i in range(1, 4)], name=\"s\")\n", | |
"T = pd.Index([f\"T{i}\" for i in range(1, 5)], name=\"t\")" | |
], | |
"metadata": { | |
"id": "-hG6uweOFsi2" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# Constants\n", | |
"capacities = pd.Series([135, 56, 93], index=S)\n", | |
"requirements = pd.Series([62, 83, 39, 91], index=T)\n", | |
"trans_uc = pd.DataFrame([\n", | |
" [132, None, 97, 103],\n", | |
" [85, 91, None, None],\n", | |
" [106, 89, 100, 98],\n", | |
" ], index=S, columns=T,\n", | |
").stack()" | |
], | |
"metadata": { | |
"id": "v0qVzV-dFsf_" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# Sets defined using constants\n", | |
"R = trans_uc.index\n", | |
"trans_uc.unstack()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 175 | |
}, | |
"id": "6orOlVvwKIus", | |
"outputId": "41b6f4de-5b3a-48ec-9e37-3090f5e91d2e" | |
}, | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"t T1 T2 T3 T4\n", | |
"s \n", | |
"S1 132.0 NaN 97.0 103.0\n", | |
"S2 85.0 91.0 NaN NaN\n", | |
"S3 106.0 89.0 100.0 98.0" | |
], | |
"text/html": [ | |
"\n", | |
" <div id=\"df-d8b19f54-b629-4725-aea4-f83c5cca1a89\">\n", | |
" <div class=\"colab-df-container\">\n", | |
" <div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th>t</th>\n", | |
" <th>T1</th>\n", | |
" <th>T2</th>\n", | |
" <th>T3</th>\n", | |
" <th>T4</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>s</th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>S1</th>\n", | |
" <td>132.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>97.0</td>\n", | |
" <td>103.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>S2</th>\n", | |
" <td>85.0</td>\n", | |
" <td>91.0</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>S3</th>\n", | |
" <td>106.0</td>\n", | |
" <td>89.0</td>\n", | |
" <td>100.0</td>\n", | |
" <td>98.0</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>\n", | |
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-d8b19f54-b629-4725-aea4-f83c5cca1a89')\"\n", | |
" title=\"Convert this dataframe to an interactive table.\"\n", | |
" style=\"display:none;\">\n", | |
" \n", | |
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n", | |
" width=\"24px\">\n", | |
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n", | |
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n", | |
" </svg>\n", | |
" </button>\n", | |
" \n", | |
" <style>\n", | |
" .colab-df-container {\n", | |
" display:flex;\n", | |
" flex-wrap:wrap;\n", | |
" gap: 12px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert {\n", | |
" background-color: #E8F0FE;\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: #1967D2;\n", | |
" height: 32px;\n", | |
" padding: 0 0 0 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert:hover {\n", | |
" background-color: #E2EBFA;\n", | |
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: #174EA6;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert {\n", | |
" background-color: #3B4455;\n", | |
" fill: #D2E3FC;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert:hover {\n", | |
" background-color: #434B5C;\n", | |
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n", | |
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n", | |
" fill: #FFFFFF;\n", | |
" }\n", | |
" </style>\n", | |
"\n", | |
" <script>\n", | |
" const buttonEl =\n", | |
" document.querySelector('#df-d8b19f54-b629-4725-aea4-f83c5cca1a89 button.colab-df-convert');\n", | |
" buttonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
"\n", | |
" async function convertToInteractive(key) {\n", | |
" const element = document.querySelector('#df-d8b19f54-b629-4725-aea4-f83c5cca1a89');\n", | |
" const dataTable =\n", | |
" await google.colab.kernel.invokeFunction('convertToInteractive',\n", | |
" [key], {});\n", | |
" if (!dataTable) return;\n", | |
"\n", | |
" const docLinkHtml = 'Like what you see? Visit the ' +\n", | |
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n", | |
" + ' to learn more about interactive tables.';\n", | |
" element.innerHTML = '';\n", | |
" dataTable['output_type'] = 'display_data';\n", | |
" await google.colab.output.renderOutput(dataTable, element);\n", | |
" const docLink = document.createElement('div');\n", | |
" docLink.innerHTML = docLinkHtml;\n", | |
" element.appendChild(docLink);\n", | |
" }\n", | |
" </script>\n", | |
" </div>\n", | |
" </div>\n", | |
" " | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 5 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# Variables\n", | |
"# Independent variable\n", | |
"trans = pd.Series(pl.LpVariable.dicts(\"trans\", indices=R, lowBound=0), index=R)\n", | |
"\n", | |
"# Dependent variables\n", | |
"sell = trans.groupby(level=\"t\").sum() # can be computationally expensive for a large problem\n", | |
"prod = trans.groupby(level=\"s\").sum() # can be computationally expensive for a large problem\n", | |
"trans_cost = pl.lpSum(trans * trans_uc)" | |
], | |
"metadata": { | |
"id": "mwmTuFG4Fsby" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# Objective\n", | |
"model = pl.LpProblem(sense=pl.const.LpMinimize)\n", | |
"model.setObjective(trans_cost)" | |
], | |
"metadata": { | |
"id": "fZjpaQG2FsXO" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# Constraint\n", | |
"for s in S:\n", | |
" # Eq. 5.21 - 5.23\n", | |
" model.addConstraint(prod[s] <= capacities[s], f\"availability[{s}]\")\n", | |
"\n", | |
"for t in T:\n", | |
" # Eq. 5.24 - 5.27\n", | |
" model.addConstraint(sell[t] == requirements[t], f\"requirement[{t}]\")" | |
], | |
"metadata": { | |
"id": "hTVzW1elFsU9" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"model.solve()" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "NKG-uJPNFsMb", | |
"outputId": "e82ef3be-a55b-45c9-bd2d-02ea06022632" | |
}, | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"1" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 9 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# For each customer (T1-T4), the supplier with minimum cost is preferred.\n", | |
"# However, since there is a capacity constraint, the final result is a little complex than simply selecting minimum cost supplier.\n", | |
"trans_result = pd.Series(trans.apply(lambda x: x.value()))\n", | |
"pd.concat([trans_uc.unstack(), trans_result.unstack()], axis=1, keys=[\"trans_uc\", \"trans\"]).style.background_gradient(\"coolwarm\", axis=0)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 206 | |
}, | |
"id": "3Wt7cAZaMGtD", | |
"outputId": "356f490b-a02b-4021-bf34-0c69b6109187" | |
}, | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"<pandas.io.formats.style.Styler at 0x7ff5e1263e50>" | |
], | |
"text/html": [ | |
"<style type=\"text/css\">\n", | |
"#T_be990_row0_col0, #T_be990_row0_col3, #T_be990_row0_col6, #T_be990_row0_col7, #T_be990_row1_col1, #T_be990_row1_col4, #T_be990_row2_col2, #T_be990_row2_col5 {\n", | |
" background-color: #b40426;\n", | |
" color: #f1f1f1;\n", | |
"}\n", | |
"#T_be990_row0_col1, #T_be990_row0_col5, #T_be990_row1_col2, #T_be990_row1_col3, #T_be990_row1_col6, #T_be990_row1_col7 {\n", | |
" background-color: #000000;\n", | |
" color: #f1f1f1;\n", | |
"}\n", | |
"#T_be990_row0_col2, #T_be990_row0_col4, #T_be990_row1_col0, #T_be990_row1_col5, #T_be990_row2_col1, #T_be990_row2_col3, #T_be990_row2_col6, #T_be990_row2_col7 {\n", | |
" background-color: #3b4cc0;\n", | |
" color: #f1f1f1;\n", | |
"}\n", | |
"#T_be990_row2_col0 {\n", | |
" background-color: #cedaeb;\n", | |
" color: #000000;\n", | |
"}\n", | |
"#T_be990_row2_col4 {\n", | |
" background-color: #5b7ae5;\n", | |
" color: #f1f1f1;\n", | |
"}\n", | |
"</style>\n", | |
"<table id=\"T_be990_\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr>\n", | |
" <th class=\"blank level0\" > </th>\n", | |
" <th class=\"col_heading level0 col0\" colspan=\"4\">trans_uc</th>\n", | |
" <th class=\"col_heading level0 col4\" colspan=\"4\">trans</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th class=\"index_name level1\" >t</th>\n", | |
" <th class=\"col_heading level1 col0\" >T1</th>\n", | |
" <th class=\"col_heading level1 col1\" >T2</th>\n", | |
" <th class=\"col_heading level1 col2\" >T3</th>\n", | |
" <th class=\"col_heading level1 col3\" >T4</th>\n", | |
" <th class=\"col_heading level1 col4\" >T1</th>\n", | |
" <th class=\"col_heading level1 col5\" >T2</th>\n", | |
" <th class=\"col_heading level1 col6\" >T3</th>\n", | |
" <th class=\"col_heading level1 col7\" >T4</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th class=\"index_name level0\" >s</th>\n", | |
" <th class=\"blank col0\" > </th>\n", | |
" <th class=\"blank col1\" > </th>\n", | |
" <th class=\"blank col2\" > </th>\n", | |
" <th class=\"blank col3\" > </th>\n", | |
" <th class=\"blank col4\" > </th>\n", | |
" <th class=\"blank col5\" > </th>\n", | |
" <th class=\"blank col6\" > </th>\n", | |
" <th class=\"blank col7\" > </th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th id=\"T_be990_level0_row0\" class=\"row_heading level0 row0\" >S1</th>\n", | |
" <td id=\"T_be990_row0_col0\" class=\"data row0 col0\" >132.000000</td>\n", | |
" <td id=\"T_be990_row0_col1\" class=\"data row0 col1\" >nan</td>\n", | |
" <td id=\"T_be990_row0_col2\" class=\"data row0 col2\" >97.000000</td>\n", | |
" <td id=\"T_be990_row0_col3\" class=\"data row0 col3\" >103.000000</td>\n", | |
" <td id=\"T_be990_row0_col4\" class=\"data row0 col4\" >0.000000</td>\n", | |
" <td id=\"T_be990_row0_col5\" class=\"data row0 col5\" >nan</td>\n", | |
" <td id=\"T_be990_row0_col6\" class=\"data row0 col6\" >39.000000</td>\n", | |
" <td id=\"T_be990_row0_col7\" class=\"data row0 col7\" >87.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th id=\"T_be990_level0_row1\" class=\"row_heading level0 row1\" >S2</th>\n", | |
" <td id=\"T_be990_row1_col0\" class=\"data row1 col0\" >85.000000</td>\n", | |
" <td id=\"T_be990_row1_col1\" class=\"data row1 col1\" >91.000000</td>\n", | |
" <td id=\"T_be990_row1_col2\" class=\"data row1 col2\" >nan</td>\n", | |
" <td id=\"T_be990_row1_col3\" class=\"data row1 col3\" >nan</td>\n", | |
" <td id=\"T_be990_row1_col4\" class=\"data row1 col4\" >56.000000</td>\n", | |
" <td id=\"T_be990_row1_col5\" class=\"data row1 col5\" >0.000000</td>\n", | |
" <td id=\"T_be990_row1_col6\" class=\"data row1 col6\" >nan</td>\n", | |
" <td id=\"T_be990_row1_col7\" class=\"data row1 col7\" >nan</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th id=\"T_be990_level0_row2\" class=\"row_heading level0 row2\" >S3</th>\n", | |
" <td id=\"T_be990_row2_col0\" class=\"data row2 col0\" >106.000000</td>\n", | |
" <td id=\"T_be990_row2_col1\" class=\"data row2 col1\" >89.000000</td>\n", | |
" <td id=\"T_be990_row2_col2\" class=\"data row2 col2\" >100.000000</td>\n", | |
" <td id=\"T_be990_row2_col3\" class=\"data row2 col3\" >98.000000</td>\n", | |
" <td id=\"T_be990_row2_col4\" class=\"data row2 col4\" >6.000000</td>\n", | |
" <td id=\"T_be990_row2_col5\" class=\"data row2 col5\" >83.000000</td>\n", | |
" <td id=\"T_be990_row2_col6\" class=\"data row2 col6\" >0.000000</td>\n", | |
" <td id=\"T_be990_row2_col7\" class=\"data row2 col7\" >4.000000</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 10 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"## A network flow model\n", | |
"Since the conventional LP model can be large and hard to solve (at least, in 2013, when this book was published), you can use a special purpose solver (minimum cost flow) instead." | |
], | |
"metadata": { | |
"id": "GOGfZ7DlPJeX" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"" | |
], | |
"metadata": { | |
"id": "UDeCFNSDPo3n" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# Note: in networkx, use demand instead of capacity. In other words, outsourcing nodes should have negative weights, and insourcing nodes should have positive weights.\n", | |
"G = nx.DiGraph()\n", | |
"for s in S:\n", | |
" G.add_node(s, demand=-capacities[s])\n", | |
"\n", | |
"for t in T:\n", | |
" G.add_node(t, demand=requirements[t])\n", | |
"\n", | |
"for s, t in R:\n", | |
" G.add_edge(s, t, weight=trans_uc[s, t], capacity=1000)\n", | |
"\n", | |
"dummy_demand = capacities.sum() - requirements.sum()\n", | |
"G.add_node(\"dummy\", demand=dummy_demand)\n", | |
"for s in S:\n", | |
" G.add_edge(s, \"dummy\", weight=100, capacity=1000)\n", | |
"\n", | |
"pos = nx.bipartite_layout(G, S)\n", | |
"nx.draw_networkx(G, pos)" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 248 | |
}, | |
"id": "cwkhDjElPIlP", | |
"outputId": "5b895599-7ec6-4ac7-f5b6-3bde675d994d" | |
}, | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
], | |
"image/png": "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\n" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# Result (the same as that of the LP)\n", | |
"pd.DataFrame(nx.min_cost_flow(G))[S].fillna(0).sort_index().T" | |
], | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 143 | |
}, | |
"id": "jef8qsehzzuM", | |
"outputId": "45f012f3-339d-4e1e-e63d-2673ef0c235f" | |
}, | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
" T1 T2 T3 T4 dummy\n", | |
"S1 0.0 0.0 39.0 87.0 9.0\n", | |
"S2 56.0 0.0 0.0 0.0 0.0\n", | |
"S3 6.0 83.0 0.0 4.0 0.0" | |
], | |
"text/html": [ | |
"\n", | |
" <div id=\"df-2a12ec84-53b8-4640-985d-2381897fff12\">\n", | |
" <div class=\"colab-df-container\">\n", | |
" <div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>T1</th>\n", | |
" <th>T2</th>\n", | |
" <th>T3</th>\n", | |
" <th>T4</th>\n", | |
" <th>dummy</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>S1</th>\n", | |
" <td>0.0</td>\n", | |
" <td>0.0</td>\n", | |
" <td>39.0</td>\n", | |
" <td>87.0</td>\n", | |
" <td>9.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>S2</th>\n", | |
" <td>56.0</td>\n", | |
" <td>0.0</td>\n", | |
" <td>0.0</td>\n", | |
" <td>0.0</td>\n", | |
" <td>0.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>S3</th>\n", | |
" <td>6.0</td>\n", | |
" <td>83.0</td>\n", | |
" <td>0.0</td>\n", | |
" <td>4.0</td>\n", | |
" <td>0.0</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>\n", | |
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-2a12ec84-53b8-4640-985d-2381897fff12')\"\n", | |
" title=\"Convert this dataframe to an interactive table.\"\n", | |
" style=\"display:none;\">\n", | |
" \n", | |
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n", | |
" width=\"24px\">\n", | |
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n", | |
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n", | |
" </svg>\n", | |
" </button>\n", | |
" \n", | |
" <style>\n", | |
" .colab-df-container {\n", | |
" display:flex;\n", | |
" flex-wrap:wrap;\n", | |
" gap: 12px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert {\n", | |
" background-color: #E8F0FE;\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: #1967D2;\n", | |
" height: 32px;\n", | |
" padding: 0 0 0 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert:hover {\n", | |
" background-color: #E2EBFA;\n", | |
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: #174EA6;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert {\n", | |
" background-color: #3B4455;\n", | |
" fill: #D2E3FC;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert:hover {\n", | |
" background-color: #434B5C;\n", | |
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n", | |
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n", | |
" fill: #FFFFFF;\n", | |
" }\n", | |
" </style>\n", | |
"\n", | |
" <script>\n", | |
" const buttonEl =\n", | |
" document.querySelector('#df-2a12ec84-53b8-4640-985d-2381897fff12 button.colab-df-convert');\n", | |
" buttonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
"\n", | |
" async function convertToInteractive(key) {\n", | |
" const element = document.querySelector('#df-2a12ec84-53b8-4640-985d-2381897fff12');\n", | |
" const dataTable =\n", | |
" await google.colab.kernel.invokeFunction('convertToInteractive',\n", | |
" [key], {});\n", | |
" if (!dataTable) return;\n", | |
"\n", | |
" const docLinkHtml = 'Like what you see? Visit the ' +\n", | |
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n", | |
" + ' to learn more about interactive tables.';\n", | |
" element.innerHTML = '';\n", | |
" dataTable['output_type'] = 'display_data';\n", | |
" await google.colab.output.renderOutput(dataTable, element);\n", | |
" const docLink = document.createElement('div');\n", | |
" docLink.innerHTML = docLinkHtml;\n", | |
" element.appendChild(docLink);\n", | |
" }\n", | |
" </script>\n", | |
" </div>\n", | |
" </div>\n", | |
" " | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 12 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"# Result of LP\n", | |
"trans_result.unstack().fillna(0)" | |
], | |
"metadata": { | |
"id": "shLWuDop2LAz", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 175 | |
}, | |
"outputId": "0ca0aa31-0da8-4aa4-d5d9-0586bc42ed03" | |
}, | |
"execution_count": 15, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"t T1 T2 T3 T4\n", | |
"s \n", | |
"S1 0.0 0.0 39.0 87.0\n", | |
"S2 56.0 0.0 0.0 0.0\n", | |
"S3 6.0 83.0 0.0 4.0" | |
], | |
"text/html": [ | |
"\n", | |
" <div id=\"df-b5057867-a242-408e-8893-b2f8a857c160\">\n", | |
" <div class=\"colab-df-container\">\n", | |
" <div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th>t</th>\n", | |
" <th>T1</th>\n", | |
" <th>T2</th>\n", | |
" <th>T3</th>\n", | |
" <th>T4</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>s</th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>S1</th>\n", | |
" <td>0.0</td>\n", | |
" <td>0.0</td>\n", | |
" <td>39.0</td>\n", | |
" <td>87.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>S2</th>\n", | |
" <td>56.0</td>\n", | |
" <td>0.0</td>\n", | |
" <td>0.0</td>\n", | |
" <td>0.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>S3</th>\n", | |
" <td>6.0</td>\n", | |
" <td>83.0</td>\n", | |
" <td>0.0</td>\n", | |
" <td>4.0</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>\n", | |
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-b5057867-a242-408e-8893-b2f8a857c160')\"\n", | |
" title=\"Convert this dataframe to an interactive table.\"\n", | |
" style=\"display:none;\">\n", | |
" \n", | |
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n", | |
" width=\"24px\">\n", | |
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n", | |
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n", | |
" </svg>\n", | |
" </button>\n", | |
" \n", | |
" <style>\n", | |
" .colab-df-container {\n", | |
" display:flex;\n", | |
" flex-wrap:wrap;\n", | |
" gap: 12px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert {\n", | |
" background-color: #E8F0FE;\n", | |
" border: none;\n", | |
" border-radius: 50%;\n", | |
" cursor: pointer;\n", | |
" display: none;\n", | |
" fill: #1967D2;\n", | |
" height: 32px;\n", | |
" padding: 0 0 0 0;\n", | |
" width: 32px;\n", | |
" }\n", | |
"\n", | |
" .colab-df-convert:hover {\n", | |
" background-color: #E2EBFA;\n", | |
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n", | |
" fill: #174EA6;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert {\n", | |
" background-color: #3B4455;\n", | |
" fill: #D2E3FC;\n", | |
" }\n", | |
"\n", | |
" [theme=dark] .colab-df-convert:hover {\n", | |
" background-color: #434B5C;\n", | |
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n", | |
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n", | |
" fill: #FFFFFF;\n", | |
" }\n", | |
" </style>\n", | |
"\n", | |
" <script>\n", | |
" const buttonEl =\n", | |
" document.querySelector('#df-b5057867-a242-408e-8893-b2f8a857c160 button.colab-df-convert');\n", | |
" buttonEl.style.display =\n", | |
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n", | |
"\n", | |
" async function convertToInteractive(key) {\n", | |
" const element = document.querySelector('#df-b5057867-a242-408e-8893-b2f8a857c160');\n", | |
" const dataTable =\n", | |
" await google.colab.kernel.invokeFunction('convertToInteractive',\n", | |
" [key], {});\n", | |
" if (!dataTable) return;\n", | |
"\n", | |
" const docLinkHtml = 'Like what you see? Visit the ' +\n", | |
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n", | |
" + ' to learn more about interactive tables.';\n", | |
" element.innerHTML = '';\n", | |
" dataTable['output_type'] = 'display_data';\n", | |
" await google.colab.output.renderOutput(dataTable, element);\n", | |
" const docLink = document.createElement('div');\n", | |
" docLink.innerHTML = docLinkHtml;\n", | |
" element.appendChild(docLink);\n", | |
" }\n", | |
" </script>\n", | |
" </div>\n", | |
" </div>\n", | |
" " | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 15 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"" | |
], | |
"metadata": { | |
"id": "RbjL7n409D10" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment