Updated Thesis and linear baseline
This commit is contained in:
@@ -1,31 +0,0 @@
|
||||
\relax
|
||||
\providecommand\babel@aux[2]{}
|
||||
\@nameuse{bbl@beforestart}
|
||||
\abx@aux@refcontext{nyt/global//global/global}
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
|
||||
\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
|
||||
\global\let\oldnewlabel\newlabel
|
||||
\gdef\newlabel#1#2{\newlabelxx{#1}#2}
|
||||
\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
|
||||
\AtEndDocument{\ifx\hyper@anchor\@undefined
|
||||
\let\newlabel\oldnewlabel
|
||||
\fi}
|
||||
\fi}
|
||||
\global\let\hyper@last\relax
|
||||
\gdef\HyperFirstAtBeginDocument#1{#1}
|
||||
\providecommand\HyField@AuxAddToFields[1]{}
|
||||
\providecommand\HyField@AuxAddToCoFields[2]{}
|
||||
\babel@aux{english}{}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {1}Intermediate Results}{1}{section.1}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Previous day as forecast}{1}{subsection.1.1}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}All Zeros}{1}{subsection.1.2}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {1.3}Linear Model}{1}{subsection.1.3}\protected@file@percent }
|
||||
\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces Results of the linear model with different ranges of training data}}{2}{table.1}\protected@file@percent }
|
||||
\newlabel{tab:linear_model}{{1}{2}{Results of the linear model with different ranges of training data}{table.1}{}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {2}Schedule next months}{3}{section.2}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Other input features}{3}{subsection.2.1}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}More complex models}{3}{subsection.2.2}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Reinforcement learning}{3}{subsection.2.3}\protected@file@percent }
|
||||
\abx@aux@read@bbl@mdfivesum{nobblfile}
|
||||
\gdef \@abspage@last{4}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,8 +0,0 @@
|
||||
\BOOKMARK [1][-]{section.1}{\376\377\000I\000n\000t\000e\000r\000m\000e\000d\000i\000a\000t\000e\000\040\000R\000e\000s\000u\000l\000t\000s}{}% 1
|
||||
\BOOKMARK [2][-]{subsection.1.1}{\376\377\000P\000r\000e\000v\000i\000o\000u\000s\000\040\000d\000a\000y\000\040\000a\000s\000\040\000f\000o\000r\000e\000c\000a\000s\000t}{section.1}% 2
|
||||
\BOOKMARK [2][-]{subsection.1.2}{\376\377\000A\000l\000l\000\040\000Z\000e\000r\000o\000s}{section.1}% 3
|
||||
\BOOKMARK [2][-]{subsection.1.3}{\376\377\000L\000i\000n\000e\000a\000r\000\040\000M\000o\000d\000e\000l}{section.1}% 4
|
||||
\BOOKMARK [1][-]{section.2}{\376\377\000S\000c\000h\000e\000d\000u\000l\000e\000\040\000n\000e\000x\000t\000\040\000m\000o\000n\000t\000h\000s}{}% 5
|
||||
\BOOKMARK [2][-]{subsection.2.1}{\376\377\000O\000t\000h\000e\000r\000\040\000i\000n\000p\000u\000t\000\040\000f\000e\000a\000t\000u\000r\000e\000s}{section.2}% 6
|
||||
\BOOKMARK [2][-]{subsection.2.2}{\376\377\000M\000o\000r\000e\000\040\000c\000o\000m\000p\000l\000e\000x\000\040\000m\000o\000d\000e\000l\000s}{section.2}% 7
|
||||
\BOOKMARK [2][-]{subsection.2.3}{\376\377\000R\000e\000i\000n\000f\000o\000r\000c\000e\000m\000e\000n\000t\000\040\000l\000e\000a\000r\000n\000i\000n\000g}{section.2}% 8
|
||||
Binary file not shown.
@@ -41,7 +41,7 @@
|
||||
>
|
||||
]>
|
||||
<requests version="1.0">
|
||||
<internal package="biblatex" priority="9" active="0">
|
||||
<internal package="biblatex" priority="9" active="1">
|
||||
<generic>latex</generic>
|
||||
<provides type="dynamic">
|
||||
<file>verslag.bcf</file>
|
||||
@@ -64,7 +64,7 @@
|
||||
<file>english-apa.lbx</file>
|
||||
</requires>
|
||||
</internal>
|
||||
<external package="biblatex" priority="5" active="0">
|
||||
<external package="biblatex" priority="5" active="1">
|
||||
<generic>biber</generic>
|
||||
<cmdline>
|
||||
<binary>biber</binary>
|
||||
|
||||
Binary file not shown.
BIN
Reports/Thesis/images/diffusion/0*a6FugiEl0J6768W8.png
Normal file
BIN
Reports/Thesis/images/diffusion/0*a6FugiEl0J6768W8.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 388 KiB |
BIN
Reports/Thesis/images/diffusion/diffusion_graphical_model.png
Normal file
BIN
Reports/Thesis/images/diffusion/diffusion_graphical_model.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 214 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 51 KiB |
BIN
Reports/Thesis/images/quantile_regression/crps_visualization.png
Normal file
BIN
Reports/Thesis/images/quantile_regression/crps_visualization.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
BIN
Reports/Thesis/images/quantile_regression/reconstructed_cdf.png
Normal file
BIN
Reports/Thesis/images/quantile_regression/reconstructed_cdf.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
163
Reports/Thesis/sections/background.aux
Normal file
163
Reports/Thesis/sections/background.aux
Normal file
@@ -0,0 +1,163 @@
|
||||
\relax
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {2}Background}{2}{section.2}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Electricity market}{2}{subsection.2.1}\protected@file@percent }
|
||||
\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces Overview of the most important parties in the electricity market}}{2}{table.1}\protected@file@percent }
|
||||
\newlabel{tab:parties}{{1}{2}{Overview of the most important parties in the electricity market}{table.1}{}}
|
||||
\@writefile{lot}{\contentsline {table}{\numberline {2}{\ignorespaces Prices paid by the BRPs}}{4}{table.2}\protected@file@percent }
|
||||
\newlabel{tab:imbalance_price}{{2}{4}{Prices paid by the BRPs}{table.2}{}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Generative modeling}{4}{subsection.2.2}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Diffusion models}{5}{subsection.2.3}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.1}Overview}{5}{subsubsection.2.3.1}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.2}Applications}{6}{subsubsection.2.3.2}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.3}Generation process}{6}{subsubsection.2.3.3}\protected@file@percent }
|
||||
\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Diffusion process}}{7}{figure.1}\protected@file@percent }
|
||||
\newlabel{fig:diffusion_process}{{1}{7}{Diffusion process}{figure.1}{}}
|
||||
\@setckpt{sections/background}{
|
||||
\setcounter{page}{8}
|
||||
\setcounter{equation}{0}
|
||||
\setcounter{enumi}{0}
|
||||
\setcounter{enumii}{0}
|
||||
\setcounter{enumiii}{0}
|
||||
\setcounter{enumiv}{0}
|
||||
\setcounter{footnote}{0}
|
||||
\setcounter{mpfootnote}{0}
|
||||
\setcounter{part}{0}
|
||||
\setcounter{section}{2}
|
||||
\setcounter{subsection}{3}
|
||||
\setcounter{subsubsection}{3}
|
||||
\setcounter{paragraph}{0}
|
||||
\setcounter{subparagraph}{0}
|
||||
\setcounter{figure}{1}
|
||||
\setcounter{table}{2}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{float@type}{4}
|
||||
\setcounter{tabx@nest}{0}
|
||||
\setcounter{listtotal}{0}
|
||||
\setcounter{listcount}{0}
|
||||
\setcounter{liststart}{0}
|
||||
\setcounter{liststop}{0}
|
||||
\setcounter{citecount}{0}
|
||||
\setcounter{citetotal}{0}
|
||||
\setcounter{multicitecount}{0}
|
||||
\setcounter{multicitetotal}{0}
|
||||
\setcounter{instcount}{0}
|
||||
\setcounter{maxnames}{2}
|
||||
\setcounter{minnames}{1}
|
||||
\setcounter{maxitems}{999}
|
||||
\setcounter{minitems}{1}
|
||||
\setcounter{citecounter}{0}
|
||||
\setcounter{maxcitecounter}{0}
|
||||
\setcounter{savedcitecounter}{0}
|
||||
\setcounter{uniquelist}{0}
|
||||
\setcounter{uniquename}{0}
|
||||
\setcounter{refsection}{0}
|
||||
\setcounter{refsegment}{0}
|
||||
\setcounter{maxextratitle}{0}
|
||||
\setcounter{maxextratitleyear}{0}
|
||||
\setcounter{maxextraname}{0}
|
||||
\setcounter{maxextradate}{0}
|
||||
\setcounter{maxextraalpha}{0}
|
||||
\setcounter{abbrvpenalty}{50}
|
||||
\setcounter{highnamepenalty}{50}
|
||||
\setcounter{lownamepenalty}{25}
|
||||
\setcounter{maxparens}{3}
|
||||
\setcounter{parenlevel}{0}
|
||||
\setcounter{blx@maxsection}{0}
|
||||
\setcounter{mincomprange}{10}
|
||||
\setcounter{maxcomprange}{100000}
|
||||
\setcounter{mincompwidth}{1}
|
||||
\setcounter{afterword}{0}
|
||||
\setcounter{savedafterword}{0}
|
||||
\setcounter{annotator}{0}
|
||||
\setcounter{savedannotator}{0}
|
||||
\setcounter{author}{0}
|
||||
\setcounter{savedauthor}{0}
|
||||
\setcounter{bookauthor}{0}
|
||||
\setcounter{savedbookauthor}{0}
|
||||
\setcounter{commentator}{0}
|
||||
\setcounter{savedcommentator}{0}
|
||||
\setcounter{editor}{0}
|
||||
\setcounter{savededitor}{0}
|
||||
\setcounter{editora}{0}
|
||||
\setcounter{savededitora}{0}
|
||||
\setcounter{editorb}{0}
|
||||
\setcounter{savededitorb}{0}
|
||||
\setcounter{editorc}{0}
|
||||
\setcounter{savededitorc}{0}
|
||||
\setcounter{foreword}{0}
|
||||
\setcounter{savedforeword}{0}
|
||||
\setcounter{holder}{0}
|
||||
\setcounter{savedholder}{0}
|
||||
\setcounter{introduction}{0}
|
||||
\setcounter{savedintroduction}{0}
|
||||
\setcounter{namea}{0}
|
||||
\setcounter{savednamea}{0}
|
||||
\setcounter{nameb}{0}
|
||||
\setcounter{savednameb}{0}
|
||||
\setcounter{namec}{0}
|
||||
\setcounter{savednamec}{0}
|
||||
\setcounter{translator}{0}
|
||||
\setcounter{savedtranslator}{0}
|
||||
\setcounter{shortauthor}{0}
|
||||
\setcounter{savedshortauthor}{0}
|
||||
\setcounter{shorteditor}{0}
|
||||
\setcounter{savedshorteditor}{0}
|
||||
\setcounter{narrator}{0}
|
||||
\setcounter{savednarrator}{0}
|
||||
\setcounter{execproducer}{0}
|
||||
\setcounter{savedexecproducer}{0}
|
||||
\setcounter{execdirector}{0}
|
||||
\setcounter{savedexecdirector}{0}
|
||||
\setcounter{with}{0}
|
||||
\setcounter{savedwith}{0}
|
||||
\setcounter{labelname}{0}
|
||||
\setcounter{savedlabelname}{0}
|
||||
\setcounter{institution}{0}
|
||||
\setcounter{savedinstitution}{0}
|
||||
\setcounter{lista}{0}
|
||||
\setcounter{savedlista}{0}
|
||||
\setcounter{listb}{0}
|
||||
\setcounter{savedlistb}{0}
|
||||
\setcounter{listc}{0}
|
||||
\setcounter{savedlistc}{0}
|
||||
\setcounter{listd}{0}
|
||||
\setcounter{savedlistd}{0}
|
||||
\setcounter{liste}{0}
|
||||
\setcounter{savedliste}{0}
|
||||
\setcounter{listf}{0}
|
||||
\setcounter{savedlistf}{0}
|
||||
\setcounter{location}{0}
|
||||
\setcounter{savedlocation}{0}
|
||||
\setcounter{organization}{0}
|
||||
\setcounter{savedorganization}{0}
|
||||
\setcounter{origlocation}{0}
|
||||
\setcounter{savedoriglocation}{0}
|
||||
\setcounter{origpublisher}{0}
|
||||
\setcounter{savedorigpublisher}{0}
|
||||
\setcounter{publisher}{0}
|
||||
\setcounter{savedpublisher}{0}
|
||||
\setcounter{language}{0}
|
||||
\setcounter{savedlanguage}{0}
|
||||
\setcounter{origlanguage}{0}
|
||||
\setcounter{savedoriglanguage}{0}
|
||||
\setcounter{citation}{0}
|
||||
\setcounter{savedcitation}{0}
|
||||
\setcounter{pageref}{0}
|
||||
\setcounter{savedpageref}{0}
|
||||
\setcounter{textcitecount}{0}
|
||||
\setcounter{textcitetotal}{0}
|
||||
\setcounter{textcitemaxnames}{0}
|
||||
\setcounter{biburlbigbreakpenalty}{100}
|
||||
\setcounter{biburlbreakpenalty}{200}
|
||||
\setcounter{biburlnumpenalty}{0}
|
||||
\setcounter{biburlucpenalty}{0}
|
||||
\setcounter{biburllcpenalty}{0}
|
||||
\setcounter{smartand}{1}
|
||||
\setcounter{bbx:relatedcount}{0}
|
||||
\setcounter{bbx:relatedtotal}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{Item}{0}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{bookmark@seq@number}{8}
|
||||
}
|
||||
149
Reports/Thesis/sections/background.tex
Normal file
149
Reports/Thesis/sections/background.tex
Normal file
@@ -0,0 +1,149 @@
|
||||
\section{Background}
|
||||
% Achtergrond informatie
|
||||
% Generatief modelleren
|
||||
% -> enkel forecast is vaak brak -> reinforcement learning is lastig -> generatief modelleren, veel generaties om mee te trainen
|
||||
% - Achtergrond electrititetismarkt
|
||||
% - Achtergrond Generatief modelleren (van NRV)
|
||||
\subsection{Electricity market}
|
||||
The electricity market consists of many different parties who all work together and want to make a profit in the end. An overview of the most important parties can be found in Table \ref{tab:parties}.
|
||||
|
||||
% table
|
||||
\begin{table}[h]
|
||||
\centering
|
||||
\begin{tabularx}{\textwidth}{|C|C|}
|
||||
\hline
|
||||
\textbf{Party} & \textbf{Description} \\
|
||||
\hline
|
||||
Producers & Generates electricty. The electricity can be generated using coal, nuclear energy, wind parks etc. \\
|
||||
\hline
|
||||
Consumers & Uses electricity. This can be normal households, companies but also industry. \\
|
||||
\hline
|
||||
Transmission system operator (TSO) & Party responsible for reliable transmission of electricity from generation plants to local distribution networks. This is done over the high-voltage grid. In Belgium, this party is Elia.\\
|
||||
\hline
|
||||
Distribution system operator (DSO) & Party responsible for the distribution of electricity to the end users. Here, the electricity is transported over the low-voltage grid. \\
|
||||
\hline
|
||||
Balancing responsible party (BRP) & These parties forecast the electricity consumption and generation of their clients. They make balanced nominations to Elia.
|
||||
\\
|
||||
\hline
|
||||
Balancing Service Provider (BSP) & Parties that provide the TSO (Elia) with balancing services. They submit Balancing Energy Bids to Elia. If needed, they will provide balancing energy at a set price. \\
|
||||
\hline
|
||||
\end{tabularx}
|
||||
\caption{Overview of the most important parties in the electricity market}
|
||||
\label{tab:parties}
|
||||
\end{table}
|
||||
|
||||
Elia, the Transmission system operator (TSO) in Belgium is responsible for keeping the grid stable. They do this by balancing the electricity consumption and generation. If there is an imbalance, Elia will use reserves to balance the grid. These reserves are expensive and are paid by the market participants. The prices paid for the activations of these reserves is called the imbalance price. Keeping the grid balanced is a very important but also a very difficult task. If the grid is not balanced, it can lead to blackouts but also other problems like damage to equipment and so on.
|
||||
\\\\
|
||||
Balance responsible parties (BRPs) forecast the electricity consumption and generation of their portfolio to effectively manage the balance between supply and demand within the grid they operate in. They submit a daily balance schedule for their portfolio the day before to the transmission system operator. This consists of the expected physical injections and offtakes from the grid and the commercial power trades. The power trades can be purchases and sales between BRPs or they can even be trades with other countries. BRPs must provide and deploy all reasonable resources to be balanced on a quarter-hourly basis. They can exchange electricity with other BRPs for the following day or the same day. There is one exception where a BRP can deviate from the balance schedule. This is when the grid is not balanced and they can help Elia to stabilize the grid. In this case, they will receive a compensation for their help. When a BRP deviates from the balance schedule in a way that destabilizes the grid, it will need to pay the imbalance price for the deviation.
|
||||
\\\\
|
||||
The imbalance price is determined based on which reserves Elia needs to activate to stabilize the grid. The imbalance of a BRP is the quarter-hourly difference between total injections and offtakes from the grid. The Net Regulation Volume (NRV) is the net control volume of energy that Elia applies to maintain balance in the Elia control area. The Area Control Error is the current difference between the scheduled values and the actual values of power exchanged in the Belgian control area. The imbalance of the system (SI) is the Area Control Error minus the NRV. Using the System Imbalance, the imbalance price is calculated.
|
||||
\\\\
|
||||
Elia, the Transmission System Operator (TSO) in Belgium, maintains grid stability by activating three types of reserves, each designed to address specific conditions of imbalance. These reserves are crucial for ensuring that the electricity supply continuously meets the demand, thereby maintaining the frequency within the required operational limits. The reserves include:
|
||||
|
||||
1) \textbf{Frequency Containment Reserve (FCR)} \\
|
||||
FCR is a reserve that responds automatically to frequency deviations in the grid. The reserve responds automatically in seconds and provides a proportional response to the frequency deviation. Elia must provide a minimal share of this volume within the Belgian control area. This type of volume can also be offered by the BSPs.
|
||||
\\\\
|
||||
2) \textbf{Automatic Frequency Restoration Process (aFRR)} \\
|
||||
aFRR is the second reserve that Elia can activate to restore the frequency to 50Hz. The aFRR is activated when the FCR is not sufficient to restore the frequency. Every 4 seconds, Elia sends a set-point to the BSPs. The BSPs use this set-point to adjust their production or consumption. The BSPs have a 7.5-minute window to activate the full requested energy volume.
|
||||
\\\\
|
||||
3) \textbf{Manual Frequency Restoration (mFRR)} \\
|
||||
Sometimes the FCR and aFRR are not enough to restore the imbalance between generation and consumption. Elia activates the mFRR manually and the requested energy volume is to be activated in 15 minutes.
|
||||
|
||||
The order in which the reserves are activated is as follows: FCR, aFRR and mFRR. BSPs provide bids for the aFRR and mFRR volumes. The provided bids consist of the type (aFRR or mFRR), bid volume (MW), bid price (per MWh) and start price (per MWh).
|
||||
The start price is used to cover the costs of starting a unit.
|
||||
\\\\
|
||||
Elia selects the bids based on the order of activation and then the price. The highest marginal price paid for upward or downward activation determines the imbalance price. This means that the last bid that is activated determines the imbalance price. This price is paid by the BRPs that are not balanced. The imbalance price calculation is shown in Table \ref{tab:imbalance_price}.
|
||||
|
||||
\begin{table}[h]
|
||||
\centering
|
||||
\begin{tabular}{|c|c|c|}
|
||||
\hline
|
||||
& \multicolumn{2}{c|}{\textbf{System Imbalance}} \\
|
||||
\cline{2-3}
|
||||
\textbf{Imbalance of the balance responsible party} & \textbf{Positive} & \textbf{Negative or zero} \\
|
||||
\hline
|
||||
\textbf{Positive} & MDP - \(\alpha\) & MIP + \(\alpha\) \\
|
||||
\hline
|
||||
\textbf{Negative} & MDP - \(\alpha\) & MIP + \(\alpha\) \\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\caption{Prices paid by the BRPs}
|
||||
\label{tab:imbalance_price}
|
||||
\end{table}
|
||||
|
||||
The imbalance price calculation includes the following variables: \\
|
||||
- MDP: Marginal price of downward activation \\
|
||||
- MIP: Marginal price of upward activation \\
|
||||
- \(\alpha\): Extra parameter dependent on System Imbalance \\
|
||||
\\
|
||||
|
||||
TODO: Add more information about the imbalance price calculation, alpha?
|
||||
|
||||
The imbalance price can be reconstructed given the bids of a certain quarter/day and the System Imbalance. During this thesis, the system imbalance is assumed to be almost the same as the Net Regulation Volume. This is a simplification but it is a good approximation. The goal of this thesis is to model the Net Regulation Volume which can then be used to reconstruct the imbalance price and to make decisions on when to buy or sell electricity.
|
||||
|
||||
\subsection{Generative modeling}
|
||||
Simple forecasting of the NRV is often not accurate and defining a policy using this forecast will lead to wrong decisions. A better method would be to try to model the NRV and sample multiple generations of the NRV. This should give better predictions and confidence intervals can be calculated from these.
|
||||
\\\\
|
||||
Generative modeling is a type of machine learning that is used to generate new data samples that look like the training data. The goal of generative modeling is to learn the true data distribution and use this distribution to generate new samples. Generative modeling is used in many different fields including image generation, text generation etc.
|
||||
\\\\
|
||||
In this thesis, generative modeling can be used to model the NRV of the Belgian electricity market using different conditional input features like the weather, the load forecast etc. The model can then be used to generate new samples of the NRV.
|
||||
\\\\
|
||||
There exist many different types of generative models. Some of the most popular ones are:
|
||||
\begin{itemize}
|
||||
\item Generative Adversarial Networks (GANs)
|
||||
\item Variational Autoencoders (VAEs)
|
||||
\item Normalizing Flows
|
||||
\item Diffusion models
|
||||
\end{itemize}
|
||||
|
||||
In this thesis, autoregressive models will be used to model the NRV. Autoregressive models are models that predict the next value in a sequence based on the previous values. The model can be trained to predict the next value in the NRV sequence based on the previous values of the NRV, the weather, the load forecast etc. Using this method, the model will always generate the same sequence of values given the same input features. Instead of using the autoregressive model to predict the next value in the sequence, the model can also be trained to predict the distribution of the next value. This way, the model can generate multiple generations of the NRV given the same input features. For example, Quantile Regression can be used to predict the distribution of the next value in the sequence.
|
||||
\\\\
|
||||
In this thesis, the utilization of diffusion models is also explored. Diffusion models are a type of generative model that can be used to generate new data samples that follow the distribution of the input data set. Using a structured training process, diffusion models learn to reverse a diffusion process. Starting from a random noise distribution, the model learns to transform the noise into a sample from the data distribution using multiple denoising steps.
|
||||
|
||||
\subsection{Diffusion models}
|
||||
TODO: reference the paper
|
||||
The "Denoising Diffusion Probabilistic Models" (DDPM)
|
||||
\subsubsection{Overview}
|
||||
Diffusion models are a type of probabilistic model designed to generate high-quality, diverse samples from complex data distributions. The way this type of model is trained is unique. The model is trained to reverse an iterative noise process that is applied to the data. This process is called the diffusion process. The model denoises the data in each iteration. During the training, the model learns to reverse the diffusion process. A training sample is transformed into a noise sample by applying the diffusion process. The model is then trained to recover the original sample from the noise sample. The model is trained to maximize the likelihood of the data given the noise. By doing this, the model learns to generate samples from the data distribution. Starting from the noise, the model can generate samples that look like the data. The model can also be conditioned on additional information to generate samples that follow other distributions.
|
||||
|
||||
\subsubsection{Applications}
|
||||
Diffusion models gained popularity in the field of computer vision. They are used for inpainting, super-resolution, image generation, image editing etc. The paper introducing "Denoising Diffusion Probabilistic Models" (DDPM) showed that diffusion models can achieve state-of-the-art results in image generation. This type of model was then applied to other fields like text generation, audio generation etc. The most popular application of diffusion models is still image generation. Many different models and products exist that make use of diffusion models to generate images. Some examples are DALL·E, Stable Diffusion, Midjourney, etc. These models can generate or edit images based on a given text description.
|
||||
\\\\
|
||||
This method can also be applied to other fields like audio generation, text generation etc. In this thesis, diffusion models are explored to model time series data conditioned on additional information.
|
||||
|
||||
\subsubsection{Generation process}
|
||||
The generation process is quite different in comparison to other models. For example, GANs and VAE generate samples by sampling from a noise distribution and then transforming the noise into a sample that looks like the training data in one step using a generator network. Diffusion models generate samples by starting from a noise distribution and then applying a series of denoising steps to the noise. The diffusion process consists of 3 main components: the forward process, the reverse process and the sampling process.
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{Forward process} \\
|
||||
During this process, Gaussian noise is added to the data in each of the T time steps according to a variance schedule $\beta_1, ..., \beta_T$. \\\\
|
||||
$q(\mathbf{x}_{1:T}|\mathbf{x}_0) \coloneqq \prod_{t=1}^{T} q(\mathbf{x}_t|\mathbf{x}_{t-1}) \quad$ with $\quad q(\mathbf{x}_t|\mathbf{x}_{t-1}) \coloneqq \mathcal{N}(\mathbf{x}_t; \sqrt{1-\beta_t}\mathbf{x}_{t-1}, \beta_t\mathbf{I})$
|
||||
\\\\
|
||||
This formula shows that the noisy data distribution after T diffusion steps is the product of the transition probabilities at each step t. The noise added in each time step is a Gaussian distribution with mean $\sqrt{1-\beta_t}\mathbf{x}_{t-1}$ and variance $\beta_t\mathbf{I}$. The variance schedule $\beta_1, ..., \beta_T$ is a hyperparameter that needs to be chosen or optimized during training.
|
||||
|
||||
\item \textbf{Reverse process} \\
|
||||
The diffusion process must then be reversed. The model is trained to model the noise distribution given the data and timestep. \\\\
|
||||
$p_{\theta}(\mathbf{x}_{0:T}) \coloneqq p(\mathbf{x}_T) \prod_{t=1}^{T} p_{\theta}(\mathbf{x}_{t-1}|\mathbf{x}_t) \quad$ with $\quad p_{\theta}(\mathbf{x}_{t-1}|\mathbf{x}_t) \coloneqq \mathcal{N}(\mathbf{x}_{t-1}; \mu_{\theta}(\mathbf{x}_t, t), \Sigma_{\theta}(\mathbf{x}_t, t))$
|
||||
\\\\
|
||||
In the reverse process, each step aims to undo the diffusion by estimating what the previous, less noisy state might have been. This is done using a series of conditional Gaussian distributions $p_{\theta}(\mathbf{x}_{t-1}|\mathbf{x}_t)$. For each of these Gaussians, a neural network with parameters $\theta$ is used to estimate the mean $\mu_{\theta}(\mathbf{x}_t, t)$ and the covariance $\Sigma_{\theta}(\mathbf{x}_t, t)$ of the distribution. The joint distribution $p_{\theta}(\mathbf{x}_{0:T})$ is then the product the marginal distribution of the last timestep $p(\mathbf{x}_T)$ and the conditional distributions $p_{\theta}(\mathbf{x}_{t-1}|\mathbf{x}_t)$ for each timestep.
|
||||
|
||||
\item \textbf{Training} \\
|
||||
The model training is done by optimizing the variational bound of the negative log-likelihood. This is also called the evidence lower bound (ELBO) in the context of generative models. \\\\
|
||||
TODO: add formula and explain?
|
||||
|
||||
\item \textbf{Conditioning} \\
|
||||
The model can be conditioned on additional information. This can be used to guide the generation process. In the context of image generation, this can be used to generate images of a certain class or with certain attributes. This requires some changes in the model architecture and training process.
|
||||
TODO: add more information about conditioning
|
||||
\end{itemize}
|
||||
|
||||
The diffusion process can be seen in Figure \ref{fig:diffusion_process}. The model is trained to reverse this process. Starting from the noise, the model learns to generate samples that look like the data.
|
||||
|
||||
\begin{figure}[h]
|
||||
\centering
|
||||
\includegraphics[width=0.8\textwidth]{images/diffusion/diffusion_graphical_model.png}
|
||||
TODO: fix citation
|
||||
\caption[Diffusion process]{Diffusion process (adapted from \cite{ho2020denoising}).}
|
||||
\label{fig:diffusion_process}
|
||||
\end{figure}
|
||||
|
||||
|
||||
10
Reports/Thesis/sections/introduction.tex
Normal file
10
Reports/Thesis/sections/introduction.tex
Normal file
@@ -0,0 +1,10 @@
|
||||
\section{Introduction}
|
||||
The electricity market is a complex system influenced by numerous factors. The rise of renewable energy sources adds to this complexity, introducing greater volatility compared to traditional energy sources. Renewables, with their unpredictable nature, exacerbate the challenge of maintaining a stable balance between supply and demand. This critical balance is managed by the transmission system operator, Elia, which utilizes reserves to mitigate any potential shortages or surpluses, directly influencing electricity prices.
|
||||
|
||||
(TODO: Market participants met flexible assets (Groot genoeg), zij willen grote winst maken. Elia moet minder eigen reserves gebruiken -> goedkoper voor iedereen)
|
||||
|
||||
Forecasting the imbalance price is vital for market participants engaged in buying or selling electricity. It enables them to make informed decisions on the optimal times to buy or sell, aiming to maximize their profits. However, current industry practices often rely on simplistic policies, such as adhering to a fixed price for transactions. This approach is not optimal and overlooks the potential benefits of adaptive policies that consider the forecasted imbalance prices.
|
||||
|
||||
The goal of this thesis is to generatively model the Belgian electricity market. This allows to reconstruct the imbalance price for a given day which can then be used by other simple policies to make decisions on when to buy or sell electricity. These policies can then be compared to the current industry practices to assess their performance.
|
||||
|
||||
Forecasting the system imbalance will become increasingly important as the share of renewable energy sources continues to grow.
|
||||
169
Reports/Thesis/sections/nrv_prediction.tex
Normal file
169
Reports/Thesis/sections/nrv_prediction.tex
Normal file
@@ -0,0 +1,169 @@
|
||||
\section{NRV Prediction}
|
||||
As discussed in the background information, the imbalance prices are based on the Net Regulation Volume (NRV). This means that the imbalance prices can be reconstructed from the sampled NRV. Multiple baselines and models will be compared that forecast and model the NRV using different metrics. The data utilized in this thesis is provided by Elia. Elia makes a lot of data public and provides them in quarterly hour or minute intervals. The data used in this thesis is on a quarterly hourly basis. This makes the number of input features and output features way more manageable and makes the training more computationally efficient. A full-day sample of the NRV exists of 96 values. One value for every quarter. Further research could be done using smaller data intervals to see if this improves the models.
|
||||
|
||||
\subsection{Data}
|
||||
Elia offers a lot of different data on their website (TODO: open data citation). They provide data for the following categories:
|
||||
(TODO: Relevant? or too much information?)
|
||||
\begin{itemize}
|
||||
\item Balancing
|
||||
\item Transmission
|
||||
\item Power generations
|
||||
\item Congestion management
|
||||
\item Load
|
||||
\item Studies
|
||||
\end{itemize}
|
||||
|
||||
The data useful to model the NRV is scattered over multiple categories. The data used in this thesis is the following:
|
||||
|
||||
TODO: ask Jonas: add urls to the correct data? via citation?
|
||||
\begin{itemize}
|
||||
\item \textbf{Imbalance prices per quarter-hour (Historical data) } \\
|
||||
% https://opendata.elia.be/explore/dataset/ods047/information/?sort=datetime
|
||||
This dataset contains the NRV and system imbalance in a quarter-hour interval. The data is available from 01-01-2015 to the present day. The NRV is used as the target variable that needs to be modeled but can also be used as input features. The next day NRV modeling can be conditioned on the real NRV of the previous day.
|
||||
|
||||
\item \textbf{Measured and forecasted total load on the Belgian grid (Historical data)} \\
|
||||
% https://opendata.elia.be/explore/dataset/ods001/table/?sort=datetime
|
||||
Elia publishes what the total load on the Belgian grid is. This data is also provided in a quarter-hour interval. This data consists of the real load for a certain quarter but also the different forecasted loads. There are day-ahead and week-ahead forecasts available. The total load on the Belgian grid can be used as input features for the NRV modeling. The data is also available from 01-01-2015 to the present day.
|
||||
|
||||
\item \textbf{Photovoltaic power production estimation and forecast on Belgian grid (Historical)} \\
|
||||
% https://opendata.elia.be/explore/dataset/ods032/table/?sort=datetime
|
||||
The photovoltanic power production is also available in a quarter-hour interval. The production is also forecasted day-ahead and week-ahead. The data is provided for each of the provinces in Belgium. Forecasts are also available for the 3 Belgian regions (Flanders, Wallonia, Brussels) and the total Belgian production. The photovoltanic data has been provided since 01-04-2018 and is available to the present day.
|
||||
|
||||
\item \textbf{Wind power production estimation and forecast on Belgian grid (Historical)} \\
|
||||
% https://opendata.elia.be/explore/dataset/ods031/information/
|
||||
Just as the photovoltanic power production data, wind power production is available in a quarterly-hour interval for each of the provinces and regions in Belgium. This data also includes the real production and the forecasts. An additional column is available that shows if the power is generated offshore or onshore. During this thesis, the offshore and onshore data will be combined. The wind power production data has been provided since 01-01-2015 and is available to the present day.
|
||||
|
||||
\item \textbf{Day-ahead implicit net position (Belgium's balance)} \\
|
||||
% https://opendata.elia.be/explore/dataset/ods022/information/?sort=datetime
|
||||
The day-ahead implicit net position shows the total amount of electricity that will be imported or exported to neighboring countries. The trades are done on the day-ahead market and are thus known in advance. This data is available in a quarter-hour interval and has been provided since 01-11-2020 and is available to the present day. The data before 01-11-2020 is also available but only in hourly intervals.
|
||||
\end{itemize}
|
||||
|
||||
A lot of data is available but only the most relevant data needs to be used. Experiments will be done to identify which data and features improve the NRV modeling. The data will be split into a training and test set. The training dataset starts depending on which data features are used but ends on 31-12-2022. The test set starts on 01-01-2023 and ends on (TODO: check the end date). This makes sure enough data is available to train the models and the test set is large enough to evaluate the models. The year 2023 is chosen as the test set because it is the most recent data available when the thesis experiments were conducted. Using data from 2022 in the test set also does not make a lot of sense because the trained models would be used to predict the future. Data from 2022 is not relevant anymore to evaluate the models.
|
||||
|
||||
\subsection{Quantile Regression}
|
||||
Forecasting the NRV is very difficult and most of the time not accurate. It is a very volatile time series and is hard to predict. Instead of just forecasting the NRV, a generative model can be trained and used to sample multiple full NRV samples for the next day. Sampling multiple times can give a better understanding of the uncertainty of the NRV. To be able to sample multiple times, a distribution of the NRV is needed. Only one value for the NRV for each quarter is available in the training and test data. There is no information on the distribution of this value.
|
||||
\\\\
|
||||
Quantile regression can be used to model the distribution of the NRV. This is a technique that estimates the conditional quantiles of the target variable. A quantile is a statistical value of a random variable below which a certain proportion of observations fall. Figure \ref{fig:quantile_example} shows the cumulative distribution function of a normal distribution. The figure shows the 25th, 50th and 75th quantiles. The 25th quantile is the value below which 25\% of the observations fall. In the example, this value is -0.67. The other quantiles work in the same way.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.8\textwidth]{images/quantile_regression/cdf_quantiles_example.png}
|
||||
\caption{Example of quantiles}
|
||||
\label{fig:quantile_example}
|
||||
\end{figure}
|
||||
|
||||
Instead of training the model to output the NRV forecast, the model is trained to output the values for different quantiles. The amount and which quantiles can be chosen. Experiments are done to identify what quantiles are the most useful. Using the outputted quantiles, the cumulative distribution function can be reconstructed and used to sample the NRV value for the quarter to predict. An example of the output of a quantile regression model is shown in figure \ref{fig:quantile_regression_example}. The values of the different quantiles are plotted and these are interpolated to get the cumulative distribution function.
|
||||
|
||||
TODO: figure goes under 0, maybe use other values or other interpolation?
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.8\textwidth]{images/quantile_regression/reconstructed_cdf.png}
|
||||
\caption{Example of quantile regression output for one-quarter of the NRV, showing interpolated values for quantiles at 1\%, 5\%, 10\%, 15\%, 30\%, 40\%, 50\%, 60\%, 70\%, 85\%, 90\%, 95\%, and 99\%. These quantiles are used to reconstruct the cumulative distribution function.}
|
||||
\label{fig:quantile_regression_example}
|
||||
\end{figure}
|
||||
|
||||
|
||||
TODO: reduce the use of the world NRV and cumulative distribution function
|
||||
The NRV value for a quarter can be sampled from the reconstructed cumulative distribution function. A full-day prediction for the NRV exists of 96 values. The cumulative distribution function which is sampled is only used for a certain quarter.
|
||||
\\\\
|
||||
TODO: Explain non autoregressive and autoregressive models\\\\
|
||||
Two methods exist to sample full-day NRV values. The first method is a non-autoregressive model. This model outputs the quantiles for every quarter. For each quarter, the cumulative distribution function is reconstructed and sampled. The model is conditioned on the NRV timeline of the previous day. This consists of 96 values. The second method is an autoregressive model. This model outputs the quantiles for the next quarter for which the NRV distribution is wanted. This model is conditioned on the 96 previous NRV values. When a full-day sample of the NRV is wanted, the model is used recursively. The model predicts the quantiles for the next quarter, the cumulative distribution function is reconstructed and the NRV value is sampled. This value can then be used as input for the next quarter. This process is repeated until a full-day sample is obtained.
|
||||
\\\\
|
||||
\subsubsection{Training}
|
||||
The quantile regression model is trained using the pinball loss function, also known as the quantile loss. The model outputs the quantile values for the NRV. The quantile values themselves are not available in the training data. Only the real NRV values are known. The loss function is defined as:
|
||||
\begin{equation}
|
||||
L_\tau(y, \hat{y}) = \begin{cases}
|
||||
\tau(y - \hat{y}) & \text{if } y \geq \hat{y} \\
|
||||
(1 - \tau)(\hat{y} - y) & \text{if } y < \hat{y}
|
||||
\end{cases}
|
||||
\end{equation}
|
||||
\begin{align*}
|
||||
\textbf{Where:} \\
|
||||
\tau & = \text{Quantile of interest} \\
|
||||
y & = \text{Actual observed value of NRV} \\
|
||||
\hat{y} & = \text{Predicted quantile value of NRV} \\
|
||||
\end{align*}
|
||||
The loss function works by penalizing underestimation and overestimation differently. When a quantile is predicted that is lower than or equal to the actual value, the loss is calculated as the difference between the actual value and the predicted quantile value multiplied by the quantile of interest. This means that underestimations for high quantiles are penalized higher than for lower quantiles.
|
||||
\\\\
|
||||
When the quantile value prediction is higher than the real NRV value, the loss is calculated as the difference between the predicted quantile value and the real NRV multiplied by $(1-\tau)$. This means that overestimations are penalized less for high quantiles of interest.
|
||||
|
||||
\begin{equation}
|
||||
L = \frac{1}{N} \sum_{i=1}^{N} \sum_{\tau \in T} L_\tau(y_i, \hat{y}_i)
|
||||
\end{equation}
|
||||
|
||||
\begin{align*}
|
||||
\textbf{Where:} \\
|
||||
N & = \text{Number of samples} \\
|
||||
T & = \text{Quantiles of interest} \\
|
||||
y_i & = \text{Actual observed value of NRV for sample i} \\
|
||||
\hat{y}_i & = \text{Predicted quantile value of NRV for sample i} \\
|
||||
\end{align*}
|
||||
|
||||
To calculate the pinball loss, the mean over the quantiles of interest and samples need to be taken. This gives a scalar loss value which can be used to do backpropagation. The lower this value, the better the NRV distribution is modeled.
|
||||
|
||||
\subsubsection{Evaluation}
|
||||
To evaluate the performance of the quantile regression models, multiple metrics can be used. The pinball loss itself can be used to compare models on the test set. Other metrics that can be used are the mean absolute error (MAE) and the mean squared error (MSE). This can be done by generating multiple full-day NRV samples for each day of the test set and calculating the error metrics for each of the samples. The mean can then be taken over the different samples to get a single value for the error metrics.
|
||||
\\\\
|
||||
MAE does not consider the direction of the error. It is the average of the absolute differences between the predicted and actual values. The formula in our case with full-day NRV samples is:
|
||||
\begin{equation}
|
||||
MAE = \frac{1}{N} \sum_{i=1}^{N} \frac{1}{96} \sum_{j=1}^{96} |y_{ij} - \hat{y}_{ij}|
|
||||
\end{equation}
|
||||
|
||||
\begin{align*}
|
||||
\textbf{Where:} \\
|
||||
N & = \text{Number of samples} \\
|
||||
y_{ij} & = \text{Actual observed value of NRV for sample i and quarter j} \\
|
||||
\hat{y}_{ij} & = \text{Sampled value of NRV for sample i and quarter j} \\
|
||||
\end{align*}
|
||||
|
||||
MSE is more sensitive to outliers than MAE because it squares the error between the predicted and actual values. The formula in our case with full-day NRV samples is:
|
||||
\begin{equation}
|
||||
MSE = \frac{1}{N} \sum_{i=1}^{N} \frac{1}{96} \sum_{j=1}^{96} (y_{ij} - \hat{y}_{ij})^2
|
||||
\end{equation}
|
||||
|
||||
The MAE and MSE metrics do not compare the distribution of the NRV to the real NRV value but only take into account the sampled values. Evaluating the outputted distribution for the NRV must be done differently. The Continuous Ranked Probability Score (CRPS) can be used to evaluate the distribution to the real NRV value. The CRPS metric is used to evaluate the accuracy of the predicted cumulative distribution function. The CRPS can be seen as a generalization of the MAE for probabilistic forecasts. The formula for the CRPS is:
|
||||
|
||||
\begin{equation}
|
||||
CRPS(F, x) = \int_{-\infty}^{\infty} (F(y) - \mathbbm{1}(y - x))^2 \, dy
|
||||
\end{equation}
|
||||
|
||||
\begin{align*}
|
||||
\textbf{Where:} \\
|
||||
F & = \text{Predicted cumulative distribution function} \\
|
||||
x & = \text{Real NRV value} \\
|
||||
\mathbbm{1}(x) & = \text{Heavyside function} = \begin{cases}
|
||||
1 & \text{if } x \geq 0 \\
|
||||
0 & \text{if } x < 0
|
||||
\end{cases} \\
|
||||
\end{align*}
|
||||
|
||||
The mean CRPS can be calculated over the different days to get a single value. The lower this value, the better the NRV is modeled. The CRPS metric can be visualized as shown in figure \ref{fig:crps_visualization}. The CRPS is the area between the predicted cumulative distribution function and the Heavyside function. The lower the area between the curves, the better the NRV is modeled.
|
||||
|
||||
TODO: improve visualisation?
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=0.8\textwidth]{images/quantile_regression/crps_visualization.png}
|
||||
\caption{Visualization of the CRPS metric}
|
||||
\label{fig:crps_visualization}
|
||||
\end{figure}
|
||||
|
||||
\subsubsection{Models}
|
||||
A linear quantile regression model is used as a baseline. This model is very simple and can be used to compare the more complex models. Starting with a simple autoregressive model, the model is conditioned on the 96 previous NRV values. The model outputs the quantiles for the next quarter. The model is trained using the pinball loss function and the MAE, MSE, CRPS metrics are calculated on the test set. The linear model for the quantile regression is defined as:
|
||||
|
||||
TODO: better equation for linear quantile regression model
|
||||
\begin{equation}
|
||||
Q_{\tau}(Y | \mathbf{X}) = \beta_{0,\tau} + \beta_{1,\tau}x_1 + \beta_{2,\tau}x_2 + \ldots + \beta_{n,\tau}x_n
|
||||
\end{equation}
|
||||
|
||||
where:
|
||||
\begin{itemize}
|
||||
\item \( Q_{\tau}(y | \mathbf{x}) \) is the \( \tau \)-th quantile of the conditional distribution of the NRV
|
||||
\item \( \mathbf{X} \) is the input features (e.g. the 96 previous NRV values)
|
||||
\item \(\beta_{0,\tau}, \beta_{1,\tau}, \beta_{2,\tau}, \ldots, \beta_{n,\tau} \) are the coefficients
|
||||
\end{itemize}
|
||||
|
||||
The linear model outputs the values for the chosen quantiles. The total amount of parameters depends on the input features and the number of chosen quantiles. Assuming the input features are the 96 previous NRV values and 13 quantiles are chosen, the total amount of parameters is 96 * 13 = 1248.
|
||||
|
||||
TODO: add results for this model
|
||||
|
||||
More input features can be used as well.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,31 +0,0 @@
|
||||
\relax
|
||||
\providecommand\babel@aux[2]{}
|
||||
\@nameuse{bbl@beforestart}
|
||||
\abx@aux@refcontext{nyt/global//global/global}
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
|
||||
\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
|
||||
\global\let\oldnewlabel\newlabel
|
||||
\gdef\newlabel#1#2{\newlabelxx{#1}#2}
|
||||
\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
|
||||
\AtEndDocument{\ifx\hyper@anchor\@undefined
|
||||
\let\newlabel\oldnewlabel
|
||||
\fi}
|
||||
\fi}
|
||||
\global\let\hyper@last\relax
|
||||
\gdef\HyperFirstAtBeginDocument#1{#1}
|
||||
\providecommand\HyField@AuxAddToFields[1]{}
|
||||
\providecommand\HyField@AuxAddToCoFields[2]{}
|
||||
\babel@aux{english}{}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}{section.1}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {2}Background}{1}{section.2}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Electricity market}{1}{subsection.2.1}\protected@file@percent }
|
||||
\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces Overview of the most important parties in the electricity market}}{2}{table.1}\protected@file@percent }
|
||||
\newlabel{tab:parties}{{1}{2}{Overview of the most important parties in the electricity market}{table.1}{}}
|
||||
\@writefile{lot}{\contentsline {table}{\numberline {2}{\ignorespaces Prices paid by the BRPs}}{3}{table.2}\protected@file@percent }
|
||||
\newlabel{tab:imbalance_price}{{2}{3}{Prices paid by the BRPs}{table.2}{}}
|
||||
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Generative modeling}{4}{subsection.2.2}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3}Literature Study}{4}{section.3}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {4}Modellen + resultaten}{4}{section.4}\protected@file@percent }
|
||||
\abx@aux@read@bbl@mdfivesum{nobblfile}
|
||||
\gdef \@abspage@last{5}
|
||||
0
Reports/Thesis/verslag.bbl
Normal file
0
Reports/Thesis/verslag.bbl
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,6 +0,0 @@
|
||||
\BOOKMARK [1][-]{section.1}{\376\377\000I\000n\000t\000r\000o\000d\000u\000c\000t\000i\000o\000n}{}% 1
|
||||
\BOOKMARK [1][-]{section.2}{\376\377\000B\000a\000c\000k\000g\000r\000o\000u\000n\000d}{}% 2
|
||||
\BOOKMARK [2][-]{subsection.2.1}{\376\377\000E\000l\000e\000c\000t\000r\000i\000c\000i\000t\000y\000\040\000m\000a\000r\000k\000e\000t}{section.2}% 3
|
||||
\BOOKMARK [2][-]{subsection.2.2}{\376\377\000G\000e\000n\000e\000r\000a\000t\000i\000v\000e\000\040\000m\000o\000d\000e\000l\000i\000n\000g}{section.2}% 4
|
||||
\BOOKMARK [1][-]{section.3}{\376\377\000L\000i\000t\000e\000r\000a\000t\000u\000r\000e\000\040\000S\000t\000u\000d\000y}{}% 5
|
||||
\BOOKMARK [1][-]{section.4}{\376\377\000M\000o\000d\000e\000l\000l\000e\000n\000\040\000+\000\040\000r\000e\000s\000u\000l\000t\000a\000t\000e\000n}{}% 6
|
||||
Binary file not shown.
@@ -41,7 +41,7 @@
|
||||
>
|
||||
]>
|
||||
<requests version="1.0">
|
||||
<internal package="biblatex" priority="9" active="0">
|
||||
<internal package="biblatex" priority="9" active="1">
|
||||
<generic>latex</generic>
|
||||
<provides type="dynamic">
|
||||
<file>verslag.bcf</file>
|
||||
@@ -64,7 +64,7 @@
|
||||
<file>english-apa.lbx</file>
|
||||
</requires>
|
||||
</internal>
|
||||
<external package="biblatex" priority="5" active="0">
|
||||
<external package="biblatex" priority="5" active="1">
|
||||
<generic>biber</generic>
|
||||
<cmdline>
|
||||
<binary>biber</binary>
|
||||
|
||||
Binary file not shown.
@@ -18,7 +18,10 @@
|
||||
\usepackage{tabularx}
|
||||
\usepackage{array}
|
||||
\usepackage{amsmath}
|
||||
\usepackage{mathtools}
|
||||
\usepackage{multirow}
|
||||
\usepackage{float}
|
||||
\usepackage{bbm}
|
||||
|
||||
\newcolumntype{C}{>{\centering\arraybackslash}X}
|
||||
|
||||
@@ -58,9 +61,6 @@
|
||||
% Input for title page
|
||||
%----------------------
|
||||
|
||||
% The title
|
||||
\thesubtitle{February Intermediate Report}
|
||||
|
||||
%% Note: a stricter UGent style could be achieved with, e.g.:
|
||||
\usepackage{ulem} % for colored underline
|
||||
\renewcommand{\ULthickness}{2pt} % adjust thickness of underline
|
||||
@@ -133,126 +133,23 @@
|
||||
|
||||
% \vspace{1cm}
|
||||
% {\large Mentor: dr. ir. Femke De Backere\par}
|
||||
% {\large TechWolf supervisor: ir. Jens-Joris Decorte}
|
||||
|
||||
% \end{titlepage}
|
||||
|
||||
\newpage
|
||||
|
||||
\section{Introduction}
|
||||
The electricity market is a complex system influenced by numerous factors. The rise of renewable energy sources adds to this complexity, introducing greater volatility compared to traditional energy sources. Renewables, with their unpredictable nature, exacerbate the challenge of maintaining a stable balance between supply and demand. This critical balance is managed by the transmission system operator, Elia, which utilizes reserves to mitigate any potential shortages or surpluses, directly influencing electricity prices.
|
||||
|
||||
(TODO: Market participants met flexible assets (Groot genoeg), zij willen grote winst maken. Elia moet minder eigen reserves gebruiken -> goedkoper voor iedereen)
|
||||
|
||||
Forecasting the imbalance price is vital for market participants engaged in buying or selling electricity. It enables them to make informed decisions on the optimal times to buy or sell, aiming to maximize their profits. However, current industry practices often rely on simplistic policies, such as adhering to a fixed price for transactions. This approach is not optimal and overlooks the potential benefits of adaptive policies that consider the forecasted imbalance prices.
|
||||
|
||||
The goal of this thesis is to generatively model the Belgian electricity market. This allows to reconstruct the imbalance price for a given day which can then be used by other simple policies to make decisions on when to buy or sell electricity. These policies can then be compared to the current industry practices to assess their performance.
|
||||
|
||||
Forecasting the system imbalance will become increasingly important as the share of renewable energy sources continues to grow.
|
||||
|
||||
\section{Background}
|
||||
% Achtergrond informatie
|
||||
% Generatief modelleren
|
||||
% -> enkel forecast is vaak brak -> reinforcement learning is lastig -> generatief modelleren, veel generaties om mee te trainen
|
||||
% - Achtergrond electrititetismarkt
|
||||
% - Achtergrond Generatief modelleren (van NRV)
|
||||
\subsection{Electricity market}
|
||||
The electricity market consists of many different parties who all work together and want to make a profit in the end. An overview of the most important parties can be found in Table \ref{tab:parties}.
|
||||
|
||||
% table
|
||||
\begin{table}[h]
|
||||
\centering
|
||||
\begin{tabularx}{\textwidth}{|C|C|}
|
||||
\hline
|
||||
\textbf{Party} & \textbf{Description} \\
|
||||
\hline
|
||||
Producers & Generates electricty. The electricity can be generated using coal, nuclear energy, wind parks etc. \\
|
||||
\hline
|
||||
Consumers & Uses electricity. This can be normal households, companies but also industry. \\
|
||||
\hline
|
||||
Transmission system operator (TSO) & Party responsible for reliable transmission of electricity from generation plants to local distribution networks. This is done over the high-voltage grid. In Belgium, this party is Elia.\\
|
||||
\hline
|
||||
Distribution system operator (DSO) & Party responsible for the distribution of electricity to the end users. Here, the electricity is transported over the low-voltage grid. \\
|
||||
\hline
|
||||
Balancing responsible party (BRP) & These parties forecast the electricity consumption and generation of their clients. They make balanced nominations to Elia.
|
||||
\\
|
||||
\hline
|
||||
Balancing Service Provider (BSP) & Parties that provide the TSO (Elia) with balancing services. They submit Balancing Energy Bids to Elia. If needed, they will provide balancing energy at a set price. \\
|
||||
\hline
|
||||
\end{tabularx}
|
||||
\caption{Overview of the most important parties in the electricity market}
|
||||
\label{tab:parties}
|
||||
\end{table}
|
||||
|
||||
Elia, the Transmission system operator (TSO) in Belgium is responsible for keeping the grid stable. They do this by balancing the electricity consumption and generation. If there is an imbalance, Elia will use reserves to balance the grid. These reserves are expensive and are paid by the market participants. The price of these reserves is called the imbalance price. Keeping the grid balanced is a very important but also a very difficult task. If the grid is not balanced, it can lead to blackouts but also other problems like damage to equipment.
|
||||
\\\\
|
||||
Balance responsible parties (BRPs) forecast the electricity consumption and generation of their portfolio to effectively manage the balance between supply and demand within the grid they operate in. They submit a daily balance schedule for their portfolio the day before. This consists of the expected physical injections and offtakes from the grid and the commercial power trades. The power trades can be purchases and sales between BRPs or they can even be trades with other countries. BRPs must provide and deploy all reasonable resources to be balanced on a quarter-hourly basis. They can exchange electricity with other BRPs for the following day or the same day. There is one exception where a BRP can deviate from the balance schedule. This is when the grid is not balanced and they can help Elia to stabilize the grid. In this case, they will receive a compensation for their help. When a BRP deviates from the balance schedule in a way that destabilizes the grid, it will need to pay the imbalance price for the deviation.
|
||||
\\\\
|
||||
The imbalance price is determined based on which reserves Elia needs to activate to stabilize the grid. The imbalance of a BRP is the quarter-hourly difference between total injections and offtakes from the grid. The Net Regulation Volume (NRV) is the net control volume of energy that Elia applies to maintain balance in the Elia control area. The Area Control Error is the current difference between the scheduled values and the actual values of power exchanged in the Belgian control area. The imbalance of the system (SI) is the Area Control Error minus the NRV. Using the System Imbalance, the imbalance price is calculated.
|
||||
\\\\
|
||||
Elia, the Transmission System Operator (TSO) in Belgium, maintains grid stability by activating three types of reserves, each designed to address specific conditions of imbalance. These reserves are crucial for ensuring that the electricity supply continuously meets the demand, thereby maintaining the frequency within the required operational limits. The reserves include:
|
||||
|
||||
1) \textbf{Frequency Containment Reserve (FCR)} \\
|
||||
FCR is a reserve that responds automatically to frequency deviations in the grid. The reserve responds automatically in seconds and provides a proportional response to the frequency deviation. Elia must provide a minimal share of this volume within the Belgian control area. This type of volume can also be offered by the BSPs.
|
||||
\\\\
|
||||
2) \textbf{Automatic Frequency Restoration Process (aFRR)} \\
|
||||
aFRR is the second reserve that Elia can activate to restore the frequency to 50Hz. The aFRR is activated when the FCR is not sufficient to restore the frequency. Every 4 seconds, Elia sends a set-point to the BSPs. The BSPs use this set-point to adjust their production or consumption. The BSPs have a 7.5-minute window to activate the full requested energy volume.
|
||||
\\\\
|
||||
3) \textbf{Manual Frequency Restoration (mFRR)} \\
|
||||
Sometimes the FCR and aFRR are not enough to restore the imbalance between generation and consumption. Elia activates the mFRR manually and the requested energy volume is to be activated in 15 minutes.
|
||||
|
||||
The order in which the reserves are activated is as follows: FCR, aFRR and mFRR. BSPs provide bids for the aFRR and mFRR volumes. The provided bids consist of the type (aFRR or mFRR), bid volume (MW), bid price (per MWh) and start price (per MWh).
|
||||
The start price is used to cover the costs of starting a unit.
|
||||
\\\\
|
||||
Elia selects the bids based on the order of activation and then the price. The highest marginal price paid for upward or downward activation determines the imbalance price. This means that the last bid that is activated determines the imbalance price. This price is paid by the BRPs that are not balanced. The imbalance price calculation is shown in Table \ref{tab:imbalance_price}.
|
||||
|
||||
\begin{table}[h]
|
||||
\centering
|
||||
\begin{tabular}{|c|c|c|}
|
||||
\hline
|
||||
& \multicolumn{2}{c|}{\textbf{System Imbalance}} \\
|
||||
\cline{2-3}
|
||||
\textbf{Imbalance of the balance responsible party} & \textbf{Positive} & \textbf{Negative or zero} \\
|
||||
\hline
|
||||
\textbf{Positive} & MDP - \(\alpha\) & MIP + \(\alpha\) \\
|
||||
\hline
|
||||
\textbf{Negative} & MDP - \(\alpha\) & MIP + \(\alpha\) \\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\caption{Prices paid by the BRPs}
|
||||
\label{tab:imbalance_price}
|
||||
\end{table}
|
||||
|
||||
The imbalance price calculation includes the following variables: \\
|
||||
- MDP: Marginal price of downward activation \\
|
||||
- MIP: Marginal price of upward activation \\
|
||||
- \(\alpha\): Extra parameter dependent on System Imbalance \\
|
||||
\\
|
||||
% TODO: Add more information about the imbalance price calculation, alpha?
|
||||
TODO: Add more information about the imbalance price calculation, alpha?
|
||||
|
||||
The imbalance price can be reconstructed given the bids of a certain quarter/day and the System Imbalance. During this thesis, the system imbalance is assumed to be almost the same as the Net Regulation Volume. This is a simplification but it is a good approximation. The goal of this thesis is to model the Net Regulation Volume which can then be used to reconstruct the imbalance price and to make decisions on when to buy or sell electricity.
|
||||
|
||||
\subsection{Generative modeling}
|
||||
Simple forecasting of the NRV is often not accurate and defining a policy using this forecast will lead to wrong decisions. A better method would be to try to model the NRV and sample multiple generations of the NRV. This gives a better prediction and confidence intervals can be calculated from this.
|
||||
\\\\
|
||||
Generative modeling is a type of machine learning that is used to generate new data samples. The goal of generative modeling is to learn the true data distribution of the training data. From this learned distribution, new samples can be generated. Generative modeling is used in many different fields including image generation, text generation etc.
|
||||
\\\\
|
||||
TODO: Formulas of generative modeling
|
||||
\\\\
|
||||
In this thesis, generative modeling can be used to model the NRV of the Belgian electricity market using different input features like the weather, the electricity price etc. The model can then be used to generate new samples of the NRV.
|
||||
\\\\
|
||||
Multiple methods can be used to generatively model the NRV.
|
||||
|
||||
|
||||
|
||||
\include{sections/introduction}
|
||||
|
||||
\include{sections/background}
|
||||
|
||||
\section{Literature Study}
|
||||
- Literatuur forecasting imbalance price
|
||||
- Literatuur policies adhv forecasts
|
||||
|
||||
\section{Modellen + resultaten}
|
||||
\section{TODO: Better title for this section}
|
||||
This thesis can be divided into two main parts. The first part focuses on modeling the Net Regulation Volume (NRV) of the Belgian electricity market for the next day. This modeling is conditioned on multiple inputs that can be obtained from Elia (TODO: add citation to the open data of Elia). The second part of the thesis focuses on optimizing a simple policy using the NRV generations for the next day. The policy tries to maximize profit by charging and discharging a battery and thereby buying and selling electricity on the market. Multiple models are trained and tested to model the NRV and compared to each other based on their profit optimization.
|
||||
|
||||
\input{sections/nrv_prediction}
|
||||
|
||||
|
||||
\end{document}
|
||||
|
||||
@@ -216,4 +216,32 @@ Baseline -> thresholds bepalen training data, penalty aanpassen na evaluatie op
|
||||
|
||||
# profit evaluation done day by day. Start with fresh battery. Maybe electritiy bought but not sold -> negative profits? What to do with this?
|
||||
2 solutions: - work further with the state of charge of the battery
|
||||
- don't count the electricity bought but not sold in the profit calculation
|
||||
- don't count the electricity bought but not sold in the profit calculation
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Global baseline:
|
||||
uitleggen
|
||||
|
||||
-> penalty bepalen aan de hand van de test set
|
||||
|
||||
# Perfect baseline:
|
||||
uitleggen + niet absoluut maximum, normaal integer linear programming nodig
|
||||
|
||||
Simple linear model
|
||||
|
||||
# forecast inputs
|
||||
|
||||
|
||||
Plotten van thresholds over de test set (baseline, GRU, diffusion)
|
||||
Plotten van state of charge
|
||||
|
||||
State of charge waarde van batterij wordt niet meegenomen in threshold bepaling, enkel de verkochte elektriciteit. -> simpele policy maar zelfde policy voor baselines en complexere modellen
|
||||
|
||||
|
||||
# Finer thresholds for the models
|
||||
@@ -1,3 +1,21 @@
|
||||
| Experiment | Model Type | Input Parameters | Profit | Charge Cycles |
|
||||
|------------|------------|------------------|--------|----------------|
|
||||
| [Link](https://clearml.victormylle.be/projects/2e46d4af6f1e4c399cf9f5aa30bc8795/experiments/432396923e354d579494048656228c32/info-output/metrics/scalar) | Diffusion Model |
|
||||
# Results
|
||||
## Global Baseline
|
||||
2 static thresholds determined to buy and sell electricity
|
||||
|
||||
| Tuned on | Charge Threshold | Discharge Threshold | Profit | Charge Cycles (target 283) |
|
||||
|----------|------------------|---------------------|--------|---------------|
|
||||
| Training data | 100 | 200 | 266294.15 | 492.0 |
|
||||
| Test data | 200 | 250 | 143004.34 | 287.125 |
|
||||
|
||||
## Yesterday NRV Baseline
|
||||
Thresholds are determiend on the reconstructed prices using the NRV of yesterday.
|
||||
|
||||
| Penalty | Profit | Charge Cycles (target 283) |
|
||||
|---|---|---|
|
||||
| 807.25 | 200771.44 | 282.5 |
|
||||
|
||||
## Trained models
|
||||
| Model | Experiment | Profit | Charge Cycles (target 283) |
|
||||
|---|---|---|---|
|
||||
| Diffusion Model | [Link](https://clearml.victormylle.be/projects/2e46d4af6f1e4c399cf9f5aa30bc8795/experiments/8487afb705bf47b78f3f013c19394da7/info-output/metrics/scalar?columns=selected&columns=type&columns=name&columns=tags&columns=status&columns=project.name&columns=users&columns=started&columns=last_update&columns=last_iteration&columns=m.290612199861c31d1036b185b4e69b75.0fa0d9b8ebcf2a3d9c95c22cd6e72912.value.Summary.OptimalProfit&columns=m.290612199861c31d1036b185b4e69b75.6d53291d99dd32fc27ecee29939046ec.value.Summary.OptimalChargeCycles&columns=m.0fa0d9b8ebcf2a3d9c95c22cd6e72912.098f6bcd4621d373cade4e832627b4f6.max_value.Optimal%20Profit.test&columns=m.1a899a19b54957e02a21c3a1d82577ad.0970ca62a85af2722008c5220e9d8a9e.value.Summary%2Ftest_CRPSLoss.lastreported&columns=m.293da6b015ca6a65992dcf7a53fa0237.098f6bcd4621d373cade4e832627b4f6.min_value.PinballLoss.test&order=-started&filter=) | 219848.9 | 283.06 |
|
||||
|
|
||||
File diff suppressed because one or more lines are too long
179
src/notebooks/thesis-visualizations.ipynb
Normal file
179
src/notebooks/thesis-visualizations.ipynb
Normal file
File diff suppressed because one or more lines are too long
@@ -2,7 +2,7 @@ from src.utils.clearml import ClearMLHelper
|
||||
|
||||
#### ClearML ####
|
||||
clearml_helper = ClearMLHelper(project_name="Thesis/NrvForecast")
|
||||
task = clearml_helper.get_task(task_name="AQR: Non Linear")
|
||||
task = clearml_helper.get_task(task_name="AQR: Linear Baseline")
|
||||
task.execute_remotely(queue_name="default", exit_process=True)
|
||||
|
||||
from src.policies.PolicyEvaluator import PolicyEvaluator
|
||||
@@ -27,21 +27,21 @@ from src.models.time_embedding_layer import TimeEmbedding
|
||||
data_config = DataConfig()
|
||||
|
||||
data_config.NRV_HISTORY = True
|
||||
data_config.LOAD_HISTORY = True
|
||||
data_config.LOAD_FORECAST = True
|
||||
data_config.LOAD_HISTORY = False
|
||||
data_config.LOAD_FORECAST = False
|
||||
|
||||
data_config.WIND_FORECAST = True
|
||||
data_config.WIND_HISTORY = True
|
||||
data_config.WIND_FORECAST = False
|
||||
data_config.WIND_HISTORY = False
|
||||
|
||||
data_config.QUARTER = True
|
||||
data_config.DAY_OF_WEEK = True
|
||||
data_config.QUARTER = False
|
||||
data_config.DAY_OF_WEEK = False
|
||||
|
||||
data_config.NOMINAL_NET_POSITION = True
|
||||
data_config.NOMINAL_NET_POSITION = False
|
||||
|
||||
|
||||
data_config = task.connect(data_config, name="data_features")
|
||||
|
||||
data_processor = DataProcessor(data_config, path="", lstm=False)
|
||||
data_processor = DataProcessor(data_config, path="", lstm=True)
|
||||
data_processor.set_batch_size(512)
|
||||
data_processor.set_full_day_skip(False)
|
||||
|
||||
@@ -64,17 +64,18 @@ else:
|
||||
|
||||
model_parameters = {
|
||||
"learning_rate": 0.0001,
|
||||
"hidden_size": 512,
|
||||
"num_layers": 5,
|
||||
"hidden_size": 256,
|
||||
"num_layers": 2,
|
||||
"dropout": 0.2,
|
||||
"time_feature_embedding": 8,
|
||||
}
|
||||
|
||||
model_parameters = task.connect(model_parameters, name="model_parameters")
|
||||
|
||||
time_embedding = TimeEmbedding(
|
||||
data_processor.get_time_feature_size(), model_parameters["time_feature_embedding"]
|
||||
)
|
||||
# time_embedding = TimeEmbedding(
|
||||
# data_processor.get_time_feature_size(), model_parameters["time_feature_embedding"]
|
||||
# )
|
||||
|
||||
# lstm_model = GRUModel(
|
||||
# time_embedding.output_dim(inputDim),
|
||||
# len(quantiles),
|
||||
@@ -83,17 +84,19 @@ time_embedding = TimeEmbedding(
|
||||
# dropout=model_parameters["dropout"],
|
||||
# )
|
||||
|
||||
non_linear_model = NonLinearRegression(
|
||||
time_embedding.output_dim(inputDim),
|
||||
len(quantiles),
|
||||
hiddenSize=model_parameters["hidden_size"],
|
||||
numLayers=model_parameters["num_layers"],
|
||||
dropout=model_parameters["dropout"],
|
||||
)
|
||||
# non_linear_model = NonLinearRegression(
|
||||
# time_embedding.output_dim(inputDim),
|
||||
# len(quantiles),
|
||||
# hiddenSize=model_parameters["hidden_size"],
|
||||
# numLayers=model_parameters["num_layers"],
|
||||
# dropout=model_parameters["dropout"],
|
||||
# )
|
||||
|
||||
# linear_model = LinearRegression(time_embedding.output_dim(inputDim), len(quantiles))
|
||||
linear_model = LinearRegression(inputDim, len(quantiles))
|
||||
|
||||
model = nn.Sequential(time_embedding, non_linear_model)
|
||||
# model = nn.Sequential(time_embedding, lstm_model)
|
||||
model = linear_model
|
||||
model.output_size = 1
|
||||
optimizer = torch.optim.Adam(model.parameters(), lr=model_parameters["learning_rate"])
|
||||
|
||||
@@ -117,8 +120,8 @@ trainer = AutoRegressiveQuantileTrainer(
|
||||
trainer.add_metrics_to_track(
|
||||
[PinballLoss(quantiles), MSELoss(), L1Loss(), CRPSLoss(quantiles)]
|
||||
)
|
||||
trainer.early_stopping(patience=10)
|
||||
trainer.plot_every(5)
|
||||
trainer.early_stopping(patience=5)
|
||||
trainer.plot_every(2)
|
||||
trainer.train(task=task, epochs=epochs, remotely=True)
|
||||
|
||||
### Policy Evaluation ###
|
||||
@@ -137,7 +140,7 @@ optimal_penalty, profit, charge_cycles = (
|
||||
test_loader=test_loader,
|
||||
initial_penalty=1000,
|
||||
target_charge_cycles=283,
|
||||
learning_rate=15,
|
||||
initial_learning_rate=3,
|
||||
max_iterations=150,
|
||||
tolerance=1,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user