Updating the lens viewer
This commit is contained in:
parent
893a742b21
commit
4f245074cd
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user