def ciudades_sin_conectar(grafo): """verifica si existen ciudades sin conectar en el grafo y, de ser verdadero, crea un diccionario que tiene como claves los nombres de las ciudades aisladas. O(V)""" aisladas={} for ciudad in grafo.grafo.keys(): adyacentes=grafo.adyacentes(ciudad) if len(adyacentes)==0: aisladas[ciudad_1]=None return aisladas
def label_propagation(grafo): label = {} contador = 0 for v in grafo.vertices: label[v] = contador contador += 1 vertices = list(label.keys()) for j in range(LABEL_ITERACIONES): random.shuffle(vertices) for i in vertices: label[i] = max_freq(grafo.adyacentes(i), label) return label
def random_walk(grafo): apariciones = {} lista_vertices = list(grafo.vertices.keys()) #print("lista vertices claves",lista_vertices) for w in lista_vertices: apariciones[w] = 0 cantidad_vertices = len(grafo) for j in range(cantidad_vertices): vertice_origen = random.choice(lista_vertices) apariciones[vertice_origen] += 1 contador = 0 for i in range(cantidad_vertices): if not grafo.adyacentes(vertice_origen): continue vertice_origen = random.choice( list(grafo.adyacentes(vertice_origen))) apariciones[vertice_origen] += 1 if (i == cantidad_vertices - 1): contador = 0 return apariciones
def hay_ciclo(grafo, vertice, saltos, recorrido, contador, origen, apariciones): if (contador == saltos): if origen == vertice: recorrido.append(vertice) return True else: return False if apariciones.get(vertice) != None: return False recorrido.append(vertice) apariciones[vertice] = 1 adyacentes = grafo.adyacentes(vertice) if adyacentes: for j in grafo.adyacentes(vertice): if hay_ciclo(grafo, j, saltos, recorrido, contador + 1, origen, apariciones): return True eliminado = recorrido.pop() apariciones.pop(eliminado) return False
def radio_rumor(grafo, delicuente, saltos): visitados = set() orden = {} cola = collections.deque() visitados.add(delicuente) orden[delicuente] = 0 cola.append(delicuente) while cola: v = cola.popleft() if (orden[v] == saltos): return visitados for adyacente in grafo.adyacentes(v): if not adyacente in visitados: visitados.add(adyacente) orden[adyacente] = orden[v] + 1 cola.append(adyacente) return visitados
def random_walk(grafo): vertices_aleatorios = random.choices(grafo._vertices() ,k =grafo.cantidad_vertices()) apariciones = {} for vertice in grafo._vertices(): apariciones[vertice] = 0 for i in range(0, grafo.cantidad_vertices()): vertice_act = vertices_aleatorios[i] apariciones[vertice_act] += 1 for i in range(0, 20): lista_Adyacentes= list(grafo.adyacentes(vertice_act)) if not lista_Adyacentes: continue vertice_act = random.choice(lista_Adyacentes) apariciones[vertice_act] += 1 return apariciones
def random_walk(grafo): importancia_delincuente = {} vertices = [] for vertice in grafo._vertices(): vertices.append(vertice) for i in range(0, 3000): vertice_act = random.choice(vertices) for i in range(0, 150): if vertice_act in importancia_delincuente: importancia_delincuente[vertice_act] += 1 else: importancia_delincuente[vertice_act] = 1 vertice_act = random.choice(grafo.adyacentes(vertice_act)) return importancia_delincuente
def dfs_cfc(grafo, v, visitados, orden, p, s, cfcs, en_cfs): visitados.add(v) s.append(v) p.append(v) for w in grafo.adyacentes(v): if w not in visitados: orden[w] = orden[v] + 1 dfs_cfc(grafo, w, visitados, orden, p, s, cfcs, en_cfs) elif not w in en_cfs: while orden[p[-1]] > orden[w]: p.pop() if p[-1] == v: p.pop() z = None nueva_cfc = [] while not z == v: z = s.pop() en_cfs.append(z) nueva_cfc.append(z) cfcs.append(nueva_cfc)
def camino_minimo_bfs(grafo, origen): """devuelve dos diccionarios uno de ordenes y otro de dependencias(padres) """ visitados = set() padres = {} orden = {} cola = collections.deque() visitados.add(origen) padres[origen] = None orden[origen] = 0 cola.append(origen) while cola: v = cola.popleft() for w in grafo.adyacentes(v): if w not in visitados: visitados.add(w) padres[w] = v orden[w] = orden[v] + 1 cola.append(w) return orden, padres
def minimos_seguimientos_hasta_destino(grafo, origen, destino): """ devuelve un diccionario de padres, de dependencias de como llegar desde origen a destino, en caso que no llega a destino devuelve el diccionario pero 'destino' no estara en el diccionario""" padres = {} visitados = set() cola = collections.deque() orden = {} visitados.add(origen) padres[origen] = None orden[origen] = 0 cola.append(origen) while cola: vertice = cola.popleft() for adyacente in grafo.adyacentes(vertice): if not adyacente in visitados: visitados.add(adyacente) padres[ adyacente] = vertice #esto busca por bfs al destino y si encuentra corta y lo pone como visitado. orden[adyacente] = orden[vertice] + 1 if destino == None and adyacente == destino: return padres, orden cola.append(adyacente) return padres, orden