Advertisement
soulrpg

AISD_Grafy_v2

Apr 20th, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.52 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(ilosc_wierzcholkow, ilosc_krawedzi, 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.  
  37. def generuj_graf(ilosc_wierzcholkow, ilosc_krawedzi, nasycenie, lista_krawedzi):
  38.     ilosc_krawedzi = int(ilosc_wierzcholkow*(ilosc_wierzcholkow - 1)*0.5*(nasycenie/100))
  39.     for i in range(ilosc_krawedzi):
  40.         brak_cykli = False
  41.         while brak_cykli == False:
  42.             powtarza_sie = False
  43.             wierzcholek1 = random.randrange(0, ilosc_wierzcholkow)
  44.             wierzcholek2 = copy.copy(wierzcholek1)
  45.             while wierzcholek1 == wierzcholek2:
  46.                 wierzcholek2 = random.randrange(0, ilosc_wierzcholkow)
  47.             for krawedz in lista_krawedzi:
  48.                 if krawedz == [wierzcholek1, wierzcholek2] or krawedz == [wierzcholek2, wierzcholek1]:
  49.                     powtarza_sie = True
  50.                     break
  51.             if powtarza_sie == False:
  52.                 lista_krawedzi.append([wierzcholek1, wierzcholek2])
  53.                 if cykle(copy.copy(lista_krawedzi), ilosc_wierzcholkow) == True:
  54.                     #print("Jest dodany!")
  55.                     brak_cykli = True
  56.                 else:
  57.                     lista_krawedzi.pop()
  58.  
  59. def tworz_lnastepnikow(ilosc_wierzcholkow, lista_krawedzi, lista_nastepnikow):
  60.     for i in range(ilosc_wierzcholkow):
  61.         lista_nastepnikow.append([])
  62.     for krawedz in lista_krawedzi:
  63.         lista_nastepnikow[krawedz[0]].append(krawedz[1])
  64.     for i in range(len(lista_nastepnikow)):
  65.         lista_nastepnikow[i].sort()
  66.     #print(lista_nastepnikow)
  67.  
  68. def tworz_msasiedztwa(ilosc_wierzcholkow, lista_krawedzi, macierz_sasiedztwa):
  69.     # wypelnianie macierzy WxW zerami
  70.     for i in range(ilosc_wierzcholkow):
  71.         macierz_sasiedztwa.append([])
  72.         for j in range(ilosc_wierzcholkow):
  73.             macierz_sasiedztwa[i].append(0)
  74.     # wpisywanie jedynek w odpowiednie miejsca, tam gdzie istnieje krawedz (luk)
  75.     for krawedz in lista_krawedzi:
  76.         macierz_sasiedztwa[krawedz[0]][krawedz[1]] = 1
  77.     print(macierz_sasiedztwa)
  78.    
  79. def DFS_test(lista_krawedzi, odwiedzone, wierzcholek):
  80.     #print(type(wierzcholek))
  81.     global cyclic
  82.     odwiedzone[wierzcholek] = "szary"
  83.     for krawedz in lista_krawedzi:
  84.         if krawedz[0] == wierzcholek:
  85.             if odwiedzone[krawedz[1]] == "czarny":
  86.                 continue
  87.             if odwiedzone[krawedz[1]] == "szary":
  88.                 #print("Cykliczny!")
  89.                 cyclic = True
  90.                 return False
  91.             DFS_test(lista_krawedzi, odwiedzone, krawedz[1])
  92.             odwiedzone[krawedz[1]] = "czarny"
  93.     for i in range(len(odwiedzone)):
  94.         if odwiedzone[i] == "bialy":
  95.             DFS_test(lista_krawedzi, odwiedzone, i)
  96.                  
  97. def cykle(lista_krawedzi, ilosc_wierzcholkow):
  98.     global cyclic
  99.     cyclic = False
  100.     if(len(lista_krawedzi) == 0):
  101.         return True
  102.     odwiedzone = []
  103.     for i in range(ilosc_wierzcholkow):
  104.         odwiedzone.append("bialy")
  105.     DFS_test(lista_krawedzi, odwiedzone, lista_krawedzi[0][0])
  106.     if cyclic == True:
  107.         return False
  108.     else:
  109.         return True
  110.    
  111. def wyswietl_krawedzie(lista_krawedzi):
  112.     for krawedz in lista_krawedzi:
  113.         print(krawedz[0], krawedz[1], sep='->')
  114.  
  115. #############################################
  116. # Funkcje Sluzace Sortowaniu Topologicznemu #
  117. #############################################
  118.  
  119. #Kontroluje wszystkie algorytmy sortowania topologicznego poprzez DFS
  120. def DFS_manager(lista_krawedzi, lista_nastepnikow, macierz_sasiedztwa, ilosc_wierzcholkow):
  121.     print("Sortowanie topologicznie DFS")
  122.     # Krawedzie
  123.     odwiedzone_krawedzie = []
  124.     posortowane_wierzcholki1 = []
  125.     for i in range(ilosc_wierzcholkow):
  126.         odwiedzone_krawedzie.append("bialy")
  127.     for i in range(len(odwiedzone_krawedzie)):
  128.         if odwiedzone_krawedzie[i] == "bialy":
  129.             DFS_lkrawedzi(lista_krawedzi, odwiedzone_krawedzie, i, posortowane_wierzcholki1)
  130.     print("Lista krawedzi:")
  131.     print("Wierzcholki posortowane topologicznie:", posortowane_wierzcholki1)
  132.     # Nastepniki
  133.     odwiedzone_nastepniki = []
  134.     posortowane_wierzcholki2 = []
  135.     for i in range(ilosc_wierzcholkow):
  136.         odwiedzone_nastepniki.append("bialy")
  137.     for i in range(len(odwiedzone_krawedzie)):
  138.         if odwiedzone_nastepniki[i] == "bialy":
  139.             DFS_lnastepnikow(lista_nastepnikow, odwiedzone_nastepniki, i, posortowane_wierzcholki2)
  140.     print("Lista nastepnikow:")
  141.     print("Wierzcholki posortowane topologicznie:", posortowane_wierzcholki2)
  142.     # Macierz
  143.     odwiedzone_macierz = []
  144.     posortowane_wierzcholki3 = []
  145.     for i in range(ilosc_wierzcholkow):
  146.         odwiedzone_macierz.append("bialy")
  147.     for i in range(len(odwiedzone_krawedzie)):
  148.         if odwiedzone_macierz[i] == "bialy":
  149.             DFS_msasiedztwa(macierz_sasiedztwa, odwiedzone_macierz, i, posortowane_wierzcholki3)
  150.     print("Macierz sasiedztwa:")
  151.     print("Wierzcholki posortowane topologicznie:", posortowane_wierzcholki3)
  152.  
  153. def DFS_lkrawedzi(lista_krawedzi, odwiedzone, wierzcholek, posortowane):
  154.     odwiedzone[wierzcholek] = "szary"
  155.     for krawedz in lista_krawedzi:
  156.         if krawedz[0] == wierzcholek:
  157.             if odwiedzone[krawedz[1]] == "czarny":
  158.                 continue
  159.             if odwiedzone[krawedz[1]] == "szary":
  160.                 return False
  161.             DFS_lkrawedzi(lista_krawedzi, odwiedzone, krawedz[1], posortowane)
  162.     odwiedzone[wierzcholek] = "czarny"
  163.     posortowane.insert(0, wierzcholek)
  164.     #for i in range(len(odwiedzone)):
  165.         #if odwiedzone[i] == "bialy":
  166.             #DFS_lkrawedzi(lista_krawedzi, odwiedzone, i, posortowane)
  167.  
  168. def DFS_lnastepnikow(lista_nastepnikow, odwiedzone, wierzcholek, posortowane):
  169.     odwiedzone[wierzcholek] = "szary"
  170.     for i in range(len(lista_nastepnikow[wierzcholek])):
  171.         if odwiedzone[lista_nastepnikow[wierzcholek][i]] == "czarny":
  172.             continue
  173.         if odwiedzone[lista_nastepnikow[wierzcholek][i]] == "szary":
  174.             return False
  175.         DFS_lnastepnikow(lista_nastepnikow, odwiedzone, lista_nastepnikow[wierzcholek][i], posortowane)
  176.     odwiedzone[wierzcholek] = "czarny"
  177.     posortowane.insert(0, wierzcholek)
  178.  
  179. def DFS_msasiedztwa(macierz_sasiedztwa, odwiedzone, wierzcholek, posortowane):
  180.     odwiedzone[wierzcholek] = "szary"
  181.     for i in range(len(macierz_sasiedztwa[wierzcholek])):
  182.         if macierz_sasiedztwa[wierzcholek][i] == 1:
  183.             if odwiedzone[i] == "czarny":
  184.                 continue
  185.             if odwiedzone[i] == "szary":
  186.                return False
  187.             DFS_msasiedztwa(macierz_sasiedztwa, odwiedzone, i, posortowane)
  188.     odwiedzone[wierzcholek] = "czarny"
  189.     posortowane.insert(0, wierzcholek)
  190.    
  191.  
  192. ############################################
  193. # Funkcja Glowna                           #
  194. ############################################
  195.  
  196. def main():
  197.     # przechowuje opcje jaka wybral uzytkownik
  198.     usr_input = 0
  199.     # ilosc wierzcholkow grafu
  200.     ilosc_wierzcholkow = 0
  201.     # ilosc krawedzi grafu
  202.     ilosc_krawedzi = 0
  203.     # procent nasycenia krawedzi w grafie
  204.     nasycenie = 0
  205.     # lista krawedzi grafu
  206.     lista_krawedzi = []
  207.     # lista nastepnikow grafu
  208.     lista_nastepnikow = []
  209.     # macierz sasiedztwa grafu
  210.     macierz_sasiedztwa = []
  211.     while usr_input != 1 and usr_input != 2:
  212.         try:
  213.             usr_input = int(input("Wybierz opcję: 1) Wczytaj graf 2) Generuj graf: "))
  214.         except ValueError:
  215.             print("Podano zle dane wejsciowe!")
  216.     print(usr_input)
  217.     if usr_input == 1:
  218.         wczytaj_graf(ilosc_wierzcholkow, ilosc_krawedzi, lista_krawedzi)
  219.     else:
  220.         while ilosc_wierzcholkow <= 0:
  221.             try:
  222.                 ilosc_wierzcholkow = int(input("Podaj ilosc wierzcholkow: "))
  223.             except ValueError:
  224.                 print("Podano zle dane wejsciowe!")
  225.         while nasycenie <= 0 or nasycenie > 100:
  226.             try:
  227.                 nasycenie = int(input("Podaj poziom nasycenia (1-100%): "))
  228.             except ValueError:
  229.                 print("Podano zle dane wejsciowe!")
  230.         generuj_graf(ilosc_wierzcholkow, lista_krawedzi, nasycenie, lista_krawedzi)
  231.     wyswietl_krawedzie(lista_krawedzi)
  232.     tworz_lnastepnikow(ilosc_wierzcholkow, lista_krawedzi, lista_nastepnikow)
  233.     tworz_msasiedztwa(ilosc_wierzcholkow, lista_krawedzi, macierz_sasiedztwa)
  234.     DFS_manager(lista_krawedzi, lista_nastepnikow, macierz_sasiedztwa, ilosc_wierzcholkow)
  235.  
  236. if __name__ == '__main__':
  237.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement