Xarxa elèctrica d’un parc eòlic¶
Aquest exercici va néixer a arrel de LESIE, una iniciativa que pretén relacionar els estudis de l’ETSEIB amb els actuals reptes socials. Utilitzarem dades dels projectes El Alumbre i Alto Perú, l’objectiu dels quals és desenvolupar una xarxa elèctrica descentralitzada basada en aerogeneradors a petita escala en dues zones energèticament aïllades del Perú. Visiteu aquest enllaç per a conèixer més detalls.
Per tal de construir la xarxa elèctrica, cal trobar un cablejat que connecti tots els punts de consum que tingui la mínima llargada possible. A tal efecte, l’estratègia consistirà en construir primerament un graf complet amb totes connexions possibles entre els punts de consum i després construir el què es coneix com un arbre d’expansió tal que minimitzi la llargada del cablejat. Així doncs, cada node d’aquest graf serà una tupla amb les tres coordenades dels punts de consum. Per aconseguir que el cablejat sigui el més curt possible caldrà que les arestes del graf tinguin informació sobre la distància que separa els dos punts extrems.
Creació del graf complet¶
Disposem de dos fitxers amb les coordenades 3D dels punts de consum en cadascun dels dos projectes, el_alumbre.txt i alto_peru.txt. Cada línia d’aquests fitxers conté les coordenades (x,y,z) d’un punt de consum, tres nombres enters separats per un o més espais. Aquestes coordenades han estat prèviament transformades utilitzant el sistema de projecció UTM.
Es demana que en el mòdul lesie (fitxer lesie.py) hi deseu la funció següent, que retorna un graf complet entre tots els punts de consum que figuren en un fitxer:
- lesie.crea_graf_complet(nomf)¶
- Paràmetres:
nomf (str) – Nom del fitxer
- Retorna:
graf complet entre tots els punts de consum del fitxer. Cada aresta del graf atribut dist amb el valor de la distància entre els seus dos extrems.
- Tipus de retorn:
nx.Graph
Exemples d’ús:
>>> from lesie import crea_graf_complet
>>> g = crea_graf_complet("alto_peru.txt")
>>> g.number_of_nodes(), g.number_of_edges()
(26, 325)
>>> f"Suma de distàncies = {sum(map(lambda x:x[2], g.edges(data='dist'))):.2f}"
'Suma de distàncies = 286490.00'
>>> g = crea_graf_complet("el_alumbre.txt")
>>> g.number_of_nodes(), g.number_of_edges()
(35, 595)
>>> f"Suma de distàncies = {sum(map(lambda x:x[2], g.edges(data='dist'))):.2f}"
'Suma de distàncies = 786023.38'
Disposeu de jocs de proves al fitxer test-creag.txt.
Càlcul del cablejat més curt possible¶
Al mateix mòdul lesie, deseu-hi la funció següent, que calcula el cablejat entre punts de consum. Utilitzeu la funció networkx.algorithms.tree.mst.minimum_spanning_tree():
- lesie.cablejat(g)¶
- Paràmetres:
g (nx.Graph) – graf complet entre punts de consum, com el retornat per la funció anterior
- Retorna:
graf de connexions entre punts de consum tal que minimitza la llargada del cablejat
- Tipus de retorn:
nx.Graph
Exemples d’ús:
>>> from lesie import crea_graf_complet, cablejat
>>> g = crea_graf_complet("alto_peru.txt")
>>> gm = cablejat(g)
>>> f"Llargada del cablejat = {sum(map(lambda x:x[2], gm.edges(data='dist'))):.2f}"
'Llargada del cablejat = 5087.05'
>>> g = crea_graf_complet("el_alumbre.txt")
>>> gm = cablejat(g)
>>> f"Llargada del cablejat = {sum(map(lambda x:x[2], gm.edges(data='dist'))):.2f}"
'Llargada del cablejat = 11101.21'
Disposeu de jocs de proves al fitxer test-cablejat.txt
Solucions
Disposeu de les solucions proposades al fitxer lesie.py.