1 10 package examples.multidimension; 11 12 import java.util.*; 13 import org.jgap.*; 14 import org.jgap.impl.*; 15 16 22 public class KnapsackFitnessFunction 23 extends FitnessFunction { 24 25 private final static String CVS_REVISION = "$Revision: 1.1 $"; 26 27 private final double m_knapsackVolume; 28 29 public static final double MAX_BOUND = 1000000000.0d; 30 31 private static final double ZERO_DIFFERENCE_FITNESS = Math.sqrt(MAX_BOUND); 32 33 public KnapsackFitnessFunction(double a_knapsackVolume) { 34 if (a_knapsackVolume < 1 || a_knapsackVolume >= MAX_BOUND) { 35 throw new IllegalArgumentException ( 36 "Knapsack volumen must be between 1 and " + MAX_BOUND + "."); 37 } 38 m_knapsackVolume = a_knapsackVolume; 39 } 40 41 53 public double evaluate(IChromosome a_subject) { 54 double totalVolume = getTotalVolume(a_subject); 65 int numberOfItems = getTotalNumberOfItems(a_subject); 66 double volumeDifference = Math.abs(m_knapsackVolume - totalVolume); 67 double fitness = 0.0d; 68 fitness += volumeDifferenceBonus(MAX_BOUND, volumeDifference); 79 fitness -= computeItemNumberPenalty(a_subject, MAX_BOUND, numberOfItems); 86 return Math.max(1.0d, fitness); 89 } 90 91 100 protected double volumeDifferenceBonus(double a_maxFitness, 101 double a_volumeDifference) { 102 if (a_volumeDifference == 0) { 103 return a_maxFitness; 104 } 105 else { 106 return a_maxFitness / 2 - (a_volumeDifference * a_volumeDifference); 109 } 110 } 111 112 124 protected double computeItemNumberPenalty(IChromosome a_potentialSolution, 125 double a_maxFitness, int a_items) { 126 if (a_items == 0) { 127 return 0; 130 } 131 else { 132 double penalty = (Math.min(a_maxFitness, a_items * a_items)); 137 HashSet colors = new HashSet(); 140 for (int i = 0; i < a_potentialSolution.size(); i++) { 141 CompositeGene comp = (CompositeGene)a_potentialSolution.getGene(i); 142 IntegerGene color = (IntegerGene)comp.geneAt(0); 143 colors.add(color.getAllele()); 144 } 145 int numColors = colors.size(); 146 penalty += Math.pow(numColors, 10); 147 return Math.min(a_maxFitness, penalty); 148 } 149 } 150 151 162 public static double getTotalVolume(IChromosome a_potentialSolution) { 163 double volume = 0.0d; 164 for (int i = 0; i < a_potentialSolution.size(); i++) { 165 CompositeGene comp = (CompositeGene)a_potentialSolution.getGene(i); 166 volume += getNumberOfItemsAtGene(comp) * KnapsackMain.itemVolumes[i]; 167 } 168 return volume; 169 } 170 171 182 public static int getNumberOfItemsAtGene(CompositeGene a_compositeGene) { 183 Integer numItems = 184 (Integer ) a_compositeGene.geneAt(1).getAllele(); 185 return numItems.intValue(); 186 } 187 188 198 public static int getTotalNumberOfItems(IChromosome a_potentialSolution) { 199 int totalItems = 0; 200 int numberOfGenes = a_potentialSolution.size(); 201 for (int i = 0; i < numberOfGenes; i++) { 202 CompositeGene comp = (CompositeGene)a_potentialSolution.getGene(i); 203 totalItems += getNumberOfItemsAtGene(comp); 204 } 205 return totalItems; 206 } 207 } 208 | Popular Tags |