/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: UnifiedPopulation.java * Written by Team 4: Benedikt Mueller, Richard Fallert * * This code has been developed at the Karlsruhe Institute of Technology (KIT), Germany, * as part of the course "Multicore Programming in Practice: Tools, Models, and Languages". * Contact instructor: Dr. Victor Pankratius (pankratius@ipd.uka.de) * * Copyright (c) 2010 Sun Microsystems and Static Free Software * * Electric(tm) is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Electric(tm) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Electric(tm); see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, Mass 02111-1307, USA. */ package com.sun.electric.tool.placement.genetic2; import com.sun.electric.tool.placement.PlacementFrame.PlacementNetwork; import com.sun.electric.tool.placement.PlacementFrame.PlacementNode; import java.util.List; import java.util.Random; /** * Class for running a genetic algorithm in a separate thread. * Different selection methods are implemented here. */ public class UnifiedPopulation<I extends Individual> { private I[] indis; private Evolver[] evolvers; private Random rand; private long evolutionStepTime; double p; /** * Constructor of a population. * @param nodesToPlace * @param allNetworks * @param maxIndividuals The number of individuals. * @param evolutionSteps How many steps the evolve-function should iterate. * @param rand An exclusive random number generator, not to be used by other threads. */ UnifiedPopulation(List<PlacementNode> nodesToPlace, List<PlacementNetwork> allNetworks, I[] indis, long evoStepTime, int numThreads, Random rand) { evolutionStepTime = evoStepTime; this.rand = rand; this.indis = indis; evolvers = new Evolver[numThreads]; Random[] rands = new Random[numThreads]; int n = 0; for(int i = 0; i < numThreads; i++) { n+=rand.nextInt(); rands[i] = new Random(n); evolvers[i] = new Evolver(indis, evolutionStepTime, rands[i]); } } public int getSize() { return indis.length; } public void setProgress(double p) { this.p = p; indis[0].ref.setProgress(p); for(int i=0;i<indis.length;i++) { indis[i].setProgress(p); } } public long getEvolverSteps() { long steps = 0; for(Evolver e : evolvers) { steps += e.getSteps(); } return steps; } /** * Method to overwrite the genome of the individual at the end of the array * with an immigrant's genome. * @param immigrant The Individual to be inserted. */ public void insert(Individual immigrant) { indis[indis.length-1].copyFrom(immigrant); } public void reboot() { for(I i : indis) { i.reboot(rand); } } public void evolveLocalMT(int numThreads) { Thread[] threads = new Thread[numThreads]; for(int i = 0; i < numThreads; i++) { threads[i] = new Thread(evolvers[i]); threads[i].start(); } for(int i = 0; i < numThreads; i++) { try { threads[i].join(); } catch(InterruptedException e) { System.exit(-3333); } } } public void reEvaluateAll() { for(I i : indis) { i.evaluate(); } } /** * Method to find the best individual and return it * @return The best performing individual */ public Individual getChampion() { int pos = 0; int c = 0; double badness = indis[0].getBadness(); for(Individual i : indis) { if(i.getBadness() < badness) { pos = c; badness = i.getBadness(); } c++; } return indis[pos]; } public Individual getRandomOne() { return indis[rand.nextInt(indis.length)]; } public Individual getAt(int pos) { return indis[pos]; } }