Advertisement
Guest User

aab12

a guest
Jan 24th, 2020
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.58 KB | None | 0 0
  1. import numpy as np
  2. import copy
  3. import sys
  4. import time
  5. import stopit
  6. import psutil
  7. import os
  8. from datetime import datetime
  9.  
  10. class StatusCautator:  #clasa cu informatii
  11.     def __init__(self, nume, status, prieteni):
  12.         self.nume = nume
  13.         self.status = status
  14.         self.prieteni = prieteni
  15.         self.initiale = [l[0] for l in nume]
  16.  
  17. class NodParcurgere:
  18.     def __init__(self, index, info, parinte):
  19.         self.index = index  # e indicele din vect de noduri
  20.         self.info = info
  21.         self.parinte = parinte # parintele din arborele de parcurgere
  22.  
  23.     def obtineDrum(self): #obtine drumul pana la nodul curent
  24.         l = [self.info]
  25.         nod = self
  26.         while nod.parinte is not None:
  27.             l.insert(0, nod.parinte.info)
  28.             nod = nod.parinte
  29.         return l
  30.  
  31.     def afisDrum(self):  # returneaza si lungimea drumului  pana la nodul curent
  32.         l = self.obtineDrum()
  33.         print("->".join(l))
  34.         return len(l)
  35.  
  36.     def contineInDrum(self, infoNodNou):
  37.         nodDrum = self
  38.         while nodDrum is not None:
  39.             if infoNodNou == nodDrum.info:
  40.                 return True
  41.             nodDrum = nodDrum.parinte
  42.  
  43.         return False
  44.  
  45.     def __repr__(self):
  46.         sir = ""
  47.         sir += self.info + "("
  48.         sir += "index = {}, ".format(self.index)
  49.         sir += "drum="
  50.         drum = self.obtineDrum()
  51.         sir += "->".join(drum)
  52.         sir += ")"
  53.         return sir
  54.  
  55. class Node:
  56.     def __init__(self, nume, status, prieteni, index):
  57.         self.informatie = StatusCautator(nume, status, prieteni)
  58.         self.index = index
  59.  
  60.     def to_string(self):
  61.         my_str = str(self.index) + ") " + "".join(self.informatie.initiale) + ' - '
  62.         my_str += " ".join(self.informatie.nume) + " (%s): " %self.informatie.status
  63.         my_str += ", ".join([" ".join(fr) for fr in self.informatie.prieteni])
  64.         return my_str
  65.  
  66.     # def __repr__(self):
  67.     #     return self.to_string()
  68.  
  69.     def __str__(self):
  70.         return self.to_string()
  71.  
  72.     def __eq__(self, other):
  73.         return self.informatie.nume == other.informatie.nume
  74.  
  75.  
  76. class Graph: #graful problemei din lab
  77.     def __init__(self, noduri, matrice, vecini, v_e, start, scopuri):
  78.         self.noduri = noduri
  79.         self.matrice = matrice
  80.         self.vecini = vecini
  81.         self.v_e = v_e
  82.         self.nrNoduri = len(matrice)
  83.         self.start = start
  84.         self.scopuri = scopuri
  85.  
  86.     def indiceNod(self, n):
  87.         return self.noduri.index(n)
  88.  
  89.     def genereazaSuccesori(self, nodCurent):
  90.         listaSuccesori = []
  91.         for i in range(self.nrNoduri):
  92.             if self.matrice[nodCurent.index][i] == 1 and not nodCurent.contineInDrum(self.noduri[i]):
  93.                 nodNou = NodParcurgere(i, self.noduri[i], nodCurent)
  94.                 listaSuccesori.append(nodNou)
  95.         return listaSuccesori
  96.  
  97.  
  98.     def __repr__(self):
  99.         sir = ""
  100.         for (k, v) in self.__dict__.items():
  101.             sir+= "{} = {}\n".format(k, v)
  102.         return sir
  103.  
  104.  
  105. def obtineContacte(fisier):
  106.     with open(fisier, 'r') as f:
  107.         temp = f.readline().replace("'", '').split()
  108.         initiale, numele = temp[0:2], temp[2:]
  109.         print("\nIntialele cautate: ", initiale)
  110.         linii = [l.replace("'", '').split() for l in f.readlines() ]
  111.         contacte = list()
  112.         noduri = list()
  113.         for index, line in enumerate(linii):
  114.             nume,status = line[:2], line[2]   #primele 2 elemente din vectorul format sunt mereu numele , al 3 lea mereu statusul
  115.             prieteni = [(line[i], line[i+1]) for i in range(3, len(line), 2)] #toate elementele de la al 3 lea in fata sunt prietenii (mereu cu nume si prenume)
  116.             contacte.append(Node(nume, status, prieteni, index))
  117.             noduri.append(" ".join(nume))
  118.  
  119.     print("\nContinut folder:")
  120.     print('\t' + "\n\t".join([str(fr) for fr in contacte]))
  121.  
  122.     return contacte, noduri, initiale
  123.  
  124.  
  125. def initialeIdentice(nume, initiale):
  126.     temp1 = [i[0] for i in nume.split()]
  127.     return temp1 == initiale
  128.  
  129. def graf(contacte, noduri, initiale):
  130.     matrice = np.zeros((len(contacte), len(contacte)), 'int8')
  131.     vecini = dict()
  132.     noade = list()
  133.     margini = list()
  134.     print("\nAscoiere nume cu numere: ")
  135.     for contact in contacte:
  136.         print('\t' + str(contact.index), end=": ") #pentru fiecare om din lista de prieteni: afisez id ul si fac append la contacte
  137.         noade.append(contact.index)
  138.         temp1List = list()
  139.         for prieten in contact.informatie.prieteni:
  140.             index = noduri.index(" ".join(prieten)) #asociez id urile prietenilor cu fiecare om in parte
  141.             print(index, end= ' ')
  142.             matrice[contact.index][index] = 1
  143.             temp1List.append(index)
  144.             margini.append((contact.index, index))
  145.         vecini[contact.index] = temp1List
  146.         print()
  147.  
  148.     v_e = dict()
  149.     v_e["noade"] = noade
  150.     v_e["margini"] = margini
  151.     simetric = np.sum([(a == b) for (a, b) in zip(matrice, np.transpose (matrice))]) == len(contacte)**2
  152.  
  153.     print("\nMatrice: \n", matrice)
  154.     print("\nVecini: \n", vecini)
  155.     print("\nNoade\Margini: \n", v_e)
  156.     print("\nGraf neorientat: \n") if simetric else print("\n Graf orientat")
  157.  
  158.     scopuri = [k for k in noduri if initialeIdentice(k, initiale)]
  159.     print("\nScopuri", scopuri)
  160.  
  161.     return Graph(noduri, matrice, vecini, v_e, noduri[0], scopuri)
  162.  
  163.  
  164.  
  165. @stopit.threading_timeoutable(default="Depasit timp de timeout ")
  166. ######### Algoritm BF
  167. def breadth_first(gr):
  168.     nrSolutiiCautate = 4
  169.     # in coada vom avea doar noduri de tip NodParcuregere (nodurile din arborele de parcurgere)
  170.     c = [NodParcurgere(gr.noduri.index(gr.start), gr.start, None)]
  171.  
  172.     continua = True #Variabila pe care o setam false cand consideram ca s-au afisat suficiente solutii
  173.     scopuri = gr.scopuri.copy()
  174.  
  175.     while len(c) > 0 and continua:
  176.         nodCurent = c.pop(0)
  177.  
  178.         if nodCurent.info in scopuri:
  179.             nodCurent.afisDrum()
  180.             nrSolutiiCautate -= 1
  181.             scopuri.remove(nodCurent.info)
  182.  
  183.             if nrSolutiiCautate == 0:
  184.                 continua = False
  185.  
  186.         listaSuccesori  = gr.genereazaSuccesori(nodCurent)
  187.         c.extend(listaSuccesori)
  188.  
  189. continua1 = True
  190.  
  191. @stopit.threading_timeoutable(default="Depasit timp de timeout ")
  192. ####### Algoritm depth_first
  193. def depth_first(gr):
  194.     # vom simula o stiva prin relatia de parinte a nodului curent
  195.     df(NodParcurgere(gr.noduri.index(gr.start), gr.start, None), gr)
  196.  
  197. nrSolutiiCautate = 4
  198.  
  199.  
  200. def df(nodCurent, gr):
  201.     global continua1, nrSolutiiCautate
  202.     if not continua1:
  203.         return
  204.  
  205.     if nodCurent.info in gr.scopuri:
  206.         print("Solutie: ", end="")
  207.         nodCurent.afisDrum()
  208.         nrSolutiiCautate -= 1
  209.         if nrSolutiiCautate == 0:
  210.             continua1 = False
  211.  
  212.     listaSuccesori = gr.genereazaSuccesori(nodCurent)
  213.     for sc in listaSuccesori:
  214.         df(sc, gr)
  215.  
  216. # @stopit.threading_timeoutable(default="Depasit timp de timeout ")
  217. # ###### Algoritmul Depth First Iretartiv
  218. # def depth_first_iterative_deepening(gr, adancimeMaxima):
  219. #     # vom simula o stiva prin relatia de parinte a nodului curent
  220. #     for i in range(1, adancimeMaxima):
  221. #         dfi(i, NodParcurgere(gr.noduri.index(gr.start), gr.start, None), gr)
  222. #
  223. # # e exact ca functia df din laborator doar ca impunem si o lungime maxima a drumului
  224. # nrSolutii = 5
  225. # continua2 = True
  226. #
  227. #
  228. # def dfi(adMaxCurenta, nodCurent, gr):
  229. #     global nrSolutii, continua2
  230. #     # descrestem adMaxCurenta pana la 0
  231. #     if adMaxCurenta <= 0 or not continua2:  # ar trebui adMaxCurenta sa nu ajunga niciodata < 0
  232. #         return
  233. #     adMaxCurenta -= 1
  234. #
  235. #     if nodCurent.info in gr.scopuri:
  236. #         print("Solutie: ", end=" ")
  237. #         nodCurent.afisDrum()
  238. #         input()
  239. #         nrSolutii -= 1
  240. #         if nrSolutii == 0:
  241. #             continua2 = False
  242. #     listaSuccesori = gr.genereazaSuccesori(nodCurent)
  243. #     for sc in listaSuccesori:
  244. #         dfi(adMaxCurenta, sc, gr)
  245.  
  246. def test(file1):
  247.     contacte, noduri, initiale = obtineContacte(file1)
  248.     my_graph = graf(contacte, noduri, initiale)
  249.  
  250.     print("\nBF:")
  251.     start_time = datetime.now()
  252.     breadth_first(my_graph)
  253.     end_time = datetime.now()
  254.     print('\nDurata BF: {}'.format(end_time - start_time))
  255.     memorieOcupata = psutil.Process(os.getpid())
  256.     print("Memorie ocupata de BF: {}".format(memorieOcupata.memory_info()[0]) + " bytes")
  257.  
  258.  
  259.     print("\nDF: ")
  260.     depth_first(my_graph)
  261.  
  262.     print("\nDFI: ")
  263.     # depth_first_iterative_deepening(my_graph, 5)
  264.  
  265.  
  266. test("file1.txt")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement