{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import gurobipy as gp\n", "from gurobipy import GRB" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "curve = [\n", " \"Apr'21\", 2.921,\n", " \"May'21\", 2.892,\n", " \"Jun'21\", 2.922,\n", " \"Jul'21\", 2.96,\n", " \"Aug'21\", 2.974,\n", " \"Sep'21\", 2.966,\n", " \"Oct'21\", 3.007,\n", " \"Nov'21\", 3.07,\n", " \"Dec'21\", 3.203,\n", " \"Jan'22\", 3.294,\n", " \"Feb'22\", 3.216,\n", " \"Mar'22\", 3.03,\n", " \"Apr'22\", 2.568,\n", " \"May'22\", 2.48,\n", " \"Jun'22\", 2.525,\n", " \"Jul'22\", 2.562,\n", " \"Aug'22\", 2.57,\n", " \"Sep'22\", 2.559,\n", " \"Oct'22\", 2.592,\n", " \"Nov'22\", 2.681,\n", " \"Dec'22\", 2.87,\n", " \"Jan'23\", 2.987,\n", " \"Feb'23\", 2.939,\n", " \"Mar'23\", 2.779,\n", " \"Apr'23\", 2.388\n", "]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame( data={ 'Contract': curve[0::2], 'Price': curve[1::2]})" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/marcino/.local/lib/python3.8/site-packages/pandas/plotting/_matplotlib/core.py:1235: UserWarning: FixedFormatter should only be used together with FixedLocator\n", " ax.set_xticklabels(xticklabels)\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "df.plot(x='Contract', y='Price')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "N=3 # number of months to use\n", "max_storage_capacity=100000\n", "max_daily_injection=pd.DataFrame(data=[(0,8000),(0.5,8000),(1.0,8000)], columns=['ratchet', 'mdiq'] )\n", "max_daily_withdrawal=pd.DataFrame( data=[(0,9000),(0.5,9000),(1.0,9000)], columns=['ratchet', 'mdwq'] )" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "max_daily_injection.plot(x='ratchet',y='mdiq', style='g-')\n", "max_daily_withdrawal.plot(x='ratchet',y='mdwq',style='b-')" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "m = gp.Model('Gas Storage No Ratchets Daily')\n", "# injection / withdrawal quantities\n", "I = m.addVars(range(N), vtype=GRB.INTEGER, name='I')\n", "W = m.addVars(range(N), vtype=GRB.INTEGER, name='W')\n" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [], "source": [ "# number of days in each injection / drawing month\n", "days = list( map( lambda x: ((x+pd.DateOffset(months=1))-x).days, df.Contract.apply( lambda x: pd.to_datetime( '1-' + x ))))\n", "days[0] = 2\n", "days[1] = 2\n", "days[2] = 2\n", "\n", "# number of calendar days in the simulation\n", "M = sum( days[0:N])\n", "\n", "prices = list(df.Price)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [], "source": [ "injection_charges=[None]*N\n", "total_injection=[None]*N\n", "daily_injection=[None]*M\n", "\n", "# for each injection month\n", "for i in range(N):\n", " total_injection[i] = I[i]*10000\n", " injection_charges[i] = -total_injection[i] * prices[i]\n", " \n", "for i in range(N):\n", " lb = sum(days[0:i])\n", " ub = sum(days[:i+1])\n", " daily_injection[lb:ub] = [ total_injection[i] / days[i] ] * days[i]\n", "\n", "withdrawal_credit=[None]*N\n", "total_draw=[None]*N\n", "daily_draw=[None]*M\n", "\n", "# for each drawing month\n", "for j in range(N):\n", " total_draw[j] = W[j]*10000\n", " withdrawal_credit[j] = total_draw[j] * prices[j]\n", " \n", "for i in range(N):\n", " lb = sum(days[0:i])\n", " ub = sum(days[:i+1])\n", " daily_draw[lb:ub] = [ total_draw[i] / days[i] ] * days[i]\n", "\n", "daily_storage=[None]*M\n", "for i in range(M):\n", " if i == 0:\n", " daily_storage[i] = daily_injection[i] - daily_draw[i]\n", " else:\n", " daily_storage[i] = daily_injection[i] - daily_draw[i] + daily_storage[i-1]" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "# add range control variables\n", "irc = m.addVars( M-1, 2, vtype=GRB.BINARY, name='irc')\n", "wrc = m.addVars( M-1, 2, vtype=GRB.BINARY, name='wrc')" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# target function\n", "m.setObjective( gp.quicksum(withdrawal_credit) + gp.quicksum(injection_charges), GRB.MAXIMIZE )\n", "\n", "# add constraints\n", "for i in range(M):\n", " m.addConstr( daily_storage[i] >= 0, f'daily_storage gt 0 for {i}' )\n", " m.addConstr( daily_storage[i] <= max_storage_capacity, f'daily_storage le max for {i}' ) \n", "\n", "m.addConstr( daily_injection[0] <= max_daily_injection.loc[0, 'mdiq'], f'daily_injection {i+1}' )\n", "m.addConstr( daily_draw[0] <= max_daily_withdrawal.loc[ 0, 'mdwq'], f'daily draw {i+1}' )\n", " \n", "for i in range(M-1):\n", " # injection\n", " # only one range is allowed\n", " m.addConstr( gp.quicksum( [ irc[i,j] for j in range(2) ] ) == 1, f'irc {i}' )\n", "\n", " # first range\n", " m.addConstr( irc[i,0] * max_daily_injection.loc[0,'ratchet'] <= daily_storage[i] / max_storage_capacity, 'lb1' )\n", " m.addConstr( irc[i,0] * max_daily_injection.loc[1,'ratchet'] >= daily_storage[i] / max_storage_capacity, 'ub1' )\n", "\n", " # second range\n", " m.addConstr( irc[i,1] * max_daily_injection.loc[1,'ratchet'] <= daily_storage[i] / max_storage_capacity, 'lb2' )\n", " m.addConstr( irc[i,1] * max_daily_injection.loc[2,'ratchet'] >= daily_storage[i] / max_storage_capacity, 'ub2' )\n", " \n", " \n", " m.addConstr( daily_injection[i+1] <= max_daily_injection.loc[0, 'mdiq'], f'daily_injection {i+1}' )\n", " m.addConstr( daily_draw[i+1] <= max_daily_withdrawal.loc[ 0, 'mdwq'], f'daily draw {i+1}' )\n", "\n", "# ensure that storage on last day is empty\n", "m.addConstr( daily_storage[M-1] == 0, 'storage on last day is empty' )" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Gurobi Optimizer version 9.1.1 build v9.1.1rc0 (linux64)\n", "Thread count: 2 physical cores, 4 logical processors, using up to 4 threads\n", "Optimize a model with 50 rows, 26 columns and 163 nonzeros\n", "Model fingerprint: 0x2ec9b89b\n", "Variable types: 0 continuous, 26 integer (20 binary)\n", "Coefficient statistics:\n", " Matrix range [5e-02, 1e+04]\n", " Objective range [3e+04, 3e+04]\n", " Bounds range [1e+00, 1e+00]\n", " RHS range [1e+00, 1e+05]\n", "Found heuristic solution: objective -0.0000000\n", "Presolve removed 50 rows and 26 columns\n", "Presolve time: 0.00s\n", "Presolve: All rows and columns removed\n", "\n", "Explored 0 nodes (0 simplex iterations) in 0.06 seconds\n", "Thread count was 1 (of 4 available processors)\n", "\n", "Solution count 1: -0 \n", "No other solutions better than -0\n", "\n", "Optimal solution found (tolerance 1.00e-04)\n", "Best objective -0.000000000000e+00, best bound -0.000000000000e+00, gap 0.0000%\n" ] } ], "source": [ "m.optimize()" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ]" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m.getVars()" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "dfres = pd.DataFrame( [ x.getValue() for x in daily_storage ], columns=['daily_storage'] )" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "dfres.plot()" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "write() takes exactly 2 positional arguments (1 given)", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrite\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32msrc/gurobipy/model.pxi\u001b[0m in \u001b[0;36mgurobipy.Model.write\u001b[0;34m()\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: write() takes exactly 2 positional arguments (1 given)" ] } ], "source": [ "m.write()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.8.6" } }, "nbformat": 4, "nbformat_minor": 4 }