Domanda

Ho cercato alcuni buoni esempi di programmazione genetica per C#.Qualcuno conosce buone risorse online/libri?Mi chiedo se esiste una libreria C# disponibile per la programmazione evolutiva/genetica?

È stato utile?

Soluzione

Dopo aver sviluppato la mia applicazione didattica di programmazione genetica , ho trovato una completa Framework di programmazione genetica chiamato AForge.NET Genetics . Fa parte della libreria Aforge.NET . È concesso in licenza sotto LGPL.

Altri suggerimenti

Lo scorso anno MSDN ha pubblicato un articolo sulla programmazione genetica: Algoritmi genetici: sopravvivenza del Compatibile con Windows Form

Vorrei raccomandare di non generare effettivamente assembly a meno che non sia assolutamente necessario, in particolare se si sta appena iniziando a implementare l'algoritmo genetico.

L'algoritmo genetico è più semplice da implementare quando la lingua di destinazione è funzionale e tipizzata in modo dinamico. Questo è generalmente il motivo per cui la maggior parte della ricerca sugli algoritmi genetici è scritta in LISP. Di conseguenza, se lo implementerai in C #, probabilmente stai meglio definendo il tuo mini "linguaggio degli alberi", avendo l'algoritmo che genera alberi e semplicemente interpretando gli alberi quando arriva il momento di eseguire ogni iterazione del algoritmo.

