123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- ## Fichier : network.py
- # Auteur : Jovian Hersemeule
- # Gère l'arbre des neurones pour le cerveau.
- class Network :
- def __init__( self ): # Jovian 17 janvier 2017
- """
- Créé un réseau vide. Le graphe est implémenté par liste d'adjacence.
- La sortie est indexée 0.
- Les entrées sont indexées de 1 à inSize.
- Les intermédiaires sont indexés de inSize + 1 à total de neurones.
- """
- self.tree = None # string list list
- self.poids = None # matrice de poids[de][vers]
- self.total = 1 # int
- self.nb_in = 0
- self.nb_aux = 0
- self.nb_out = 1
- def in_node_to_num( self, node ): # Jovian 7 mars 2017
- """
- Convertit un identidiant de noeud ( par exemple s0 ou i42 ) en indice de tableau.
- Les entrées occupent [0 : nb_in ]
- Les intermédiaires occupent [ nb_in : nb_in + nb_aux ]
- """
- # Décryptage du noeud
- sort = node[0]
- num = int( node[1:] )
- # Détection d'une requête sans sens
- if sort == 's' :
- print( "Appel de in_node_to_num impertinent sur un neurone de sortie." )
- print( "Exécuté sur ", node )
- return -1
- # Décalage dû aux types
- if sort == "i" :
- num += self.nb_in
- # Fin
- return num
- def out_node_to_num( self, node ): # Jovian 7 mars 2017
- """
- Convertit un identidiant de noeud ( par exemple s0 ou i42 ) en indice de tableau.
- Les intermédiaires occupent [0 : nb_aux ]
- Les sorties occupent [ nb_aux : nb_aux + nb_out ]
- """
- # Décryptage du noeud
- sort = node[0]
- num = int( node[1:] )
- # Détection d'une requête sans sens
- if sort == 'e' :
- print( "Appel de out_node_to_num impertinent sur un neurone d'entrée." )
- print( "Exécuté sur ", node )
- return -1
- # Décalage dû aux types
- elif sort == "s" :
- num += self.nb_aux
- # Fin
- return num
- def build( self, liste_synapses, liste_poids, nb_in, nb_aux, nb_out = 1, debug = False ): # Jovian 7 mars 2017
- """
- Construit le réseau à partir d'une liste de synapses.
- Argument liste_synapses : Couple string list, liste de synapses.
- Argument liste_poids : liste des poids respectifs des synapses.
- Argument nb_in : entier nombre d'entrées.
- Argument nb_int : entier nombre d'intermédiaires.
- Argument nb_out : entier nombre de sortie(s).
- """
- # Annonce
- if debug : print("\n> Début de la procédure de construction du network.")
-
- # Ecrasement possible
- if self.total > 1 :
- if debug : print( "\n> Network déjà existant : écrasement." )
- self.tree = None
- self.poids = None
- self.total = 1
- self.nb_in = nb_in
- self.nb_aux = nb_aux
- self.nb_out = nb_out
- # Initialisation des attributs
- self.tree = [[] for k in range( nb_out + nb_aux ) ]
- self.poids = [ [ 0 for j in range( nb_aux + nb_out ) ] for i in range( nb_in + nb_aux ) ]
- # Balayage
- nb_synapses = len( liste_synapses )
-
- for k in range( nb_synapses ):
- # Déconstruction du synapse
- node_start = liste_synapses[k][0]
- node_end = liste_synapses[k][1]
- if debug :
- print( "> ", liste_synapses[k] )
- print("Traitement synapse de ", node_start, " à ", node_end )
-
- # Ajout dans l'arbre
- id_end = self.out_node_to_num( node_end )
- self.tree[id_end].append( node_start )
- # Ajout dans la matrice
- id_start = self.in_node_to_num( node_start )
- self.poids[ id_start ][ id_end ] = liste_poids[k]
- # Fin
- if debug :
- print( len( self.poids ) * len( self.poids[0] ), " cases dans la matrice poids." )
- print( nb_synapses, " poids enregistrés dans la matrice." )
- #print( "Matrice de poids :" )
- #for syn in self.poids :
- #print( syn )
- print( "\nListe des parents :" )
- for c in enumerate(self.tree) :
- # Tuple
- nb, parents = c
- # Annonce de la classe
- if nb == 0 :
- print("| Les parents des intermédiaires")
- elif nb == nb_aux :
- print("\n| Les parents des sorties")
- # Affichage parents
- print( parents )
- print("\n> Fin de la procédure de construction du network.\n")
- def getParents( self, index ): # Jovian 7 mars 2017
- """
- Retourne liste identifiants des parents.
- Argument index : noeud dont on veut connaître les parents.
- """
- identifiant = self.out_node_to_num( index )
- if identifiant == -1 :
- return []
- else :
- return self.tree[ identifiant ]
- def getPoids( self, nodeA, nodeB ): # Jovian 7 mars 2017
- """
- Retourne le poids du noeud A au noeud B.
- Argument nodeA : noeud A.
- Argument nodeB : noeud B.
- """
- identifiantA = self.in_node_to_num( nodeA )
- identifiantB = self.out_node_to_num( nodeB )
- return self.poids[ identifiantA ][ identifiantB ]
|