Biblioteka algorytmów genetycznych

2

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	
2

Kod wygląda czysto (można by się czepiać drobiazgów, np. dobrą praktyką jest oznaczanie pól jako final, jeśli nie są mutowalne).

Musiałbym jednak być pod ścianą, żeby zdecydować się na użycie biblioteki, która nie ma żadnych testów jednostkowych. To poważna tzw. czerwona flaga.

1
V-2 napisał(a):

Kod wygląda czysto (można by się czepiać drobiazgów, np. dobrą praktyką jest oznaczanie pól jako final, jeśli nie są mutowalne).

Musiałbym jednak być pod ścianą, żeby zdecydować się na użycie biblioteki, która nie ma żadnych testów jednostkowych. To poważna tzw. czerwona flaga.

Dziękuję za przejrzenie kodu i opinię. Co do testów to obecna wersja kodu jest przepisaną wersją części mojej pracy inżynierskiej, która była przetestowania, ale oczywiście masz rację, dziękuję za uwagę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1