Implementazione di un modello di progettazione di fabbrica per la selezione GA

1

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

    
posta JNMN 01.11.2017 - 20:50
fonte

1 risposta

0
Map<String, Selection> selectionMap = new HashMap<>();
selectionMap.put("RawFitnessSelction", new RawFitnessSelction());
selectionMap.put("RouletteWheelSelection", new RouletteWheelSelection());
selectionMap.put("TournamentSelection", new TournamentSelection());

AbstractSelectionFactory asf = new DOSInputSelectionFactory(
    selectionMap, 
    "Input choice of selection method: ");

class Client {
    AbstractSelectionFactory asf;
    Client (AbstractSelectionFactory asf) { 
        this.asf = asf;
    }

    public void select(Map<String, Double> population) {
        Selection selection = asf.chooseSelection();
        ...
    }

Una fabbrica astratta può essere passata a un cliente e chiamata tutte le volte che vuoi, o solo una volta. Fintanto che il Cliente non vede mai la fabbrica astratta costruita, non gli importa se stai ricevendo input dalla riga di comando, una GUI, un file, un database, Internet o qualsiasi altra cosa.

    
risposta data 04.11.2017 - 14:31
fonte

Leggi altre domande sui tag