Files
etsii-vault/SEGUNDO/MD/Apuntes Sage.md
2025-10-09 19:25:27 +02:00

5.0 KiB

Práctica 1


Métodos principales:

# Sea G = Graph()/DiGraph()
G.plot(figsize=int, layout='circular/tree', vertex_size=int, vertex_colors=dict, edge_colors=dict)
G.add_vertex(v)/vertices()/delete_vertex(v) # vertices
G.add_edge((src,dst))/edges()/delete_edge((src,dst)) # aristas
G.degree(vertice)/in_degree(vertice)/out_degree(vertice) # valencia/grado
G.neighbors(vertice) # vecinos/adyacentes
G.size() # nº aristas
G.order() # nº vertices
G.complement() # complementario
G.is_isomorphic(G2) # es isomorfo a G2? -> boolean
G.adjacency_matrix() # matriz adyacencia
G.subgraph(vertices) # subgrafo inducido

# Grafo manualmente
G1 = Graph({0:[1,2,3],2:[1,3,4],3:[4]})
G1 = Graph(M) # sea M su matriz de adyacencia

Operaciones con grafos:

# Sean G1 y G2 grafos
G1 + G2 # G1 U G2
G1.join(G2) # G1 + G2

Práctica 2


Digrafos para juegos (usando el kernel)

  1. Digrafo con tantos vértices como posibles posiciones del juego.
  2. Las posiciones ganadoras se corresponderán con vértices \delta({v})=0

Para obtener el kernel:

# Sea DG = DiGraph()
kernel(DG) # kernel() definido en Practica 2

Nº de independencia y Nº de clique

  • Nº independencia: tamaño del mayor conjunto independiente de vértices
S = G.independent_set() # mayor conjunto independiente
len(S) # numero de independencia
  • Nº de clique: n~/~C_n
G.clique_number() # numero de clique
G.cliques_maximal() # cliques maximales (no contenidos en otros cliques)
G.cliques_maximum() # cliques máximos (mayor cardinal)

Práctica 3


Distancias y matriz de adyacencia

Sea G=~Graph() Sea M la matriz de adyacencia de G

Los elementos de M^n indican que hay m_{ij} caminos de longitud n entre v_i y v_j

Distancias y elementos métricos

  • Distancia: Longitud del camino más corto entre dos vértices.
# Sea G = Graph()
G.distance(v1,v2)
  • Excentricidad: Distancia de un vértice a su vecino más alejado.
# Sea G = Graph()
G.eccentricity(v) # sin parametros -> lista de excentricidades
- *Radio:* Menor excentricidad
- *Diámetro:* Mayor excentricidad
  • Centro: Conjunto de vértices cuya excentricidad es igual al radio.
# Sea G = Graph()
G.center()
  • Periferia: Conjunto de vértices de mayor excentricidad.
# Sea G = Graph()
G.periphery()

Conectividad

# Sea G = Graph()
G.is_connected()/is_strongly_connected() # ver si es conexo/fuertemente conexo
G.connected_components()/strongly_connected_components() # lista de componentes conexas / fuertemente conexas
G.connected_component_containing_vertex(v) # a donde esta conectado v

k-Conexión

# Sea G = Graph()
G.vertex_connectivity() # conectividad por vértices
G.edge_connectivity() # conectividad por aristas
G.blocks_and_cut_vertices() # [bloques,vs_corte]

Práctica 4


Árboles

# Sea G = Graph()
G.is_tree() # ver si es arbol -> boolean
G.is_forest() # ver si es bosque -> boolean

DFS, BFS, Kruskal, Dijkstra, digrafo_laberinto

Las funciones más importantes:

  • arbol_dfs(DG,inicial) -> Árbol en profundidad (estudiar vertices de corte)
  • arbol_bfs(DG, v) -> Árbol en anchura (camino mas corto desde v a cualquiera. Si G -> G.to_directed() = DG.
  • digrafo_laberinto(filas,columnas,obstver,obsthor) -> Digrafo que resuelve el laberinto
    • obstver: lista de columnas que tienen obstaculo a la derecha
    • obsthor: lista de columnas que tienen obstaculo debajo
  • Kruskal(G_ponderado) -> Arbol de peso minimo
  • Dijkstra(G, inicial) -> Caminos mas cortos desde el inicial

Para resolver un laberinto se usa digrafo_laberinto y luego arbol_bfs.

Práctica 5


Multigrafo

# Sea G = Graph()
G.allow_multiple_edges() # indicar que tendra aristas multiples

Grafos Eulerianos

# Sea G = Graph()
G.is_eulerian() # ver si es euleriano -> boolean
G.is_eulerian(path=True) # si False no es semieuleriano. Si lo es, devuelve v_i y v_f del recorrido.
G.eulerian_circuit(path=True) # circuito semieuleriano en caso de que lo sea

Si no es E ni Semi E, ¿numero de saltos?

Se convierte en multigrafo y se añaden aristas postizas (bucle for en Practica 5)

Grafos Hamiltonianos

# Sea G = Graph()
G.is_hamiltonian() # ver si es hamiltoniano -> boolean
G.hamiltonian_cycle() # ciclo hamiltoniano si G es H
G.hamiltonian_path() # camino hamiltoniano si G es Semi H

DIRAC: Un grafo de n vértices (n>3) es hamiltoniano si cada vértice tiene valencia mayor o igual a n/2. ORE: Un grafo de n vértices (n>3) es hamiltoniano si la suma de valencias de cada pareja de vértices no adyacentes es mayor o igual que n.

Coloracion vertices

voraz(G,p=[]) # definido en Práctica 5

Si un grafo G contiene un clique de m, \chi(G)\geq m por tanto clique(G)\leq\chi(G).

Coloracion aristas

# Sea G = Graph
G.chromatic_index() # numero cromatico por aristas