public GenotipoRN mutazioneAggiungiAssone(GenotipoRN genotipo)
        {
            GenotipoRN g = new GenotipoRN(genotipo);
            Random generatoreCasuale = new Random();
            bool esiste = false;

            int neurone1;
            int neurone2;

            int indice = genotipo.neuroni.Count;

            /* ho impedito la possibilità di creare assoni che hanno come sorgente un nodo di output o come destinazione un nodo di input
             * perché oltre a dare problemi di visualizzazione mi sembra abbiano poco senso: credo che i neuroni di input debbano semplicemente
             * riportare gli input alla rete (secondo me senza farci nessuna elaborazione però si può consentire che il neurone di input abbia una
             * funzione di soglia disabilitando Params.transparentInput) così come i neuroni di output debbano solo portare le uscite agli attuatori.
             */
            do
                neurone1 = genotipo.neuroni.Keys[generatoreCasuale.Next(indice)];
            while (genotipo.neuroni[neurone1].tipo == TipoNeurone.NActuator);
            do
                neurone2=genotipo.neuroni.Keys[generatoreCasuale.Next(indice)];
            while (genotipo.neuroni[neurone2].tipo == TipoNeurone.NSensor);

            for (int i = 0; i < g.numeroAssoni; i++)
                /* io annullerei la possibilità di raddoppio perché trasformerebbe una mutazione del tipo "aggiungi assone" in una "modifica peso"
                 * anche se occorrerebbe gestire in qualche modo il caso in cui si vorrebbe creare un assone già esistente. Continuando a generare a caso
                 * input e output finché non si trovano due neuroni ancora non collegati si rischia infatti o di metterci molto tempo o peggio di entrare
                 * in un ciclo infinito se tutti i collegamenti fossero già stabiliti, situazioni non impossibili con pochi neuroni.
                 */
                if (g.assoni[i].testaCollegamento(neurone1, neurone2))
                {
                    GenotipoRN.AssoneG assone = g.assoni[g.assoni.Keys[i]];
                    assone.raddoppia();
                    g.assoni[g.assoni.Keys[i]] = assone;
                    esiste = true;
                    Console.WriteLine("Raddoppio " + neurone1 + " - " + neurone2);
                    break;
                }

            if (!esiste)
            {
                g.addAssone(new GenotipoRN.AssoneG(contAssoni, neurone1, neurone2, generatoreCasuale.NextDouble()));
                contAssoni++;
            }

            return g;
        }
        public GenotipoRN mutazioneAggiungiNeurone(GenotipoRN genotipo)
        {
            GenotipoRN g = new GenotipoRN(genotipo);
            Random generatoreCasuale = new Random();

            int num = generatoreCasuale.Next(g.assoni.Count);

            GenotipoRN.AssoneG assoneCorrente = g.assoni[g.assoni.Keys[num]];
            assoneCorrente.attivo = false;
            g.assoni[g.assoni.Keys[num]] = assoneCorrente;

            g.addNeurone(new GenotipoRN.NeuroneG(contNeuroni, TipoNeurone.NHide));
            g.addAssone(new GenotipoRN.AssoneG(contAssoni, g.assoni[g.assoni.Keys[num]].input, contNeuroni, 1));
            contAssoni++;
            g.addAssone(new GenotipoRN.AssoneG(contAssoni, contNeuroni, g.assoni[g.assoni.Keys[num]].output, g.assoni[g.assoni.Keys[num]].peso));
            contAssoni++;
            contNeuroni++;
            return g;
        }
        private GenotipoRN generaPerceptron(int input, int output)
        {
            Random generatoreCasuale = new Random();
            GenotipoRN p = new GenotipoRN();
            p.t = 0;

            for (int i = 0; i < input; i++)
                p.addNeuroneInput(new GenotipoRN.NeuroneG(contNeuroni++, TipoNeurone.NSensor));

            for (int i = 0; i < output; i++)
                p.addNeuroneOutput(new GenotipoRN.NeuroneG(contNeuroni++, TipoNeurone.NActuator));

            for(int i = 0; i < input; i++)
                for (int j = 0; j < output; j++)
                {
                    double peso = generatoreCasuale.NextDouble();
                    p.addAssone(new GenotipoRN.AssoneG(contAssoni, i, j+input, 1 - 2 * peso));
                    contAssoni++;
                }

            genotipi.Add(p);
            return p;
        }
