[Python] Mi date una mano con le classi?

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

[Python] Mi date una mano con le classi?

Messaggioda TommyB1992 » venerdì 18 maggio 2018, 14:21

Sto scrivendo delle classi per le reti NEAT ma mi sono bloccato subito durante l'atrazione delle classi. :D

Allora partiamo dagli inizi. Di base mi servono almeno i pattern per:
1) L'algoritmo genetico
2) L'algoritmo per la rete neurale, che però vorrei far dipendere da tensorflow, quindi al massimo butto su la classe astratta e poi faccio l'estensione con le funzioni di tensorflow
3) Tutte le classi che sono tipicamente univoche delle reti NEAT (cormosomi -> dna -> genoma) e gestione della specie.


Partiamo dall'algoritmo genetico che tendenzialmente è formato:
1.1) Creazione popolazione tramite genoma
1.2) Computazione livello di fitness
1.3) Accoppiamento dei soggetti
1.4) mutazione genetica
1.5) uccisione vecchi o non performanti
1.6) ciclo while che gestisce i punti 4 finchè la computazione del livello di fitness non è quella che vogliamo

Il primo problema è che: in base al codice possono essere aggiunti o rimossi metodi, per dire potrebbero esistere casi nei quali non sono interessato a eseguire il punro 1.5 oppure casi nei quali ne voglio aggiungere uno "non standard".

Diciamo che più o meno ho pensato a questo:
1) Classe per la popolazione
2) Classe per l'engine, ovvero quello che tenga tutto il while dentro e dentro ci passo i metodi da eseguire
3) Una classe per il fitness alla quale passi solo il float del del livello di fitness e poi li gestisce.

Intanto sono fermo, qui:
population.py
Codice: Seleziona tutto
class Population(object):
    __slots__ = ('chromosome')

    def __init__(self, size, genome):
        self.chromosome = [genome() for _ in range(size)]

    def __iter__(self):
        return iter(self.chromosome)

    def __len__(self):
        return len(self.chromosome)

    def __getitem__(self, key):
        return self.chromosome[key]


if __name__ == "__main__":
    import string
    import random

    chars = string.ascii_lowercase
    charsLen = 5

    def test():
        return [random.choice(chars) for _ in range(charsLen)]

    popSize = 10
    p = Population(size=popSize, genome=test)
    for chromoId in range(len(p)):
        print("Individual #{}: {}".format(chromoId, p[chromoId]))


Ho fatto poco lo so, sick! :cry:

Grazie
TommyB1992
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 626
Iscrizione: luglio 2013
Desktop: GNU/Linux
Distribuzione: Ubuntu 15.04 (i686)
Sesso: Maschile

Re: [Python] Mi date una mano con le classi?

Messaggioda TommyB1992 » venerdì 18 maggio 2018, 14:50

Update: Per il GA engine ho pensato di fare così:

Codice: Seleziona tutto
import abc


class GABase(metaclass=abc.ABCMeta):
    __slots__ = ()

    @abc.abstractmethod
    def initPopulation(self):
        pass

    @abc.abstractmethod
    def fitnessEvaluation(self):
        pass

    @abc.abstractmethod
    def selection(self):
        pass

    @abc.abstractmethod
    def crossover(self):
        pass

    @abc.abstractmethod
    def mutation(self):
        pass

    def run(self):
        self.selection()
        self.crossover()
        self.mutation()

    def main(self):
        self.initPopulation()
        while not self.fitnessEvaluation():
            self.run()


if __name__ == "__main__":
    class GAStandard(GABase):
        fitnessCounter = 0

        def initPopulation(self):
            print("In initPopulation()")

        def fitnessEvaluation(self):
            print("In fitnessEvaluation()")
            if self.fitnessCounter < 4:
                self.fitnessCounter += 1
                return False
            else:
                return True

        def selection(self):
            print("In selection()")

        def crossover(self):
            print("In crossover()")

        def mutation(self):
            print("In mutation()")

    test = GAStandard().main()


In pratica definisco i metodi che ci sono in TUTTI i genetic algorithms, poi se uno ne vuole aggiungere di nuovi modifica il metodo "run"... è una buona idea?
TommyB1992
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 626
Iscrizione: luglio 2013
Desktop: GNU/Linux
Distribuzione: Ubuntu 15.04 (i686)
Sesso: Maschile


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 2 ospiti