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; }
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(); } }