Updating the lens viewer

This commit is contained in:
Marcel Kronfeld 2011-05-04 11:22:09 +00:00
parent 893a742b21
commit 4f245074cd

View File

@ -28,28 +28,36 @@ import eva2.server.go.strategies.InterfaceOptimizer;
import eva2.server.modules.GOParameters; import eva2.server.modules.GOParameters;
import eva2.tools.math.RNG; import eva2.tools.math.RNG;
class MyLensViewer extends JPanel { class MyLensViewer extends JPanel implements InterfaceSolutionViewer {
/** /**
* *
*/ */
private static final long serialVersionUID = 7945150208043416139L; private static final long serialVersionUID = 7945150208043416139L;
private double[] m_BestVariables; Population indiesToPaint=new Population();
private double m_BestFitness; // private double[] m_BestVariables;
// private double m_BestFitness;
private int m_Height, m_Width; private int m_Height, m_Width;
FLensProblem m_LensProblem; FLensProblem m_LensProblem;
public MyLensViewer (FLensProblem f) { public MyLensViewer (FLensProblem f) {
this.m_LensProblem = f; initView(f);
Dimension d = new Dimension (280, 220); Dimension d = new Dimension (280, 220);
this.setPreferredSize(d); this.setPreferredSize(d);
this.setMinimumSize(d); this.setMinimumSize(d);
resetBest(); resetView();
} }
public void resetBest() { public void initView(AbstractOptimizationProblem prob) {
this.m_BestFitness = Double.POSITIVE_INFINITY; this.m_LensProblem = (FLensProblem)prob;
this.m_BestVariables = new double[10]; }
public void resetView() {
// this.m_BestFitness = Double.POSITIVE_INFINITY;
// this.m_BestVariables = new double[10];
ESIndividualDoubleData dummy = new ESIndividualDoubleData();
dummy.SetFitness(new double[]{Double.POSITIVE_INFINITY});
indiesToPaint = new Population();
} }
public void paint(Graphics g) { public void paint(Graphics g) {
@ -106,52 +114,84 @@ class MyLensViewer extends JPanel {
g2D.drawLine(centerLens, this.m_Height/2+(int)this.m_LensProblem.m_Radius*10, centerLens, this.m_Height/2 -(int)this.m_LensProblem.m_Radius*10); g2D.drawLine(centerLens, this.m_Height/2+(int)this.m_LensProblem.m_Radius*10, centerLens, this.m_Height/2 -(int)this.m_LensProblem.m_Radius*10);
g2D.drawLine(centerScreen, this.m_Height/2+(int)this.m_LensProblem.m_Radius*10+10, centerScreen, this.m_Height/2 -(int)this.m_LensProblem.m_Radius*10-10); g2D.drawLine(centerScreen, this.m_Height/2+(int)this.m_LensProblem.m_Radius*10+10, centerScreen, this.m_Height/2 -(int)this.m_LensProblem.m_Radius*10-10);
g2D.setStroke(ds); g2D.setStroke(ds);
// System.out.println("indies to paint: " + indiesToPaint.size());
paintLens(m_LensProblem.m_ProblemDimension, m_Height, m_LensProblem.m_Radius, mag, centerLens, centerScreen, segment, g2D);
// Now put everything on the screen
g.drawImage(bufferedImage, 0, 0, this);
}
private void paintLens(int dim, int height, double radius, int mag, int centerLens, int centerScreen, int segment, Graphics2D g2D) {
for (int i=0; i<indiesToPaint.size(); i++) {
AbstractEAIndividual indy = indiesToPaint.getEAIndividual(i);
paintLens(indy.getDoublePosition(), m_LensProblem.testLens(indy.getDoublePosition()), indy.getFitness(0), dim, height, radius, mag, centerLens, centerScreen, segment, g2D);
}
}
private void paintLens(AbstractEAIndividual indy, int dim, int height, double radius, int mag, int centerLens, int centerScreen, int segment, Graphics2D g2D) {
if (indy!=null) paintLens(indy.getDoublePosition(), m_LensProblem.testLens(indy.getDoublePosition()), indy.getFitness(0), dim, height, radius, mag, centerLens, centerScreen, segment, g2D);
}
private static void paintLens(double[] variables, double[] dots, double fit, int dim, int height, double radius, int mag, int centerLens, int centerScreen,
int segment, Graphics2D g2D) {
// top and bottom line // top and bottom line
g2D.drawLine(centerLens-(int)(this.m_BestVariables[0]*mag), this.m_Height/2-(int)this.m_LensProblem.m_Radius*10, centerLens+(int)(this.m_BestVariables[0]*mag), this.m_Height/2 -(int)this.m_LensProblem.m_Radius*10); g2D.drawLine(centerLens-(int)(variables[0]*mag), height/2-(int)radius*10, centerLens+(int)(variables[0]*mag), height/2 -(int)radius*10);
g2D.drawLine(centerLens-(int)(this.m_BestVariables[this.m_LensProblem.m_ProblemDimension-1]*mag), this.m_Height/2+(int)this.m_LensProblem.m_Radius*10, centerLens+(int)(this.m_BestVariables[this.m_LensProblem.m_ProblemDimension-1]*mag), this.m_Height/2 +(int)this.m_LensProblem.m_Radius*10); g2D.drawLine(centerLens-(int)(variables[dim-1]*mag), height/2+(int)radius*10, centerLens+(int)(variables[dim-1]*mag), height/2 +(int)radius*10);
// plot the fitness result // plot the fitness result
g2D.drawString("Fitness : "+ this.m_BestFitness, 5, 15); g2D.drawString("Fitness : "+ fit, (int) (variables[0]*mag), 15);
int currentXPos = this.m_Height/2-(int)this.m_LensProblem.m_Radius*10; int currentXPos = height/2-(int)radius*10;
double[] dots = this.m_LensProblem.testLens(this.m_BestVariables); for (int i = 1; i < variables.length; i++) {
for (int i = 1; i < this.m_BestVariables.length; i++) { ///System.out.println("X"+i+": " + variables[i]);
///System.out.println("X"+i+": " + this.m_BestVariables[i]);
// draw the line from the least one to the current on and use 10 as magnifier // draw the line from the least one to the current on and use 10 as magnifier
g2D.setPaint(Color.black); g2D.setPaint(Color.black);
g2D.drawLine(centerLens-(int)(this.m_BestVariables[i-1]*mag), currentXPos, centerLens-(int)(this.m_BestVariables[i]*mag), currentXPos+segment); g2D.drawLine(centerLens-(int)(variables[i-1]*mag), currentXPos, centerLens-(int)(variables[i]*mag), currentXPos+segment);
g2D.drawLine(centerLens+(int)(this.m_BestVariables[i-1]*mag), currentXPos, centerLens+(int)(this.m_BestVariables[i]*mag), currentXPos+segment); g2D.drawLine(centerLens+(int)(variables[i-1]*mag), currentXPos, centerLens+(int)(variables[i]*mag), currentXPos+segment);
// paint the light rays // paint the light rays
g2D.setPaint(Color.red); g2D.setPaint(Color.red);
g2D.drawLine(0, currentXPos + segment/2, centerLens, currentXPos + segment/2); g2D.drawLine(0, currentXPos + segment/2, centerLens, currentXPos + segment/2);
g2D.drawLine(centerLens, currentXPos + segment/2, centerScreen, this.m_Height/2 +(int)(dots[i-1]*mag)); g2D.drawLine(centerLens, currentXPos + segment/2, centerScreen, height/2 +(int)(dots[i-1]*mag));
currentXPos += segment; currentXPos += segment;
// tmpShape = new Rectangle(currentPos-width/2, this.m_Height/2, width, (int)(this.m_BestVariables[i]*10)); // tmpShape = new Rectangle(currentPos-width/2, this.m_Height/2, width, (int)(variables[i]*10));
// g2D.setPaint(Color.red); // g2D.setPaint(Color.red);
// g2D.fill(tmpShape); // g2D.fill(tmpShape);
// g2D.setPaint(Color.black); // g2D.setPaint(Color.black);
// g2D.draw(tmpShape); // g2D.draw(tmpShape);
// g2D.drawLine(currentPos, this.m_Height/2+5, currentPos, this.m_Height/2-5); // g2D.drawLine(currentPos, this.m_Height/2+5, currentPos, this.m_Height/2-5);
} }
// Now put everything on the screen }
g.drawImage(bufferedImage, 0, 0, this);
}
/** This method updates the painted stuff /** This method updates the painted stuff
* @param pop The population to use * @param pop The population to use
*/ */
public void update(Population pop) { public void updateView(Population pop, boolean showAllIfPossible) {
InterfaceDataTypeDouble best = (InterfaceDataTypeDouble)pop.getBestIndividual(); if (showAllIfPossible) {
//this.m_BestFitness = ((AbstractEAIndividual)best).getFitness(0); // indiesToPaint=pop;
double curFit = ((AbstractEAIndividual)best).getFitness(0); for (int i=0; i<pop.size(); i++) {
if (m_BestFitness > curFit) { MyLensViewer newView=new MyLensViewer(m_LensProblem);
this.m_BestVariables = best.getDoubleData();
this.m_BestFitness = curFit; Population newPop = new Population();
this.paint(this.getGraphics()); newPop.add(pop.getEAIndividual(i));
} newView.updateView(newPop, false);
}
JFrame newFrame = new JFrame("Lens Problem Viewer");
newFrame.getContentPane().add(newView);
newFrame.pack();
newFrame.setVisible(true);
}
// this.paint(this.getGraphics());
} else {
InterfaceDataTypeDouble best = (InterfaceDataTypeDouble)pop.getBestIndividual();
//this.m_BestFitness = ((AbstractEAIndividual)best).getFitness(0);
if (indiesToPaint.size()==0 || ((AbstractEAIndividual)best).isDominant(indiesToPaint.getBestIndividual())) {
if (indiesToPaint.size()==1) indiesToPaint.set(0, best);
else indiesToPaint.add(best);
this.paint(this.getGraphics());
}
}
}
} }
/** /**
@ -161,7 +201,8 @@ class MyLensViewer extends JPanel {
* Time: 09:49:37 * Time: 09:49:37
* To change this template use File | Settings | File Templates. * To change this template use File | Settings | File Templates.
*/ */
public class FLensProblem extends AbstractOptimizationProblem implements InterfaceOptimizationProblem, java.io.Serializable { public class FLensProblem extends AbstractOptimizationProblem
implements InterfaceOptimizationProblem, InterfaceHasSolutionViewer, java.io.Serializable {
/** /**
* *
@ -217,7 +258,7 @@ public class FLensProblem extends AbstractOptimizationProblem implements Interfa
this.m_ProblemFrame.pack(); this.m_ProblemFrame.pack();
this.m_ProblemFrame.setVisible(true); this.m_ProblemFrame.setVisible(true);
//this.m_ProblemFrame.show(); //this.m_ProblemFrame.show();
} else this.m_Panel.resetBest(); } else this.m_Panel.resetView();
} }
/** This method gets rid of the problem view frame /** This method gets rid of the problem view frame
@ -234,7 +275,7 @@ public class FLensProblem extends AbstractOptimizationProblem implements Interfa
* @param population The current population. * @param population The current population.
*/ */
public void updateProblemFrame(Population population) { public void updateProblemFrame(Population population) {
if (this.m_Panel != null) this.m_Panel.update(population); if (this.m_Panel != null) this.m_Panel.updateView(population, false);
} }
/** This method inits the Problem to log multiruns /** This method inits the Problem to log multiruns
@ -516,4 +557,9 @@ public class FLensProblem extends AbstractOptimizationProblem implements Interfa
public void setEAIndividualTrap(AbstractEAIndividual indy) { public void setEAIndividualTrap(AbstractEAIndividual indy) {
if (indy instanceof InterfaceDataTypeDouble) this.setEAIndividual((InterfaceDataTypeDouble)indy); if (indy instanceof InterfaceDataTypeDouble) this.setEAIndividual((InterfaceDataTypeDouble)indy);
} }
@Override
public InterfaceSolutionViewer getSolutionViewer() {
return m_Panel;
}
} }