Advertisement
soulrpg

AISD_Grafy_v4

Apr 23rd, 2019
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.59 KB | None | 0 0
  1. import sys
  2. import random
  3. import copy
  4.  
  5. # Globalna zmienna ktora okresla czy istnieja cykle w grafie
  6. cyclic = False
  7.  
  8. ###############################################################
  9. # Funkcje Sluzace Generowaniu Reprezentacji Maszynowych Grafu #
  10. ###############################################################
  11.  
  12. def wczytaj_graf(lista_krawedzi):
  13.     nazwa_pliku = input("Podaj nazwe pliku odczytu: ")
  14.     try:
  15.         plik = open(nazwa_pliku, 'r')
  16.     except FileNotFoundError:
  17.         print("Nie znaleziono wskazanego pliku!")
  18.         sys.exit()
  19.     ilosc_wierzcholkow, ilosc_krawedzi = plik.readline().split()
  20.     ilosc_wierzcholkow = int(ilosc_wierzcholkow)
  21.     ilosc_krawedzi = int(ilosc_krawedzi)
  22.     for line in plik:
  23.         if not line.split():
  24.             break
  25.         print(line.split())
  26.         wierzcholek1, wierzcholek2 = line.split()
  27.         wierzcholek1 = int(wierzcholek1)
  28.         wierzcholek2 = int(wierzcholek2)
  29.         if wierzcholek1 >= ilosc_wierzcholkow or wierzcholek2 >= ilosc_wierzcholkow:
  30.             print("Graf z pliku posiada wiecej wierzcholkow niz podano!")
  31.             plik.close()
  32.             sys.exit()
  33.         lista_krawedzi.append([wierzcholek1, wierzcholek2])
  34.     #if cykle(lista_krawedzi, ilosc_wierzcholkow) == False:
  35.     #    print("Graf z pliku nie jest acykliczny!")
  36.     #    plik.close()
  37.     #    sys.exit()
  38.     #print(cyclic)
  39.     plik.close()
  40.     return ilosc_wierzcholkow, ilosc_krawedzi
  41.  
  42. def generuj_graf(ilosc_wierzcholkow, ilosc_krawedzi, nasycenie, lista_krawedzi):
  43.     ilosc_krawedzi = int(ilosc_wierzcholkow*(ilosc_wierzcholkow - 1)*0.5*(nasycenie/100))
  44.     for i in range(ilosc_krawedzi):
  45.         brak_cykli = False
  46.         while brak_cykli == False:
  47.             powtarza_sie = False
  48.             wierzcholek1 = random.randrange(0, ilosc_wierzcholkow)
  49.             wierzcholek2 = copy.copy(wierzcholek1)
  50.             while wierzcholek1 == wierzcholek2:
  51.                 wierzcholek2 = random.randrange(0, ilosc_wierzcholkow)
  52.             for krawedz in lista_krawedzi:
  53.                 if krawedz == [wierzcholek1, wierzcholek2] or krawedz == [wierzcholek2, wierzcholek1]:
  54.                     powtarza_sie = True
  55.                     break
  56.             if powtarza_sie == False:
  57.                 lista_krawedzi.append([wierzcholek1, wierzcholek2])
  58.                 if cykle(copy.copy(lista_krawedzi), ilosc_wierzcholkow) == True:
  59.                     #print("Jest dodany!")
  60.                     brak_cykli = True
  61.                 else:
  62.                     lista_krawedzi.pop()
  63.  
  64. def tworz_lnastepnikow(ilosc_wierzcholkow, lista_krawedzi, lista_nastepnikow):
  65.     for i in range(ilosc_wierzcholkow):
  66.         lista_nastepnikow.append([])
  67.     for krawedz in lista_krawedzi:
  68.         lista_nastepnikow[krawedz[0]].append(krawedz[1])
  69.     for i in range(len(lista_nastepnikow)):
  70.         lista_nastepnikow[i].sort()
  71.     #print(lista_nastepnikow)
  72.  
  73. def tworz_msasiedztwa(ilosc_wierzcholkow, lista_krawedzi, macierz_sasiedztwa):
  74.     # wypelnianie macierzy WxW zerami
  75.     for i in range(ilosc_wierzcholkow):
  76.         macierz_sasiedztwa.append([])
  77.         for j in range(ilosc_wierzcholkow):
  78.             macierz_sasiedztwa[i].append(0)
  79.     # wpisywanie jedynek w odpowiednie miejsca, tam gdzie istnieje krawedz (luk)
  80.     for krawedz in lista_krawedzi:
  81.         macierz_sasiedztwa[krawedz[0]][krawedz[1]] = 1
  82.     print("========")
  83.     print(macierz_sasiedztwa)
  84.    
  85. def DFS_test(lista_krawedzi, odwiedzone, wierzcholek):
  86.     #print(type(wierzcholek))
  87.     global cyclic
  88.     print(odwiedzone)
  89.     odwiedzone[wierzcholek] = "szary"
  90.     for krawedz in lista_krawedzi:
  91.         if krawedz[0] == wierzcholek:
  92.             if odwiedzone[krawedz[1]] == "czarny":
  93.                 continue
  94.             if odwiedzone[krawedz[1]] == "szary":
  95.                 #print("Cykliczny!")
  96.                 cyclic = True
  97.                 return False
  98.             DFS_test(lista_krawedzi, odwiedzone, krawedz[1])
  99.             odwiedzone[krawedz[1]] = "czarny"
  100.     for i in range(len(odwiedzone)):
  101.         if odwiedzone[i] == "bialy":
  102.             DFS_test(lista_krawedzi, odwiedzone, i)
  103.                  
  104. def cykle(lista_krawedzi, ilosc_wierzcholkow):
  105.     global cyclic
  106.     cyclic = False
  107.     if(len(lista_krawedzi) == 0):
  108.         return True
  109.     odwiedzone = []
  110.     for i in range(ilosc_wierzcholkow):
  111.         odwiedzone.append("bialy")
  112.     DFS_test(lista_krawedzi, odwiedzone, lista_krawedzi[0][0])
  113.     if cyclic == True:
  114.         return False
  115.     else:
  116.         return True
  117.    
  118. def wyswietl_krawedzie(lista_krawedzi):
  119.     print("========")
  120.     for krawedz in lista_krawedzi:
  121.         print(krawedz[0], krawedz[1], sep=' -> ')
  122.  
  123. def wyswietl_nastepniki(lista_nastepnikow):
  124.     print("========")
  125.     for i in range(len(lista_nastepnikow)):
  126.         print(i, end=' ')
  127.         for j in range(len(lista_nastepnikow[i])):
  128.             print('->', lista_nastepnikow[i][j], end=' ')
  129.         print()
  130.  
  131. #############################################
  132. # Funkcje Sluzace Sortowaniu Topologicznemu #
  133. #############################################
  134.  
  135. #Kontroluje wszystkie algorytmy sortowania topologicznego poprzez DFS
  136. def DFS_manager(lista_krawedzi, lista_nastepnikow, macierz_sasiedztwa, ilosc_wierzcholkow):
  137.     print("Sortowanie topologicznie DFS")
  138.     # Krawedzie
  139.     odwiedzone_krawedzie = []
  140.     posortowane_wierzcholki1 = []
  141.     for i in range(ilosc_wierzcholkow):
  142.         odwiedzone_krawedzie.append("bialy")
  143.     for i in range(len(odwiedzone_krawedzie)):
  144.         if odwiedzone_krawedzie[i] == "bialy":
  145.             DFS_lkrawedzi(lista_krawedzi, odwiedzone_krawedzie, i, posortowane_wierzcholki1)
  146.     print("Lista krawedzi:")
  147.     print("Wierzcholki posortowane topologicznie:", posortowane_wierzcholki1)
  148.     # Nastepniki
  149.     odwiedzone_nastepniki = []
  150.     posortowane_wierzcholki2 = []
  151.     for i in range(ilosc_wierzcholkow):
  152.         odwiedzone_nastepniki.append("bialy")
  153.     for i in range(len(odwiedzone_krawedzie)):
  154.         if odwiedzone_nastepniki[i] == "bialy":
  155.             DFS_lnastepnikow(lista_nastepnikow, odwiedzone_nastepniki, i, posortowane_wierzcholki2)
  156.     print("Lista nastepnikow:")
  157.     print("Wierzcholki posortowane topologicznie:", posortowane_wierzcholki2)
  158.     # Macierz
  159.     odwiedzone_macierz = []
  160.     posortowane_wierzcholki3 = []
  161.     for i in range(ilosc_wierzcholkow):
  162.         odwiedzone_macierz.append("bialy")
  163.     for i in range(len(odwiedzone_krawedzie)):
  164.         if odwiedzone_macierz[i] == "bialy":
  165.             DFS_msasiedztwa(macierz_sasiedztwa, odwiedzone_macierz, i, posortowane_wierzcholki3)
  166.     print("Macierz sasiedztwa:")
  167.     print("Wierzcholki posortowane topologicznie:", posortowane_wierzcholki3)
  168.  
  169. def DFS_lkrawedzi(lista_krawedzi, odwiedzone, wierzcholek, posortowane):
  170.     odwiedzone[wierzcholek] = "szary"
  171.     for krawedz in lista_krawedzi:
  172.         if krawedz[0] == wierzcholek:
  173.             if odwiedzone[krawedz[1]] == "czarny":
  174.                 continue
  175.             if odwiedzone[krawedz[1]] == "szary":
  176.                 return False
  177.             DFS_lkrawedzi(lista_krawedzi, odwiedzone, krawedz[1], posortowane)
  178.     odwiedzone[wierzcholek] = "czarny"
  179.     posortowane.insert(0, wierzcholek)
  180.  
  181. def DFS_lnastepnikow(lista_nastepnikow, odwiedzone, wierzcholek, posortowane):
  182.     odwiedzone[wierzcholek] = "szary"
  183.     for i in range(len(lista_nastepnikow[wierzcholek])):
  184.         if odwiedzone[lista_nastepnikow[wierzcholek][i]] == "czarny":
  185.             continue
  186.         if odwiedzone[lista_nastepnikow[wierzcholek][i]] == "szary":
  187.             return False
  188.         DFS_lnastepnikow(lista_nastepnikow, odwiedzone, lista_nastepnikow[wierzcholek][i], posortowane)
  189.     odwiedzone[wierzcholek] = "czarny"
  190.     posortowane.insert(0, wierzcholek)
  191.  
  192. def DFS_msasiedztwa(macierz_sasiedztwa, odwiedzone, wierzcholek, posortowane):
  193.     odwiedzone[wierzcholek] = "szary"
  194.     for i in range(len(macierz_sasiedztwa[wierzcholek])):
  195.         if macierz_sasiedztwa[wierzcholek][i] == 1:
  196.             if odwiedzone[i] == "czarny":
  197.                 continue
  198.             if odwiedzone[i] == "szary":
  199.                return False
  200.             DFS_msasiedztwa(macierz_sasiedztwa, odwiedzone, i, posortowane)
  201.     odwiedzone[wierzcholek] = "czarny"
  202.     posortowane.insert(0, wierzcholek)
  203.  
  204. def DEL_manager(lista_krawedzi, lista_nastepnikow, macierz_sasiedztwa, ilosc_wierzcholkow):
  205.     print("Sortowanie topologiczne DEL")
  206.     posortowane_wierzcholki1 = []
  207.     posortowane_wierzcholki2 = []
  208.     posortowane_wierzcholki3 = []
  209.     stopnie1 = []
  210.     stopnie2 = []
  211.     stopnie3 = []
  212.     for i in range(ilosc_wierzcholkow):
  213.         stopnie1.append(0)
  214.         stopnie2.append(0)
  215.         stopnie3.append(0)
  216.     DEL_lkrawedzi(lista_krawedzi, stopnie1, posortowane_wierzcholki1)
  217.     print("Lista krawedzi:")
  218.     print("Wierzcholki posortowane topologicznie:", posortowane_wierzcholki1)
  219.     DEL_lnastepnikow(lista_nastepnikow, stopnie2, posortowane_wierzcholki2)
  220.     print("Lista nastepnikow:")
  221.     print("Wierzcholki posortowane topologicznie:", posortowane_wierzcholki2)
  222.     DEL_msasiedztwa(macierz_sasiedztwa, stopnie3, posortowane_wierzcholki3)
  223.     print("Macier sasiedztwa:")
  224.     print("Wierzcholki posortowane topologicznie:", posortowane_wierzcholki3)
  225.  
  226. def DEL_lkrawedzi(lista_krawedzi, stopnie, posortowane):
  227.     for i in range(len(stopnie)):
  228.         for krawedz in lista_krawedzi:
  229.             if krawedz[1] == i:
  230.                 stopnie[i] += 1
  231.     while len(stopnie) != len(posortowane):
  232.         for i in range(len(stopnie)):
  233.             if stopnie[i] == 0 and i not in posortowane:
  234.                 for krawedz in lista_krawedzi:
  235.                     if krawedz[0] == i:
  236.                         stopnie[krawedz[1]] -= 1
  237.                 posortowane.append(i)
  238.  
  239. def DEL_lnastepnikow(lista_nastepnikow, stopnie, posortowane):
  240.     for nastepniki in lista_nastepnikow:
  241.         for nastepnik in nastepniki:
  242.             stopnie[nastepnik] += 1
  243.     while len(stopnie) != len(posortowane):
  244.         for i in range(len(stopnie)):
  245.             if stopnie[i] == 0 and i not in posortowane:
  246.                 for nastepniki in lista_nastepnikow[i]:
  247.                     stopnie[nastepniki] -= 1
  248.                 posortowane.append(i)
  249.  
  250. def DEL_msasiedztwa(macierz_sasiedztwa, stopnie, posortowane):
  251.     for i in range(len(macierz_sasiedztwa)):
  252.         for j in range(len(macierz_sasiedztwa)):
  253.             if macierz_sasiedztwa[i][j] == 1:
  254.                 stopnie[j] += 1
  255.     while len(stopnie) != len(posortowane):
  256.         for i in range(len(stopnie)):
  257.             if stopnie[i] == 0 and i not in posortowane:
  258.                 for j in range(len(macierz_sasiedztwa[i])):
  259.                     if macierz_sasiedztwa[i][j] == 1:
  260.                         stopnie[j] -= 1
  261.                 posortowane.append(i)
  262.    
  263.  
  264. ############################################
  265. # Funkcja Glowna                           #
  266. ############################################
  267.  
  268. def main():
  269.     # przechowuje opcje jaka wybral uzytkownik
  270.     usr_input = 0
  271.     # ilosc wierzcholkow grafu
  272.     ilosc_wierzcholkow = 0
  273.     # ilosc krawedzi grafu
  274.     ilosc_krawedzi = 0
  275.     # procent nasycenia krawedzi w grafie
  276.     nasycenie = 0
  277.     # lista krawedzi grafu
  278.     lista_krawedzi = []
  279.     # lista nastepnikow grafu
  280.     lista_nastepnikow = []
  281.     # macierz sasiedztwa grafu
  282.     macierz_sasiedztwa = []
  283.     while usr_input != 1 and usr_input != 2:
  284.         try:
  285.             usr_input = int(input("Wybierz opcję: 1) Wczytaj graf 2) Generuj graf: "))
  286.         except ValueError:
  287.             print("Podano zle dane wejsciowe!")
  288.     print(usr_input)
  289.     if usr_input == 1:
  290.         ilosc_wierzcholkow, ilosc_krawedzi = wczytaj_graf(lista_krawedzi)
  291.     else:
  292.         while ilosc_wierzcholkow <= 0:
  293.             try:
  294.                 ilosc_wierzcholkow = int(input("Podaj ilosc wierzcholkow: "))
  295.             except ValueError:
  296.                 print("Podano zle dane wejsciowe!")
  297.         while nasycenie <= 0 or nasycenie > 100:
  298.             try:
  299.                 nasycenie = int(input("Podaj poziom nasycenia (1-100%): "))
  300.             except ValueError:
  301.                 print("Podano zle dane wejsciowe!")
  302.         generuj_graf(ilosc_wierzcholkow, lista_krawedzi, nasycenie, lista_krawedzi)
  303.     wyswietl_krawedzie(lista_krawedzi)
  304.     tworz_lnastepnikow(ilosc_wierzcholkow, lista_krawedzi, lista_nastepnikow)
  305.     wyswietl_nastepniki(lista_nastepnikow)
  306.     tworz_msasiedztwa(ilosc_wierzcholkow, lista_krawedzi, macierz_sasiedztwa)
  307.     DFS_manager(lista_krawedzi, lista_nastepnikow, macierz_sasiedztwa, ilosc_wierzcholkow)
  308.     DEL_manager(copy.copy(lista_krawedzi), copy.copy(lista_nastepnikow), copy.copy(macierz_sasiedztwa), ilosc_wierzcholkow)
  309.  
  310. if __name__ == '__main__':
  311.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement