/* This file is part of Eternity II Editor. * * fuck yeah seaking */ package org.alcibiade.eternity.editor.solver.genetic; import java.util.ArrayList; import org.alcibiade.eternity.editor.model.GridModel; import org.alcibiade.eternity.editor.model.QuadModel; import org.alcibiade.eternity.editor.solver.ClusterManager; import org.alcibiade.eternity.editor.solver.EternitySolver; public abstract class GeneticSolver extends EternitySolver { protected GridModel problemGrid; protected GridModel solutionGrid; protected final GridModel originalGrid; protected ArrayList<GridModel> population; protected long iterations; public GeneticSolver(GridModel grid, GridModel solutionGrid, ClusterManager clusterManager, int populationSize) { super(clusterManager); this.problemGrid = grid; this.solutionGrid = solutionGrid; problemGrid.copyTo(solutionGrid); this.originalGrid = grid.clone(); originalGrid.setReadOnly(true); this.population = new ArrayList<GridModel>(); populate(populationSize, grid); } private void populate(int populationSize, GridModel theGrid) { while (population.size() < populationSize) { GridModel somegrid = theGrid.clone(); somegrid.shuffle(); population.add(somegrid); } } /** * returns the fitness of a grid (0..1) */ public static float fitness(GridModel grid) { float connections = grid.countConnections() + grid.borderlineConnections() ; float pairs = grid.countPairs() + grid.borderlinePairs(); float fitness = pairs / connections; assert (fitness >= 0) && (fitness <= 1); return fitness; } /*public static float fitness(GridModel grid) { float middleWeight = 0.5f; float borderWeight = 0.2f; float cornerWeight = 0.3f; float middle = grid.countPairs() / grid.countConnections(); float corner = grid.cornerPairs() / grid.cornerConnections(); float border = grid.borderPairs() / grid.borderConnections(); float fitness = middleWeight * middle + borderWeight * border + cornerWeight * corner; assert (fitness >= 0) && (fitness <= 1); return fitness; }*/ public void enhanceSolution(GridModel grid) { for(int i = 0; i < grid.getPositions(); i++) { if(grid.getTestScore(i) < 4) grid.optimizeQuadRotation(i); } } @Override public long getIterations() { return iterations; } }