1 package net.sf.openrocket.gui.optimization;
3 import static net.sf.openrocket.util.MathUtil.pow2;
5 import java.awt.Window;
6 import java.awt.event.ActionEvent;
7 import java.awt.event.ActionListener;
9 import javax.swing.JButton;
10 import javax.swing.JDialog;
11 import javax.swing.JPanel;
13 import net.miginfocom.swing.MigLayout;
14 import net.sf.openrocket.document.OpenRocketDocument;
15 import net.sf.openrocket.document.Simulation;
16 import net.sf.openrocket.optimization.general.Function;
17 import net.sf.openrocket.optimization.general.FunctionOptimizer;
18 import net.sf.openrocket.optimization.general.OptimizationController;
19 import net.sf.openrocket.optimization.general.OptimizationException;
20 import net.sf.openrocket.optimization.general.ParallelExecutorCache;
21 import net.sf.openrocket.optimization.general.ParallelFunctionCache;
22 import net.sf.openrocket.optimization.general.Point;
23 import net.sf.openrocket.optimization.general.multidim.MultidirectionalSearchOptimizer;
24 import net.sf.openrocket.optimization.rocketoptimization.RocketOptimizationFunction;
25 import net.sf.openrocket.optimization.rocketoptimization.SimulationDomain;
26 import net.sf.openrocket.optimization.rocketoptimization.SimulationModifier;
27 import net.sf.openrocket.optimization.rocketoptimization.domains.StabilityDomain;
28 import net.sf.openrocket.optimization.rocketoptimization.goals.MaximizationGoal;
29 import net.sf.openrocket.optimization.rocketoptimization.modifiers.GenericComponentModifier;
30 import net.sf.openrocket.optimization.rocketoptimization.parameters.MaximumAltitudeParameter;
31 import net.sf.openrocket.rocketcomponent.BodyTube;
32 import net.sf.openrocket.rocketcomponent.Rocket;
33 import net.sf.openrocket.rocketcomponent.RocketComponent;
34 import net.sf.openrocket.unit.UnitGroup;
35 import net.sf.openrocket.util.GUIUtil;
37 public class OptimizationTestDialog extends JDialog {
39 private final OpenRocketDocument document;
41 public OptimizationTestDialog(Window parent, OpenRocketDocument document) {
42 super(parent, "Optimization", ModalityType.APPLICATION_MODAL);
44 this.document = document;
46 JPanel panel = new JPanel(new MigLayout("fill"));
49 JButton button = new JButton("Test optimize");
50 button.addActionListener(new ActionListener() {
52 public void actionPerformed(ActionEvent e) {
55 } catch (OptimizationException e1) {
60 panel.add(button, "wrap para");
64 JButton close = new JButton("Close");
65 close.addActionListener(new ActionListener() {
67 public void actionPerformed(ActionEvent e) {
68 OptimizationTestDialog.this.dispose();
74 GUIUtil.setDisposableDialogOptions(this, close);
78 private void doOptimize() throws OptimizationException {
79 Simulation sim = document.getSimulation(0);
80 Rocket rocket = sim.getRocket();
82 RocketComponent body = null;
84 for (RocketComponent c : rocket) {
85 if (c instanceof BodyTube) {
93 SimulationDomain domain;
94 // domain= new IdentitySimulationDomain();
95 domain = new StabilityDomain(2, false);
97 SimulationModifier mod1 = new GenericComponentModifier("Test", body,
98 UnitGroup.UNITS_LENGTH, 1.0, BodyTube.class, body.getID(), "Length");
99 mod1.setMinValue(0.1);
100 mod1.setMaxValue(0.7);
102 SimulationModifier mod2 = new GenericComponentModifier("Test", body,
103 UnitGroup.UNITS_LENGTH, 2.0, BodyTube.class, body.getID(), "OuterRadius");
104 mod2.setMinValue(0.01);
105 mod2.setMaxValue(0.10);
107 OptimizationController controller = new OptimizationController() {
111 public boolean stepTaken(Point oldPoint, double oldValue, Point newPoint, double newValue, double stepSize) {
113 System.out.println("STEP " + step + " oldValue=" + oldValue + " newValue=" + newValue +
114 " oldPoint=" + oldPoint + " newPoint=" + newPoint +
115 " stepSize=" + stepSize);
121 initial = new Point(mod1.getCurrentScaledValue(sim), mod2.getCurrentScaledValue(sim));
124 Function function = new RocketOptimizationFunction(sim, new MaximumAltitudeParameter(),
125 new MaximizationGoal(), domain, mod1, mod2);
127 function = new Function() {
129 public double evaluate(Point point) throws InterruptedException, OptimizationException {
137 double x = point.get(0);
138 double y = -x * x + Math.PI / 2 * x;
139 System.out.println("Evaluating at x=" + x + " value=" + y);
145 ParallelFunctionCache cache = new ParallelExecutorCache(1);
146 cache.setFunction(function);
148 FunctionOptimizer optimizer = new MultidirectionalSearchOptimizer(cache);
150 optimizer.optimize(initial, controller);
154 ////////////////////////////////////////////////////////////////////////////////////////////////////////
157 private static int evalCount = 0;
159 public static void main(String[] args) throws OptimizationException {
164 OptimizationController controller = new OptimizationController() {
168 public boolean stepTaken(Point oldPoint, double oldValue, Point newPoint, double newValue, double stepSize) {
170 System.out.println("STEP " + step + " oldValue=" + oldValue + " newValue=" + newValue +
171 " oldPoint=" + oldPoint + " newPoint=" + newPoint +
172 " stepSize=" + stepSize);
178 initial = new Point(0.5, 0.5);
181 Function function = new Function() {
183 public double evaluate(Point point) throws InterruptedException, OptimizationException {
192 // double x = point.get(0);
193 // double y = x * x - Math.PI / 2 * x;
194 // System.out.println("Evaluating at x=" + x + " value=" + y);
197 double x = point.get(0);
198 double y = point.get(1);
199 double z = 4 * pow2((x - 0.3231)) + 2 * pow2(y - 0.8923);
201 System.out.println("Evaluation " + evalCount + ": x=" + x + " y=" + y + " z=" + z);
208 ParallelFunctionCache cache = new ParallelExecutorCache();
209 cache.setFunction(function);
211 FunctionOptimizer optimizer = new MultidirectionalSearchOptimizer(cache);
213 optimizer.optimize(initial, controller);
216 System.out.println("Total evaluation count: " + evalCount);