Witam, zapraszam do przeglądu oraz oceny napisanej przeze mnie biblioteki
udostępniającej szereg interfejsów pozwających na łatwe użycie algorytmu
genetycznego oraz kilka implementacji popularnych operatorów genetycznych.
Bibioteka na chwilę obecną zawiera po jednej implementacji każdego
z operatorów genetycznych, tj:
- selekcja za pomocą koła ruletki,
- krzyżowanie wielopunktowe,
- mutacja za pomocą negacji.
Repozytorium: genetics
Przykład zastosowania:
var algorithm = GeneticAlgorithmImpl.<ChromosomeImpl, EvaluatedChromosomeImpl>builder()
.initializer(initializer)
.evaluator(evaluator)
.flow(
selector
.andThen(crossover)
.andThen(mutator)
.andThen(evaluator)
)
.build();
BasicStatistics statistics = algoirthm
.generations(100)
.collect(Statistics.collector(BasicStatistics::new));
Poniżej przykład rozwiązania problemu komiwojażera dla macierzy 9x9.
int[][] graph = {
{0, 1, 2, 1, 2, 3, 2, 3, 4},
{1, 0, 1, 2, 1, 2, 3, 2, 3},
{2, 1, 0, 3, 2, 1, 4, 3, 2},
{1, 2, 3, 0, 1, 2, 1, 2, 3},
{2, 1, 2, 1, 0, 1, 2, 1, 2},
{3, 2, 1, 2, 1, 0, 3, 2, 1},
{2, 3, 4, 1, 2, 3, 0, 1, 2},
{3, 2, 3, 2, 1, 2, 1, 0, 1},
{4, 3, 2, 3, 2, 1, 2, 1, 0}
}
Gen. Best Avg. Route (best)
1 -14.0 -17.64 0 -> 2 -> 1 -> 7 -> 4 -> 8 -> 5 -> 3 -> 6 -> 0
2 -14.0 -17.18 0 -> 4 -> 6 -> 7 -> 8 -> 2 -> 1 -> 5 -> 3 -> 0
3 -12.0 -16.82 0 -> 3 -> 4 -> 5 -> 8 -> 2 -> 1 -> 7 -> 6 -> 0
4 -10.0 -16.72 0 -> 3 -> 6 -> 7 -> 8 -> 4 -> 5 -> 2 -> 1 -> 0
5 -10.0 -16.26 0 -> 1 -> 2 -> 5 -> 8 -> 6 -> 7 -> 4 -> 3 -> 0
6 -10.0 -16.14 0 -> 1 -> 2 -> 5 -> 8 -> 6 -> 7 -> 4 -> 3 -> 0
7 -10.0 -15.92 0 -> 1 -> 2 -> 5 -> 8 -> 6 -> 7 -> 4 -> 3 -> 0
8 -10.0 -15.82 0 -> 1 -> 2 -> 5 -> 8 -> 6 -> 7 -> 4 -> 3 -> 0
9 -10.0 -15.54 0 -> 1 -> 2 -> 5 -> 8 -> 7 -> 6 -> 3 -> 4 -> 0
10 -10.0 -15.78 0 -> 3 -> 6 -> 7 -> 8 -> 5 -> 2 -> 4 -> 1 -> 0