Add files via upload

main
Samir Saci 2021-10-23 22:36:41 +02:00 committed by GitHub
commit 4736e932df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 854 additions and 0 deletions

View File

@ -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
}

BIN
capacity.xlsx 100644

Binary file not shown.

BIN
demand.xlsx 100644

Binary file not shown.

BIN
fixed_cost.xlsx 100644

Binary file not shown.

BIN
freight_costs.xlsx 100644

Binary file not shown.

BIN
total_costs.xlsx 100644

Binary file not shown.

BIN
variable_costs.xlsx 100644

Binary file not shown.