Ho fatto un progetto come questo quando ero al college (un'implementazione dell'algoritmo genetico in C #), e quello era l'approccio che ho adottato.

Farlo in questo modo ti darà il vantaggio di avere solo 1 rappresentazione con cui lavorare (la rappresentazione AST) che è perfettamente adatta sia per l'esecuzione che per l'algoritmo genetico "riproduzione". passi.

In alternativa, se provi a generare assiemi probabilmente finirai per aggiungere una grande quantità di complessità non necessaria all'app. Attualmente, il CLR non consente di scaricare un assembly da un dominio dell'app a meno che l'intero dominio dell'app non venga distrutto. Ciò significherebbe che sarà necessario creare un dominio app separato per ciascun programma generato in ogni iterazione dell'algoritmo per evitare di introdurre una perdita di memoria gigante nella tua app. In generale, l'intera cosa aggiungerebbe solo un sacco di irritazione extra.

Le AST interpretate, d'altra parte, sono spazzatura da collezionare proprio come qualsiasi altro oggetto, quindi non avresti bisogno di muoverti con più domini di app. Se, per motivi di prestazioni, si desidera codificare il risultato finale, è possibile aggiungere supporto in seguito. Tuttavia, ti consiglierei di farlo utilizzando DynamicMethod classe. Ti consentirà di convertire un AST in un delegato compilato in modo dinamico in fase di esecuzione. Ciò consentirà di distribuire una singola DLL mantenendo le cose di generazione del codice il più semplice possibile. Inoltre, le istanze di DynamicMethod sono spazzatura da raccogliere, quindi potresti finire per impiegarle come parte dell'algoritmo genetico per accelerare le cose anche lì.

Potresti essere in grado di implementare la programmazione genetica usando gli alberi delle espressioni LINQ: è più probabile che generi qualcosa di utilizzabile rispetto alla generazione IL casuale.

Ho visto una buona discussione ad alto livello su Channel9 di Mike Swanson a http://channel9.msdn.com/posts/Charles/Algorithms-and-Data-Structures-Mike-Swanson-Genetic-Session-Scheduler/

Intendi la vera programmazione genetica, al contrario degli algoritmi genetici in generale?

In tal caso, C # /. net non è la lingua migliore per questo. LISP, ad esempio, è sempre stato un pilastro del GP.

Tuttavia, se è necessario, probabilmente vorrai generare dinamicamente CIL / MSIL. Puoi farlo utilizzando System.Reflection.Emit , tuttavia consiglierei Mono.Cecil . Manca di buoni documenti (come se la riflessione li emettesse) .. Ma offre emissioni e riflessioni di assemblaggio molto migliori.

Un altro problema è che non è banale caricare il codice e successivamente eliminarlo nel framework .net. Almeno, non è possibile scaricare gli assembly. Puoi scaricare gli appdomain, ma l'intera attività di caricare il codice in un appdomain separato e chiamarlo esternamente può diventare piuttosto confusa. Le cose System.Addin di .NET 3.5 dovrebbero rendere tutto più semplice.

Se sei interessato agli algoritmi genetici o all'ottimizzazione euristica in generale, potresti dare un'occhiata a HeuristicLab . È stato sviluppato per diversi anni, 1,5 anni da quando abbiamo rilasciato la nuova versione. È programmato in C # 4 e ha una bella interfaccia grafica. Esistono già molti algoritmi come algoritmo genetico, programmazione genetica, strategia di evoluzione, ricerca locale, ricerca tabu, ottimizzazione dello sciame di particelle, ricottura simulata e altro ancora. Ci sono anche diversi problemi implementati come un problema di routing del veicolo, commesso viaggiatore, ottimizzazione delle funzioni reali, zaino, problema di assegnazione quadratica, classificazione, regressione e molti altri. Esistono anche tutorial e abbiamo buffer di protocollo integrati in modo da poter comunicare con programmi esterni per la valutazione della soluzione. È concesso in licenza sotto GPL. Nel 2009 il software ha ricevuto il premio per l'innovazione Microsoft da Microsoft Austria.

Abbiamo anche scritto un libro sull'argomento: Algoritmi genetici e programmazione genetica .

Ho un prodotto gratuito che può aiutare. The Genetic Algorithm Framework .Net 4.0 è un singolo assembly .Net 4.0 con alcuni articoli di supporto.

Sto leggendo Una guida sul campo alla programmazione genetica in questo momento (PDF gratuito Scaricare). È disponibile anche come libro in brossura. Disconosce l'uso di una libreria scritta in Java chiamata TinyGP . Potresti ottenere qualche chilometraggio da quello. Non ho iniziato a fare alcuna vera programmazione ma spero di applicare alcuni dei concetti in C #.

Ho assegnato ECJ a C # .NET 4.0 se sei interessato a un framework di calcolo evolutivo completo. Il pacchetto include tutto, dal progetto Java ECJ originale, inclusi tutti i campioni funzionanti.

Ho anche scritto 500 unit test per verificare molti aspetti della conversione. Ma sono necessari molti altri test. In particolare, gli aspetti di calcolo distribuito non sono completamente testati. Questo perché ho intenzione di passare dal semplice utilizzo di socket della ECJ a una strategia più solida utilizzando WCF e WF. Rielaborerò anche il framework per utilizzare TPL (Task Parallel Library).

In ogni caso, puoi scaricare la conversione iniziale qui:

http://branecloud.codeplex.com

Sono anche in procinto di convertire molti altri framework da Java a .NET che riguardano "l'intelligenza sintetica". ricerca (quando trovo il tempo).

Ben

Puoi provare GeneticSharp .

Ha tutte le classiche operazioni GA, come selezione, crossover, mutazione, reinserimento e terminazione.

È molto estensibile, è possibile definire i propri cromosomi, la funzione di fitness, la strategia di generazione della popolazione e tutte le operazioni citate sopra.

Può essere utilizzato in molti tipi di app, come le librerie C # e i giochi Unity 3D, ci sono esempi che lo eseguono in un GTK # app e Unity 3D dama gioco .

Funziona anche in Win e OSX.

Ecco un esempio di base su come utilizzare la libreria:

var selection = new EliteSelection();
var crossover = new OrderedCrossover();
var mutation = new ReverseSequenceMutation();
var fitness = new YourFitnessFunction();
var chromosome = new YourChromosome();
var population = new Population (50, 70, chromosome);

var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);

ga.Start();

The Manning book: " Metaprogrammazione in .NET " dedica un'ampia sezione al GP tramite gli alberi delle espressioni.

Mantengo un porto di ECJ in C #. È fantastico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top