8.2. Adding an agent

In this section, we will add a new agent called A2. This agent will be slightly different to the other agents in the default example, in that it will make investments based upon a mixture of levelised cost of electricity (LCOE) and equivalent annual cost (EAC). These two objectives will be combined by calculating a weighted sum of the two when comparing potential investment options. We will give the LCOE a relative weight value of 1 and the EAC a relative weight value of 0.25.

We will continue to use the files from the previous tutorial where we added solarPV and created a new scenario. The full, finished case study can be seen here

To achieve this, first, we must modify the Agents.csv file in the directory:

{PATH_TO_MODEL}/technodata/Agents.csv

To do this, we will add two new rows to the file. To simplify the process, we copy the data from the first two rows of agent A1, changing only the rows: AgentShare Name, Objective1, Objective2, ObjData1, ObjData2, DecisionMethod and Quantity. The values we changed can be seen below. Notice how we edit the AgentShare column. This variable allows us to split the existing capacity between the two different agents. We will also need to edit the technodata file to define these new AgentShares.

Also notice that we amend the Quantity column. The reason for this is that we want to specify that Agent A1 makes up 50% of the population, and A2 makes up the remaining 50% of the population.

Again, we only show some of the rows due to space constraints, however see here for the full file.

AgentShare

Name

RegionName

Objective1

Objective2

Objective3

ObjData1

ObjData2

DecisionMethod

Quantity

Type

Agent1

A1

R1

LCOE

1

singleObj

0.5

New

Agent2

A1

R1

LCOE

1

singleObj

0.5

Retrofit

Agent3

A2

R1

LCOE

EAC

0.5

0.5

weighted_sum

0.5

New

Agent4

A2

R1

LCOE

EAC

0.5

0.5

weighted_sum

0.5

Retrofit

We then edit all of the technodata files to split the existing capacity between the two agents by the proportions we like. As we now have two agents which take up 50% of the population each, we will split the existing capacity by 50% for each of the agents. Notice that we only require the columns Agent2 and Agent4 to define the retrofit agents.

The new technodata file for the power sector will look like the following:

ProcessName

RegionName

Time

Level

cap_par

cap_exp

Fuel

EndUse

Agent2

Agent4

Unit

Year

MUS$2010/PJ_a

Retrofit

Retrofit

gasCCGT

R1

2020

fixed

23.78234399

1

gas

electricity

0.5

0.5

windturbine

R1

2020

fixed

36.30771182

1

wind

electricity

0.5

0.5

solarPV

R1

2020

fixed

30

1

solar

electricity

0.5

0.5

However, remember you will have to make the same changes for the residential and gas sectors!

We will now save this file and run the new simulation model using the following command in Anaconda prompt:

python -m muse settings.toml

Again, we use seaborn and pandas to analyse the data in the Results folder.

[1]:
import pandas as pd
import seaborn as sns
[2]:
mca_capacity = pd.read_csv(
    "../tutorial-code/2-add-agent/1-multiple-objective/Results/MCACapacity.csv"
)
power_sector = mca_capacity[mca_capacity.sector == "power"]
power_sector.head()
[2]:
Unnamed: 0 agent capacity dst_region index installed region sector technology type year
2 0 A1 1.000 R1 0 2020 R1 power gasCCGT retrofit 2020
8 2 A1 1.312 R1 0 2020 R1 power gasCCGT retrofit 2025
9 23 A1 10.000 R1 26 2020 R1 power solarPV retrofit 2025
10 36 A1 10.000 R1 52 2020 R1 power windturbine retrofit 2025
14 0 A1 0.312 R1 0 2020 R1 power gasCCGT retrofit 2030

This time we can see that there is data for the new agent, A2. Next, we will visualise the investments made by each of the agents using seaborn’s facetgrid command.

[3]:
power_sector = power_sector.groupby(["agent", "technology", "year"]).sum().reset_index()
g = sns.FacetGrid(power_sector, row="agent")
g.map(sns.lineplot, "year", "capacity", "technology")
g.add_legend()
[3]:
<seaborn.axisgrid.FacetGrid at 0x7f7417bf01c0>
../_images/user-guide_add-agent_8_1.png

In this scenario we can see two divergent strategies. Agent A2 invests heavily in windturbine, gasCCGT and solarPV early on. Whereas Agent A1 invests a small amount in windturbine and gasCCGT.

From this small scenario, the difference between investment strategies between agents is evident. This is one of the key benefits of agent-based models when compared to optimisation based models.

Next, we will see what occurs if the agents invest based upon the same investment strategy, with both investing using LCOE. The full finished files can be seen here. This requires us to edit the Agents.csv file once more, to look like the following:

AgentShare

Name

RegionName

Objective1

Objective2

Objective3

ObjData1

ObjData2

DecisionMethod

Type

Agent1

A1

R1

LCOE

1

singleObj

New

Agent2

A1

R1

LCOE

1

singleObj

Retrofit

Agent3

A2

R1

LCOE

1

singleObj

New

Agent4

A2

R1

LCOE

1

singleObj

Retrofit

Again, this requires the re-running of the simulation, and to visualise the results like before:

[4]:
mca_capacity = pd.read_csv(
    "../tutorial-code/2-add-agent/2-single-objective/Results/MCACapacity.csv"
)
power_sector = mca_capacity[mca_capacity.sector == "power"]
power_sector = power_sector.groupby(["agent", "technology", "year"]).sum().reset_index()
g = sns.FacetGrid(power_sector, row="agent")
g.map(sns.lineplot, "year", "capacity", "technology")
g.add_legend()
[4]:
<seaborn.axisgrid.FacetGrid at 0x7f743d51d430>
../_images/user-guide_add-agent_12_1.png

In this new scenario, with both agents running the same objective, very similar results between agents can be seen. There is a lower uptake in gasCCGT, and a large uptake in windturbine, whilst solarPV is invested in especially in the year 2040 where a change in the price of solarPV was set in the previous tutorial.

As the two agents make the same decisions, we see the same scenario develop for both agents, unlike in the previous scenario.

Have a play around with the files to see if you can come up with different scenarios!

8.2.1. Next steps

In the next section we will show you how to add a new region. We will maintain the two agents in this next section, and all the work done in the previous tutorials.