From c84b1486b196f6c960b928c654207762e4831c35 Mon Sep 17 00:00:00 2001 From: Michael de Paly Date: Thu, 19 Nov 2009 03:11:47 +0000 Subject: [PATCH] --- ...ractMultiObjectiveOptimizationProblem.java | 38 ++++++++++++++++-- .../problems/AbstractOptimizationProblem.java | 39 ++++++++++++++++--- 2 files changed, 67 insertions(+), 10 deletions(-) diff --git a/src/eva2/server/go/problems/AbstractMultiObjectiveOptimizationProblem.java b/src/eva2/server/go/problems/AbstractMultiObjectiveOptimizationProblem.java index bbb7fb02..385c2e2b 100644 --- a/src/eva2/server/go/problems/AbstractMultiObjectiveOptimizationProblem.java +++ b/src/eva2/server/go/problems/AbstractMultiObjectiveOptimizationProblem.java @@ -3,6 +3,9 @@ package eva2.server.go.problems; import java.awt.Color; import java.util.ArrayList; import java.util.Vector; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; import javax.swing.JFrame; @@ -31,23 +34,27 @@ import eva2.tools.chart2d.DPoint; */ public abstract class AbstractMultiObjectiveOptimizationProblem extends AbstractOptimizationProblem { + class MultiObjectiveEvalThread extends Thread{ AbstractMultiObjectiveOptimizationProblem prob; AbstractEAIndividual ind; Vector resultrep; Population pop; + Semaphore m_Semaphore=null; - public MultiObjectiveEvalThread(AbstractMultiObjectiveOptimizationProblem prob,AbstractEAIndividual ind,Vector resultrep, Population pop) { + public MultiObjectiveEvalThread(AbstractMultiObjectiveOptimizationProblem prob,AbstractEAIndividual ind,Vector resultrep, Population pop,Semaphore sema) { this.ind = ind; this.prob = prob; this.resultrep = resultrep; this.pop = pop; + this.m_Semaphore=sema; } public void run() { double[] fitness; prob.evaluate(ind); resultrep.add(ind); + fitness = ind.getFitness(); // check and update border if necessary @@ -68,6 +75,7 @@ public abstract class AbstractMultiObjectiveOptimizationProblem extends Abstract prob.m_Border[j][1] = Math.max(prob.m_Border[j][1], fitness[j]); } pop.incrFunctionCalls(); + m_Semaphore.release(); } } @@ -189,20 +197,42 @@ public abstract class AbstractMultiObjectiveOptimizationProblem extends Abstract Vector queue = new Vector(); Vector finished = new Vector(); queue.addAll(population); - + /* Semaphore available=new Semaphore(parallelthreads); while (finished.size() < population.size()) { + try { + available.acquire(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } if ((population.size()-(queue.size() + finished.size())) < parallelthreads) { if (queue.size() > 0) { AbstractEAIndividual tmpindy = queue.get(0); queue.remove(0); tmpindy.resetConstraintViolation(); - MultiObjectiveEvalThread evalthread = new MultiObjectiveEvalThread(this,tmpindy,finished,population); + MultiObjectiveEvalThread evalthread = new MultiObjectiveEvalThread(this,tmpindy,finished,population,available); evalthread.start(); } } } - + */ + Semaphore sema=new Semaphore(0); + ExecutorService pool = Executors.newFixedThreadPool(parallelthreads); + for (int i = 0; i < population.size(); i++){ + AbstractEAIndividual tmpindy = (AbstractEAIndividual)population.get(i); + tmpindy.resetConstraintViolation(); + EvalThread evalthread = new EvalThread(this,tmpindy,finished,population,sema); + pool.execute(evalthread); + + } + try { + sema.acquire(population.size()); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + pool.shutdownNow(); }else { // first evaluate the population for (int i = 0; i < population.size(); i++) { diff --git a/src/eva2/server/go/problems/AbstractOptimizationProblem.java b/src/eva2/server/go/problems/AbstractOptimizationProblem.java index 69bb1c08..372536ef 100644 --- a/src/eva2/server/go/problems/AbstractOptimizationProblem.java +++ b/src/eva2/server/go/problems/AbstractOptimizationProblem.java @@ -2,6 +2,9 @@ package eva2.server.go.problems; import java.awt.BorderLayout; import java.util.Vector; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; import java.io.Serializable; @@ -41,12 +44,14 @@ public abstract class AbstractOptimizationProblem implements InterfaceOptimizati AbstractEAIndividual ind; Vector resultrep; Population pop; + Semaphore m_Semaphore; - public EvalThread(AbstractOptimizationProblem prob, AbstractEAIndividual ind, Vector resultrep, Population pop) { + public EvalThread(AbstractOptimizationProblem prob, AbstractEAIndividual ind, Vector resultrep, Population pop,Semaphore sema) { this.ind = ind; this.prob = prob; this.resultrep = resultrep; this.pop = pop; + this.m_Semaphore=sema; } public void run() { @@ -55,6 +60,7 @@ public abstract class AbstractOptimizationProblem implements InterfaceOptimizati prob.evaluate(ind); resultrep.add(ind); pop.incrFunctionCalls(); + m_Semaphore.release(); // long duration=System.nanoTime()-time; // System.out.println("Finished ET" + this + ", time was " + duration); } @@ -105,21 +111,42 @@ public abstract class AbstractOptimizationProblem implements InterfaceOptimizati if (this.parallelthreads > 1) { Vector queue = new Vector(population.size()); Vector finished = new Vector(population.size()); - queue.addAll(population); - + /* queue.addAll(population); + Semaphore sema=new Semaphore(parallelthreads); while (finished.size() < population.size()) { + try { + sema.acquire(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } if ((population.size()-(queue.size() + finished.size())) < parallelthreads) { if (queue.size() > 0) { AbstractEAIndividual tmpindy = queue.get(0); queue.remove(0); tmpindy.resetConstraintViolation(); - EvalThread evalthread = new EvalThread(this,tmpindy,finished,population); + EvalThread evalthread = new EvalThread(this,tmpindy,finished,population,sema); evalthread.start(); - + } } + }*/ + Semaphore sema=new Semaphore(0); + ExecutorService pool = Executors.newFixedThreadPool(parallelthreads); + for (int i = 0; i < population.size(); i++){ + AbstractEAIndividual tmpindy = (AbstractEAIndividual)population.get(i); + tmpindy.resetConstraintViolation(); + EvalThread evalthread = new EvalThread(this,tmpindy,finished,population,sema); + pool.execute(evalthread); + } - + try { + sema.acquire(population.size()); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + pool.shutdownNow(); } else { for (int i = 0; i < population.size(); i++) {