Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.57 KB | None | 0 0
  1. grafo.py
  2.  
  3.     # Recibe un vertice a borrar y elimina todas las relaciones con otros vertices y luego elimina el vertice recibido.
  4.     def borrar_vertice(self, vertice_a_borrar):
  5.         if vertice_a_borrar not in self.vertices: return
  6.         adyacentes = self.adyacentes(vertice_a_borrar)
  7.         for vertice in adyacentes:
  8.             self.vertices[vertice].pop(vertice_a_borrar)
  9.             self.cant_aristas -= 1
  10.         self.vertices.pop(vertice_a_borrar)
  11.         self.cant_vertices -= 1
  12.  
  13.     # Devuelve el promedio de grado del grafo
  14.     def promedio_grado(self):
  15.         return (2*self.cant_aristas)/self.cant_vertices
  16.        
  17.     # Devuelve el estimador de máxima verosimilitud de la varianza del promedio del grado del grafo
  18.     def varianza_grado(self):
  19.         sumatoria = 0
  20.         for vertice in self.vertices:
  21.             sumatoria += ((len(self.adyacentes(vertice)) - self.promedio_grado()) ** 2)
  22.         return sumatoria/self.cant_vertices
  23.    
  24.     # Devuelve el estimador de máxima verosimilitud del desvío estándar del promedio del grado del grafo
  25.     def desvio_estandar_grado(self):
  26.         return math.sqrt(self.varianza_grado())
  27.  
  28.     def dicc_grados(self):
  29.         dicc_grados = {}
  30.         i=0
  31.         for vertice in self.vertices:
  32.             grado_vertice = len(self.adyacentes(vertice))
  33.             dicc_grados[grado_vertice] = dicc_grados.get(grado_vertice, 0) + 1
  34.         return dicc_grados
  35. ************************************************************************************************
  36. tp3.py
  37.  
  38. from grafo import *
  39. import csv
  40. import sys
  41. import random
  42. import heapq
  43. import nodo_heap
  44. import queue
  45. import merge_sort
  46. import matplotlib.pyplot as plt
  47. import numpy as np
  48. import pylab as pl
  49. from time import time
  50.  
  51. def similares_recomendar_auxiliar(grafo, vertice_inicial, cantidad_usuarios_semejantes, operacion):
  52.     try:
  53.         if vertice_inicial not in grafo:
  54.             print(MENSAJE_ERROR_USUARIO_INVALIDO)
  55.             return
  56.         puntajes = random_walks(grafo, vertice_inicial, LARGO_RECORRIDO_RW, CANTIDAD_RECORRIDOS_RW, None)
  57.         if operacion.lower() == 's': maximos = k_maximos_diccionario(puntajes, cantidad_usuarios_semejantes, None, vertice_inicial)
  58.         elif operacion.lower() == 'r': maximos = k_maximos_diccionario(puntajes, cantidad_usuarios_semejantes, grafo, vertice_inicial)
  59.         else: raise ValueError
  60.         for nodo in maximos:
  61.             print(nodo.obtener_dato(), end=' ')
  62.         print()
  63.     except ValueError: print("Parámetro operación inválido ('s' o 'r')")
  64.  
  65. def similares(grafo, vertice_inicial, cantidad_usuarios_semejantes):
  66.     similares_recomendar_auxiliar(grafo, vertice_inicial, cantidad_usuarios_semejantes, "s")
  67.  
  68. def recomendar(grafo, vertice_inicial, cantidad_usuarios_semejantes):
  69.     similares_recomendar_auxiliar(grafo, vertice_inicial, cantidad_usuarios_semejantes, "r")
  70.  
  71. #Imprime un histograma de los grados del grafo para analizar su distribución
  72. def histograma_grafos(grafo):
  73.     dicc_grados = grafo.dicc_grados()
  74.     claves_dicc_grados = sorted(dicc_grados)
  75.     suma = 0
  76.     alturas = []
  77.     contador = 0
  78.     tamanio_muestra = len(claves_dicc_grados)
  79.     clases = round(1 + math.log2(tamanio_muestra)) #https://es.wikipedia.org/wiki/Regla_de_Sturges
  80.     long_intervalos = round(tamanio_muestra/clases)
  81.     print(long_intervalos)
  82.     print("tamanio muestra: {}".format(tamanio_muestra))
  83.     for i in range(tamanio_muestra):
  84.         if i==long_intervalos*(contador+1):
  85.             frecuencia = (suma/tamanio_muestra)
  86.             altura = frecuencia/long_intervalos
  87.             print("altura: {}".format(altura))
  88.             alturas.append(altura)
  89.             suma = 0
  90.             contador += 1
  91.         suma += dicc_grados.get(claves_dicc_grados[i])
  92.     x = []
  93.     y = []
  94.     contador = 1
  95.     altura_actual = alturas[0]
  96.     for i in range(tamanio_muestra):
  97.         x.append(i)
  98.         if i==long_intervalos*contador:
  99.             altura_actual = alturas[contador]
  100.             contador += 1
  101.             print(contador)
  102.         y.append(altura_actual)
  103.         if contador >= len(alturas): break
  104.     pl.plot(x, y)
  105.     pl.show()
  106.  
  107. def estadisticas(grafo):
  108.     vertices = grafo.cantidad_vertices()
  109.     aristas = grafo.cantidad_aristas()
  110.     print("Cantidad de vértices: {}".format(vertices))
  111.     print("Cantidad de aristas: {}".format(aristas))
  112.     if vertices == 0: return
  113.     print("Promedio de grado de cada vértice: {}".format(grafo.promedio_grado()))
  114.     tiempo_i = time()
  115.     print("Varianza de promedio de grado: {}".format(grafo.varianza_grado()))
  116.     print("DEBUG: Termino el calculo de varianza en {}".format(time()-tiempo_i))
  117.     print("Desvio estándar de promedio de grado: {}".format(grafo.desvio_estandar_grado()))
  118.     densidad = 2 * aristas / (vertices * (vertices - 1))
  119.     print("Densidad del grafo: {}".format(densidad))
  120.     histograma_grafos(grafo)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement