Advertisement
soulrpg

AISD_Grafy_v3

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