예제 #4
0
        static void Main(string[] args)
        {
            GenotipoRN gen1, gen2;
            GestoreRN_NEAT gestore = new GestoreRN_NEAT(3, 2);
            ClientNEAT client;

            gen1 = new GenotipoRN();
            gen1.addNeuroneInput(new GenotipoRN.NeuroneG(1, TipoNeurone.NSensor));
            gen1.addNeuroneInput(new GenotipoRN.NeuroneG(2, TipoNeurone.NSensor));
            gen1.addNeuroneInput(new GenotipoRN.NeuroneG(3, TipoNeurone.NSensor));
            gen1.addNeuroneOutput(new GenotipoRN.NeuroneG(4, TipoNeurone.NActuator));
            gen1.addNeuroneOutput(new GenotipoRN.NeuroneG(5, TipoNeurone.NActuator));
            gen1.addNeurone(new GenotipoRN.NeuroneG(6, TipoNeurone.NHide));
            gen1.addAssone(new GenotipoRN.AssoneG(1, 1, 4, 1));
            gen1.addAssone(new GenotipoRN.AssoneG(2, 2, 6, 1));
            gen1.addAssone(new GenotipoRN.AssoneG(3, 6, 4, 1));
            gen1.addAssone(new GenotipoRN.AssoneG(4, 2, 5, 1));
            gen1.addAssone(new GenotipoRN.AssoneG(5, 3, 5, 1));

            gen2 = new GenotipoRN();
            gen2.addNeuroneInput(new GenotipoRN.NeuroneG(1, TipoNeurone.NSensor));
            gen2.addNeuroneInput(new GenotipoRN.NeuroneG(2, TipoNeurone.NSensor));
            gen2.addNeuroneInput(new GenotipoRN.NeuroneG(3, TipoNeurone.NSensor));
            gen2.addNeuroneOutput(new GenotipoRN.NeuroneG(4, TipoNeurone.NActuator));
            gen2.addNeuroneOutput(new GenotipoRN.NeuroneG(5, TipoNeurone.NActuator));
            gen2.addNeurone(new GenotipoRN.NeuroneG(7, TipoNeurone.NHide));
            gen2.addNeurone(new GenotipoRN.NeuroneG(6, TipoNeurone.NHide));
            gen2.addAssone(new GenotipoRN.AssoneG(1, 1, 4, -1));
            gen2.addAssone(new GenotipoRN.AssoneG(2, 2, 6, -1));
            gen2.addAssone(new GenotipoRN.AssoneG(4, 2, 5, -1));
            gen2.addAssone(new GenotipoRN.AssoneG(5, 3, 5, -1));
            gen2.addAssone(new GenotipoRN.AssoneG(6, 3, 7, -1));
            gen2.addAssone(new GenotipoRN.AssoneG(7, 6, 5, -1));
            gen2.addAssone(new GenotipoRN.AssoneG(8, 7, 5, -1));

            //GenotipoRN gen_tmp1 = gestore.getPerceptron();
            //gen1 = gestore.mutazioneAggiungiNeurone(gen_tmp1);
            //GenotipoRN gen_tmp2 = gestore.mutazioneAggiungiNeurone(gen_tmp1);
            //GenotipoRN gen_tmp3 = gestore.mutazioneModificaPesoUniformemente(gen_tmp2);
            //gen2 = gestore.mutazioneAggiungiNeurone(gen_tmp3);

            double d = AlgGenRN.distanza(gen1, gen2);
            GenotipoRN gen3 = new GenotipoRN(gen1, 1, gen2, 2);

            client = new ClientNEAT("127.0.0.1", 13001);
            if (client.connect())
            {
                client.writeConsole("Client connesso\n");
                client.writeConsole("Premi un tasto per inviare il genitore 1");
                Console.ReadKey();
                client.send("IRN");
                gen1.sendNetwork(client.getStream());
                client.receive();
                client.writeConsole("Premi un tasto per inviare il genitore 2");
                Console.ReadKey();
                client.send("IRN");
                gen2.sendNetwork(client.getStream());
                client.receive();
                Console.WriteLine("Distanza tra le reti: " + AlgGenRN.distanza(gen1, gen2));
                client.writeConsole("Premi un tasto per inviare il figlio");
                Console.ReadKey();
                client.send("IRN");
                gen3.sendNetwork(client.getStream());
                client.receive();
                client.writeConsole("Premi un tasto per uscire");
                Console.ReadKey();
                client.disconnect();
            }
            else
            {
                client.writeConsole("Errore di connessione\n");
                Console.ReadKey();
            }
        }