This is the repo for SET3055 Energy Market Simulation game at TU Delft.
This repo contains script to aid in playing the SET3055 Energy Market Simulation game at TU Delft. This script has been designed for Matlab; certain functions may not work on Octave.
Game link: (http://emg.tudelft.nl)
The Electricity Market Game (EMG) simulates an energy market. As the website says, “In the game, several players work together in a power company. Five such companies compete with each other to make the most money by generating and selling electricity. Each round (which represents a year), the companies produce electricity, sell it to a power exchange and decide whether to build new power plants and/or to dismantle old ones. The players need to contend with uncertainties regarding the growth rate of demand, fuel prices, the availability of wind and energy policy changes. Given these real-life circumstances, they experience the difficulties of timing investment decisions and choosing between different types of generation technology in a dynamic environment.”
To aid in calculations and decision making, this script tries to predict the results of next round based on known data. Once the database has been created, curve fitting techniques are used to predict the power plants’ efficiency, operation-and-maintenance (onm) costs, and loan amount (reliability can also be predicted, but hasn’t been incorporated). Using these predictions, a profile of all power plants in the region is created and the plants are assigned to the respective teams. Functions are available to calculate variable costs of all the plants of a team, and also to plot a merit-order sorted supply function of the region (considering only marginal costs) vs. anticipated demand.
Before forecasts can be made, the region needs to be setup. The examples presented below can be found in the file ‘demo.m’. This involves the following steps:
east = region;
ERLYJ = team;
AcDcTraders = team;
, where ERLYJ and AcDcTraders are teams. Note that the names should be exactly same as those in the CSV file, else database creation will fail.pm1 = price_predict;
price_predict is a misnomer though since it also predicts efficiency.r8 = fuel
. This is the variable which stores all fuel prices.r8.fuel_update(85.73, 0.27, 1047.18, 21, 0, 21);
Please refer to the function for more details.east.create_database('east_plants.csv',pm1);
Marginal costs for each team can be viewed using team.get_costs(r8);
, for team ERLYJ: ERLYJ.get_costs(r8)
will print the fuel, carbon, and total marginal costs. It will print ‘NA’ if the plant is unavailable for the round.
The script is capable of generating a supply function of an entire region with the following assumptions:
east.predict_demand(r8, 15242, 0.2);
will generate the supply function (merit-order sorted) vs demand function. Note that the numbers are only indicative, refer to function description for more details (can be found in the region.m file).