Add files via upload
commit
4736e932df
|
@ -0,0 +1,854 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {
|
||||
"collapsed": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import pandas as pd\n",
|
||||
"from pulp import *"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"collapsed": true
|
||||
},
|
||||
"source": [
|
||||
"## Plant Location "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### Manufacturing variable costs"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 169,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<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>USA</th>\n",
|
||||
" <th>Germany</th>\n",
|
||||
" <th>Japan</th>\n",
|
||||
" <th>Brazil</th>\n",
|
||||
" <th>India</th>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Country</th>\n",
|
||||
" <th></th>\n",
|
||||
" <th></th>\n",
|
||||
" <th></th>\n",
|
||||
" <th></th>\n",
|
||||
" <th></th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <th>USA</th>\n",
|
||||
" <td>12</td>\n",
|
||||
" <td>12</td>\n",
|
||||
" <td>12</td>\n",
|
||||
" <td>12</td>\n",
|
||||
" <td>12</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Germany</th>\n",
|
||||
" <td>13</td>\n",
|
||||
" <td>13</td>\n",
|
||||
" <td>13</td>\n",
|
||||
" <td>13</td>\n",
|
||||
" <td>13</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Japan</th>\n",
|
||||
" <td>10</td>\n",
|
||||
" <td>10</td>\n",
|
||||
" <td>10</td>\n",
|
||||
" <td>10</td>\n",
|
||||
" <td>10</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Brazil</th>\n",
|
||||
" <td>8</td>\n",
|
||||
" <td>8</td>\n",
|
||||
" <td>8</td>\n",
|
||||
" <td>8</td>\n",
|
||||
" <td>8</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>India</th>\n",
|
||||
" <td>5</td>\n",
|
||||
" <td>5</td>\n",
|
||||
" <td>5</td>\n",
|
||||
" <td>5</td>\n",
|
||||
" <td>5</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>\n",
|
||||
"</div>"
|
||||
],
|
||||
"text/plain": [
|
||||
" USA Germany Japan Brazil India\n",
|
||||
"Country \n",
|
||||
"USA 12 12 12 12 12\n",
|
||||
"Germany 13 13 13 13 13\n",
|
||||
"Japan 10 10 10 10 10\n",
|
||||
"Brazil 8 8 8 8 8\n",
|
||||
"India 5 5 5 5 5"
|
||||
]
|
||||
},
|
||||
"execution_count": 169,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Import Costs\n",
|
||||
"manvar_costs = pd.read_excel('variable_costs.xlsx', index_col = 0)\n",
|
||||
"manvar_costs"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### Freight costs"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 170,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<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>USA</th>\n",
|
||||
" <th>Germany</th>\n",
|
||||
" <th>Japan</th>\n",
|
||||
" <th>Brazil</th>\n",
|
||||
" <th>India</th>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Freight Costs ($/Container)</th>\n",
|
||||
" <th></th>\n",
|
||||
" <th></th>\n",
|
||||
" <th></th>\n",
|
||||
" <th></th>\n",
|
||||
" <th></th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <th>USA</th>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>12250</td>\n",
|
||||
" <td>1100</td>\n",
|
||||
" <td>16100</td>\n",
|
||||
" <td>8778</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Germany</th>\n",
|
||||
" <td>13335</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>8617</td>\n",
|
||||
" <td>20244</td>\n",
|
||||
" <td>10073</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Japan</th>\n",
|
||||
" <td>15400</td>\n",
|
||||
" <td>22750</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>43610</td>\n",
|
||||
" <td>14350</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Brazil</th>\n",
|
||||
" <td>16450</td>\n",
|
||||
" <td>22050</td>\n",
|
||||
" <td>28000</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>29750</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>India</th>\n",
|
||||
" <td>13650</td>\n",
|
||||
" <td>15400</td>\n",
|
||||
" <td>24500</td>\n",
|
||||
" <td>29400</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>\n",
|
||||
"</div>"
|
||||
],
|
||||
"text/plain": [
|
||||
" USA Germany Japan Brazil India\n",
|
||||
"Freight Costs ($/Container) \n",
|
||||
"USA 0 12250 1100 16100 8778\n",
|
||||
"Germany 13335 0 8617 20244 10073\n",
|
||||
"Japan 15400 22750 0 43610 14350\n",
|
||||
"Brazil 16450 22050 28000 0 29750\n",
|
||||
"India 13650 15400 24500 29400 0"
|
||||
]
|
||||
},
|
||||
"execution_count": 170,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Import Costs\n",
|
||||
"freight_costs = pd.read_excel('freight_costs.xlsx', index_col = 0)\n",
|
||||
"freight_costs"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### Variable Costs"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 171,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<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>USA</th>\n",
|
||||
" <th>Germany</th>\n",
|
||||
" <th>Japan</th>\n",
|
||||
" <th>Brazil</th>\n",
|
||||
" <th>India</th>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Freight Costs ($/Container)</th>\n",
|
||||
" <th></th>\n",
|
||||
" <th></th>\n",
|
||||
" <th></th>\n",
|
||||
" <th></th>\n",
|
||||
" <th></th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <th>USA</th>\n",
|
||||
" <td>12.000</td>\n",
|
||||
" <td>24.25</td>\n",
|
||||
" <td>13.100</td>\n",
|
||||
" <td>28.100</td>\n",
|
||||
" <td>20.778</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Germany</th>\n",
|
||||
" <td>26.335</td>\n",
|
||||
" <td>13.00</td>\n",
|
||||
" <td>21.617</td>\n",
|
||||
" <td>33.244</td>\n",
|
||||
" <td>23.073</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Japan</th>\n",
|
||||
" <td>25.400</td>\n",
|
||||
" <td>32.75</td>\n",
|
||||
" <td>10.000</td>\n",
|
||||
" <td>53.610</td>\n",
|
||||
" <td>24.350</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Brazil</th>\n",
|
||||
" <td>24.450</td>\n",
|
||||
" <td>30.05</td>\n",
|
||||
" <td>36.000</td>\n",
|
||||
" <td>8.000</td>\n",
|
||||
" <td>37.750</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>India</th>\n",
|
||||
" <td>18.650</td>\n",
|
||||
" <td>20.40</td>\n",
|
||||
" <td>29.500</td>\n",
|
||||
" <td>34.400</td>\n",
|
||||
" <td>5.000</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>\n",
|
||||
"</div>"
|
||||
],
|
||||
"text/plain": [
|
||||
" USA Germany Japan Brazil India\n",
|
||||
"Freight Costs ($/Container) \n",
|
||||
"USA 12.000 24.25 13.100 28.100 20.778\n",
|
||||
"Germany 26.335 13.00 21.617 33.244 23.073\n",
|
||||
"Japan 25.400 32.75 10.000 53.610 24.350\n",
|
||||
"Brazil 24.450 30.05 36.000 8.000 37.750\n",
|
||||
"India 18.650 20.40 29.500 34.400 5.000"
|
||||
]
|
||||
},
|
||||
"execution_count": 171,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Variable Costs\n",
|
||||
"var_cost = freight_costs/1000 + manvar_costs \n",
|
||||
"\n",
|
||||
"var_cost"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### Fixed Costs"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 172,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<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>Low</th>\n",
|
||||
" <th>High</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <th>USA</th>\n",
|
||||
" <td>6500</td>\n",
|
||||
" <td>9500</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Germany</th>\n",
|
||||
" <td>4980</td>\n",
|
||||
" <td>7270</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Japan</th>\n",
|
||||
" <td>6230</td>\n",
|
||||
" <td>9100</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Brazil</th>\n",
|
||||
" <td>3230</td>\n",
|
||||
" <td>4730</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>India</th>\n",
|
||||
" <td>2110</td>\n",
|
||||
" <td>6160</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>\n",
|
||||
"</div>"
|
||||
],
|
||||
"text/plain": [
|
||||
" Low High\n",
|
||||
"USA 6500 9500\n",
|
||||
"Germany 4980 7270\n",
|
||||
"Japan 6230 9100\n",
|
||||
"Brazil 3230 4730\n",
|
||||
"India 2110 6160"
|
||||
]
|
||||
},
|
||||
"execution_count": 172,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Import Costs\n",
|
||||
"fixed_costs = pd.read_excel('fixed_cost.xlsx', index_col = 0)\n",
|
||||
"fixed_costs"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### Plants Capacity"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 173,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<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>Low</th>\n",
|
||||
" <th>High</th>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Capacity (kUnits/month)</th>\n",
|
||||
" <th></th>\n",
|
||||
" <th></th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <th>USA</th>\n",
|
||||
" <td>500</td>\n",
|
||||
" <td>1500</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Germany</th>\n",
|
||||
" <td>500</td>\n",
|
||||
" <td>1500</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Japan</th>\n",
|
||||
" <td>500</td>\n",
|
||||
" <td>1500</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Brazil</th>\n",
|
||||
" <td>500</td>\n",
|
||||
" <td>1500</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>India</th>\n",
|
||||
" <td>500</td>\n",
|
||||
" <td>3000</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>\n",
|
||||
"</div>"
|
||||
],
|
||||
"text/plain": [
|
||||
" Low High\n",
|
||||
"Capacity (kUnits/month) \n",
|
||||
"USA 500 1500\n",
|
||||
"Germany 500 1500\n",
|
||||
"Japan 500 1500\n",
|
||||
"Brazil 500 1500\n",
|
||||
"India 500 3000"
|
||||
]
|
||||
},
|
||||
"execution_count": 173,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Two types of plants: Low Capacity and High Capacity Plant\n",
|
||||
"cap = pd.read_excel('capacity.xlsx', index_col = 0)\n",
|
||||
"cap"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"#### Demand "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 174,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<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>Demand</th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <th>USA</th>\n",
|
||||
" <td>2800000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Germany</th>\n",
|
||||
" <td>90000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Japan</th>\n",
|
||||
" <td>1700000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Brazil</th>\n",
|
||||
" <td>145000</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>India</th>\n",
|
||||
" <td>160000</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>\n",
|
||||
"</div>"
|
||||
],
|
||||
"text/plain": [
|
||||
" Demand\n",
|
||||
"USA 2800000\n",
|
||||
"Germany 90000\n",
|
||||
"Japan 1700000\n",
|
||||
"Brazil 145000\n",
|
||||
"India 160000"
|
||||
]
|
||||
},
|
||||
"execution_count": 174,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# -- Demand\n",
|
||||
"demand = pd.read_excel('demand.xlsx', index_col = 0)\n",
|
||||
"demand"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 175,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Total Costs = 92,981,000 ($/Month)\n",
|
||||
"\n",
|
||||
"Status: Optimal\n",
|
||||
"('Brazil','High') = 0.0\n",
|
||||
"('Brazil','Low') = 1.0\n",
|
||||
"('Germany','High') = 0.0\n",
|
||||
"('Germany','Low') = 0.0\n",
|
||||
"('India','High') = 1.0\n",
|
||||
"('India','Low') = 0.0\n",
|
||||
"('Japan','High') = 1.0\n",
|
||||
"('Japan','Low') = 0.0\n",
|
||||
"('USA','High') = 1.0\n",
|
||||
"('USA','Low') = 0.0\n",
|
||||
"('Brazil','Brazil') = 145000.0\n",
|
||||
"('Brazil','Germany') = 0.0\n",
|
||||
"('Brazil','India') = 0.0\n",
|
||||
"('Brazil','Japan') = 0.0\n",
|
||||
"('Brazil','USA') = 0.0\n",
|
||||
"('Germany','Brazil') = 0.0\n",
|
||||
"('Germany','Germany') = 0.0\n",
|
||||
"('Germany','India') = 0.0\n",
|
||||
"('Germany','Japan') = 0.0\n",
|
||||
"('Germany','USA') = 0.0\n",
|
||||
"('India','Brazil') = 0.0\n",
|
||||
"('India','Germany') = 90000.0\n",
|
||||
"('India','India') = 160000.0\n",
|
||||
"('India','Japan') = 0.0\n",
|
||||
"('India','USA') = 1500000.0\n",
|
||||
"('Japan','Brazil') = 0.0\n",
|
||||
"('Japan','Germany') = 0.0\n",
|
||||
"('Japan','India') = 0.0\n",
|
||||
"('Japan','Japan') = 1500000.0\n",
|
||||
"('Japan','USA') = 0.0\n",
|
||||
"('USA','Brazil') = 0.0\n",
|
||||
"('USA','Germany') = 0.0\n",
|
||||
"('USA','India') = 0.0\n",
|
||||
"('USA','Japan') = 200000.0\n",
|
||||
"('USA','USA') = 1300000.0\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"C:\\Users\\Samir\\Anaconda3\\lib\\site-packages\\pulp\\pulp.py:1199: UserWarning: Spaces are not permitted in the name. Converted to '_'\n",
|
||||
" warnings.warn(\"Spaces are not permitted in the name. Converted to '_'\")\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Define Decision Variables\n",
|
||||
"loc = ['USA', 'Germany', 'Japan', 'Brazil', 'India']\n",
|
||||
"size = ['Low', 'High']\n",
|
||||
"\n",
|
||||
"# Initialize Class\n",
|
||||
"model = LpProblem(\"Capacitated Plant Location Model\", LpMinimize)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Create Decision Variables\n",
|
||||
"x = LpVariable.dicts(\"production_\", [(i,j) for i in loc for j in loc],\n",
|
||||
" lowBound=0, upBound=None, cat='continuous')\n",
|
||||
"y = LpVariable.dicts(\"plant_\", \n",
|
||||
" [(i,s) for s in size for i in loc], cat='Binary')\n",
|
||||
"\n",
|
||||
"# Define Objective Function\n",
|
||||
"model += (lpSum([fixed_costs.loc[i,s] * y[(i,s)] * 1000 for s in size for i in loc])\n",
|
||||
" + lpSum([var_cost.loc[i,j] * x[(i,j)] for i in loc for j in loc]))\n",
|
||||
"\n",
|
||||
"# Add Constraints\n",
|
||||
"for j in loc:\n",
|
||||
" model += lpSum([x[(i, j)] for i in loc]) == demand.loc[j,'Demand']\n",
|
||||
"for i in loc:\n",
|
||||
" model += lpSum([x[(i, j)] for j in loc]) <= lpSum([cap.loc[i,s]*y[(i,s)] * 1000\n",
|
||||
" for s in size])\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Define logical constraint: Add a logical constraint so that if the high capacity plant in USA is open, then a low capacity plant in Germany is also opened.\n",
|
||||
"# model += y[('USA','High_Cap')] <= y[('Germany','Low_Cap')] \n",
|
||||
" \n",
|
||||
"# Solve Model\n",
|
||||
"model.solve()\n",
|
||||
"print(\"Total Costs = {:,} ($/Month)\".format(int(value(model.objective))))\n",
|
||||
"print('\\n' + \"Status: {}\".format(LpStatus[model.status]))\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Dictionnary\n",
|
||||
"dict_plant = {}\n",
|
||||
"dict_prod = {}\n",
|
||||
"for v in model.variables():\n",
|
||||
" if 'plant' in v.name:\n",
|
||||
" name = v.name.replace('plant__', '').replace('_', '')\n",
|
||||
" dict_plant[name] = int(v.varValue)\n",
|
||||
" p_name = name\n",
|
||||
" else:\n",
|
||||
" name = v.name.replace('production__', '').replace('_', '')\n",
|
||||
" dict_prod[name] = v.varValue\n",
|
||||
" print(name, \"=\", v.varValue)\n",
|
||||
" \n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 176,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<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>Low</th>\n",
|
||||
" <th>High</th>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Location</th>\n",
|
||||
" <th></th>\n",
|
||||
" <th></th>\n",
|
||||
" </tr>\n",
|
||||
" </thead>\n",
|
||||
" <tbody>\n",
|
||||
" <tr>\n",
|
||||
" <th>USA</th>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>1</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Germany</th>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Japan</th>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>1</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>Brazil</th>\n",
|
||||
" <td>1</td>\n",
|
||||
" <td>0</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
" <th>India</th>\n",
|
||||
" <td>0</td>\n",
|
||||
" <td>1</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
"</table>\n",
|
||||
"</div>"
|
||||
],
|
||||
"text/plain": [
|
||||
" Low High\n",
|
||||
"Location \n",
|
||||
"USA 0 1\n",
|
||||
"Germany 0 0\n",
|
||||
"Japan 0 1\n",
|
||||
"Brazil 1 0\n",
|
||||
"India 0 1"
|
||||
]
|
||||
},
|
||||
"execution_count": 176,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# Capacity Plant\n",
|
||||
"list_low, list_high = [], []\n",
|
||||
"for l in loc:\n",
|
||||
" for cap in ['Low', 'High']:\n",
|
||||
" x = \"('{}','{}')\".format(l, cap)\n",
|
||||
" if cap == 'Low':\n",
|
||||
" list_low.append(dict_plant[x])\n",
|
||||
" else:\n",
|
||||
" list_high.append(dict_plant[x])\n",
|
||||
"df_capacity = pd.DataFrame({'Location': loc, 'Low': list_low, 'High': list_high}).set_index('Location')\n",
|
||||
" \n",
|
||||
"df_capacity"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.6.1"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue