Welkom bij ons project voor het vak 'Algoritmen en Heuristieken' voor de minor programmeren aan de Universiteit van Amsterdam. Hier proberen we een onmogelijke case op te lossen. Wij hebben voor de case 'Smart Grid' gekozen.
In de case 'Smart Grid' wordt een grid gegeven met huizen die allemaal energie kunnen leveren. Op de grid staan ook batterijen die deze energie moeten opslaan. Deze batterijen hebben wel een maximum capaciteit die niet overschreden mag worden. Om de energie van een huis naar een batterij te brengen moeten kabels worden gelegd. Deze kabels kosten geld en dus is het belangrijk om dit zo efficient mogelijk te doen. Aan ons de taak om de kosten zo laag mogelijk te houden.
Hierbij moeten we ons aan bepaalde vereisten houden:
- Batterijen mogen niet aan elkaar verbonden zijn. Ook niet via een huis.
- Een huis mag niet aan meerdere batterijen verbonden zijn.
- Er mogen meerdere kabels over dezelfde gridsegmenten lopen.
Dit probleem heeft verschillende gradaties in moeilijkheid:
- Alle huizen moeten een unieke kabel naar een batterij hebben.
- Huizen mogen kabels delen.
- Batterijen mogen verplaatst worden.
- Je mag zelf batterijen kiezen uit een selectie en deze overal plaatsen waar je wil.
Bij elke gradatie is het doel om de kosten zo laag mogelijk te houden. De kosten kunnen berekend worden door voor elke kabel 9 te rekenen en voor elke 'normale' batterij (de batterijen van gradatie 1 t/m 3) 5000 te rekenen.
Bij de laatste gradatie kan uit de volgende batterijtypes worden gekozen met elk hun eigen prijs en capaciteit.
Batterijtype | Capaciteit | Prijs |
---|---|---|
PowerStar | 450 | 900 |
Imerse-II | 900 | 1350 |
Imerse-III | 1800 | 1800 |
Om ons algoritme te testen, zijn er drie dummy-woonwijken opgesteld. Deze zijn gegeven in csv-bestanden. Deze wijken zien er als volgt uit:
Dit project is volledig geprogrammeerd in Python. De vereiste modules kunnen geïnstalleerd worden m.b.v. het volgende command.
python3 -m pip install -r requirements.txt
NOTE: Dit command kan per persoon verschillen afhankelijk van de installatie van python.
Het programma kan worden gerund door de main.py file te runnen. Hiervoor moeten wel nog enkele command-line arguments worden toegevoegd voordat het programma kan werken. Zo moet het eerste argument het district zijn en het tweede argument welk algoritme. Een algemeen voorbeeld is hieronder gegeven:
python3 main.py [DISTRICT] [ALGORITHM]
Voor DISTRICT
kan je 1 t/m 3 invullen en voor ALGORITHM
kan je kiezen uit een van de volgende algoritmes hier meer info):
- baseline
- greedy
- sd_hill_climber
- baseline_shared
- greedy_shared
- hill_climber_shared
- sd_hill_climber_shared
- simulated_annealing
- plant_propagation
- hill_climber_battery
- clustering
- clustering_and_hc_battery
Om greedy + hill climber (shared cables) te runnen moet
use_greedy
op line 77 in /code/algorithms/shared_cables/hill_climber_shared.py op True worden gezet. Vervolgens kan je voorALGORITHM
hill_climber_shared invullen. Voor hill climber (shared cables) met random startpunten te laten beginnen moetuse_greedy
juist op False staan. Standaard staat deze op True.
Standaard wordt het resultaat opgeslagen in een JSON bestand te vinden op /results/output.json
. Daarnaast wordt het ook gevisualiseerd in een matplotlib venster. Deze output methodes kunnen worden uitgeschakeld door de desbetreffende regel te commenten in regels 52 t/m 56 in main.py.
De visualisatie zou er ongeveer zo uit moeten komen te zien:
Om de eerdere resultaten die opgeslagen zijn een als JSON bestand te visualiseren kan het volgende commando gebruikt worden:
python3 visualize_json.py [FILEPATH]
De hierop volgende lijst beschrijft de belangrijkste mappen en files in het project, en waar je ze kan vinden:
- /code: bevat alle code van dit project
- /code/algorithms: bevat de code voor algoritmes
- /code/algorithms/own_cables: bevat alle algoritmes voor gradatie 1 van de case
- /code/algorithms/shared_cables: bevat alle algoritmes voor gradatie 2 van de case
- /code/algorithms/battery_move: bevat alle algoritmes voor gradatie 3 van de case
- /code/algorithms/battery_choose: bevat alle algoritmes voor gradatie 4 van de case
- /code/classes: bevat de benodigde classes voor deze case
- /code/visualisation: bevat de code voor de visualisatie
- /code/export: bevat de code voor het exporteren naar een JSON bestand
- /code/helper_functions: bevat functies die in meerdere algoritmes worden gebruikt
- /code/algorithms: bevat de code voor algoritmes
- /data: bevat de verschillende databestanden die nodig zijn om de grid in te laden
- /docs: bevat de documentatie voor dit project
- /results: bevat de resultaten van eerdere runs
Documentatie van onze algoritmes is hier te vinden.
Documentatie van onze experimenten en resultaten met de verschillende algoritmes is hier te vinden.
- Xander Broos
- Miguel Siewe
- Sander Britton
Normal battery icon by Icons8
PowerStar battery icon by Icons8
Imerse-II battery icon by Icons8
Imerse-III battery icon by Icons8