Recentemente ho lavorato su diversi metodi di selezione dell'algoritmo genetico. Al momento ho una classe RawFitnessSelction, una classe RouletteWheelSelection e una classe TournamentSelection. Mi è stato chiesto di utilizzare un modello factory factory / abstract per scegliere i diversi metodi di selezione. Penso che andrò con un modello di fabbrica in quanto non comprendo pienamente i pattern astratti di fabbrica, ma mi chiedo come applicare il modello reale a qualcosa come i metodi di selezione GA?
public static Map<String, Double> rouletteSelect (Map<String, Double> population) {
//Create a List (ArrayList) called rouletteSelect of type
//Map<String, Double> and input values from our input Map.
List<Map.Entry<String,Double>> sorted = new ArrayList<>(population.entrySet());
//Use collections.sort to sort our "sorted" base on their values
Collections.sort(sorted, Comparator.comparing(Map.Entry::getValue));
//Initialize a HashSet
Set<Integer> usedIndices = new HashSet<>();
//Initialize our result Map<>, to store our selected individuals
Map<String, Double> result = new HashMap<>();
//we want to "select" half the individuals so while the size of our result
//is less than half, keep going
while (result.size() < sorted.size()/2) {
//pick a random int between 0 and the number of elements we have
int index = rnd.nextInt(sorted.size());
//if the element isn't in our set (a set can only contain one
//occurrence of value x) do what is after our if, else it increments
//our while loop (it's already in our set)
if(!usedIndices.add(index)) {
continue;
}
//create a new Map, which has the <key,vale> of corresponding
//index of "index" in sorted ArrayList
Map.Entry<String, Double> survivor =sorted.get(index);
//pur key and value from survivor into our result HashMap.
result.put(survivor.getKey(), survivor.getValue());
}
return result;
}
Ecco la struttura di base dei miei metodi di selezione. Solo un metodo di base memorizzato all'interno di una classe. Sarebbe gradito qualsiasi aiuto su come implementare il modello di fabbrica con questi tipi di metodi.
Nota: so quale sarà il mio vero file factory.java come se fosse più simile alla classe Selection.java abstact e alla sottoclasse RouletteWheel.java. Grazie