AlgoWindow.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. package algorithms;
  2. import java.awt.Dimension;
  3. import java.awt.Font;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.MouseAdapter;
  7. import java.awt.event.MouseEvent;
  8. import java.awt.event.MouseListener;
  9. import java.util.ArrayList;
  10. import java.util.HashMap;
  11. import javax.swing.BoxLayout;
  12. import javax.swing.JButton;
  13. import javax.swing.JCheckBox;
  14. import javax.swing.JLabel;
  15. import javax.swing.JPanel;
  16. import javax.swing.JScrollPane;
  17. import javax.swing.JSplitPane;
  18. import javax.swing.JTextArea;
  19. import javax.swing.JTextField;
  20. import javax.swing.JTree;
  21. import javax.swing.tree.DefaultMutableTreeNode;
  22. import javax.swing.tree.DefaultTreeModel;
  23. import javax.swing.tree.TreePath;
  24. import ui.controller.Control;
  25. import ui.model.Model;
  26. import algorithms.GeneticAlgorithm.GenAlgoHandler;
  27. import algorithms.GeneticAlgorithm.HolegGeneration;
  28. import algorithms.GeneticAlgorithm.HolegIndividual;
  29. import algorithms.GeneticAlgorithm.ParameterArray;
  30. public class AlgoWindow {
  31. JPanel frame;
  32. Control controller;
  33. Model model;
  34. JTree genTree;
  35. DefaultTreeModel treeModel;
  36. DefaultMutableTreeNode treeRoot;
  37. HashMap<DefaultMutableTreeNode, HolegIndividual> treeIndiHashmap;
  38. GenAlgoHandler algoHandler;
  39. ArrayList<DefaultMutableTreeNode> generationNodes = new ArrayList<DefaultMutableTreeNode>();
  40. private JTextField edgeAmountField;
  41. private JCheckBox chckbxEditEdges;
  42. private JTextArea logArea;
  43. private JTextField popSizeField;
  44. private JTextField tournamentSizeField;
  45. private JTextField edgeBreakCount;
  46. private JTextField iterationsField;
  47. ParameterArray params;
  48. private JTextField edgeMutationField;
  49. private JTextField suppliedField;
  50. private JTextField oversuppliedField;
  51. private JTextField undersuppliedField;
  52. private JTextField edgeLengthField;
  53. private JTextField wildcardUsageField;
  54. private JTextField wildcardMutationField;
  55. private JTextField partialSuppliedField;
  56. private JTextField overproductionField;
  57. private JTextField generationAmountField;
  58. private JCheckBox chckbxWildNodes;
  59. ArrayList<HolegGeneration> generationHistory = new ArrayList<HolegGeneration>();
  60. /**
  61. * Create the application.
  62. */
  63. public AlgoWindow(Control controller, Model model) {
  64. this.model = model;
  65. this.controller = controller;
  66. //algoHandler = new GenAlgoHandler(controller, model);
  67. //algoHandler.addListener(this);
  68. treeIndiHashmap = new HashMap<DefaultMutableTreeNode, HolegIndividual>();
  69. initialize();
  70. algoHandler.setOriginalNetwork();
  71. }
  72. /**
  73. * Initialize the contents of the frame.
  74. */
  75. private void initialize() {
  76. frame = new JPanel();
  77. frame.setBounds(100, 100, 444, 500);
  78. frame.setLayout(new BoxLayout(frame, BoxLayout.X_AXIS));
  79. JSplitPane mainSplitPane = new JSplitPane();
  80. mainSplitPane.setResizeWeight(0.3);
  81. frame.add(mainSplitPane);
  82. JScrollPane treeScrollPane = new JScrollPane();
  83. mainSplitPane.setLeftComponent(treeScrollPane);
  84. genTree = new JTree();
  85. treeScrollPane.setViewportView(genTree);
  86. treeModel = (DefaultTreeModel) genTree.getModel();
  87. treeRoot = new DefaultMutableTreeNode("Generations");
  88. treeModel.setRoot(treeRoot);
  89. genTree.setModel(treeModel);
  90. JSplitPane rightSplitPane = new JSplitPane();
  91. rightSplitPane.setResizeWeight(0.7);
  92. rightSplitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
  93. mainSplitPane.setRightComponent(rightSplitPane);
  94. JPanel parameterPanel = new JPanel();
  95. parameterPanel.setPreferredSize(new Dimension(100, 650));
  96. JScrollPane parameterScrollView = new JScrollPane();
  97. rightSplitPane.setLeftComponent(parameterScrollView);
  98. parameterScrollView.setViewportView(parameterPanel);
  99. JButton btnCreategeneration = new JButton("create N Generations");
  100. btnCreategeneration.setBounds(10, 11, 137, 23);
  101. btnCreategeneration.addActionListener(new ActionListener() {
  102. public void actionPerformed(ActionEvent arg0) {
  103. setParameters();
  104. algoHandler.createGeneration(Integer.parseInt(generationAmountField.getText()), params);
  105. }
  106. });
  107. parameterPanel.setLayout(null);
  108. parameterPanel.add(btnCreategeneration);
  109. edgeAmountField = new JTextField();
  110. edgeAmountField.setText("0");
  111. edgeAmountField.setBounds(147, 119, 86, 20);
  112. parameterPanel.add(edgeAmountField);
  113. edgeAmountField.setColumns(10);
  114. JLabel lblMaxEdges = new JLabel("Max Edges");
  115. lblMaxEdges.setBounds(10, 122, 91, 14);
  116. parameterPanel.add(lblMaxEdges);
  117. chckbxEditEdges = new JCheckBox("\r\n");
  118. chckbxEditEdges.setBounds(147, 92, 25, 23);
  119. parameterPanel.add(chckbxEditEdges);
  120. JLabel lblEditEdges = new JLabel("Edit Edges?");
  121. lblEditEdges.setBounds(10, 96, 91, 14);
  122. parameterPanel.add(lblEditEdges);
  123. popSizeField = new JTextField();
  124. popSizeField.setText("100");
  125. popSizeField.setBounds(147, 45, 86, 20);
  126. parameterPanel.add(popSizeField);
  127. popSizeField.setColumns(10);
  128. tournamentSizeField = new JTextField();
  129. tournamentSizeField.setText("30");
  130. tournamentSizeField.setBounds(147, 70, 86, 20);
  131. parameterPanel.add(tournamentSizeField);
  132. tournamentSizeField.setColumns(10);
  133. JLabel lblPopulationSize = new JLabel("Population Size");
  134. lblPopulationSize.setBounds(10, 45, 91, 14);
  135. parameterPanel.add(lblPopulationSize);
  136. JLabel lblTournamentSize = new JLabel("Tournament Size");
  137. lblTournamentSize.setBounds(10, 73, 91, 14);
  138. parameterPanel.add(lblTournamentSize);
  139. edgeBreakCount = new JTextField();
  140. edgeBreakCount.setText("0");
  141. edgeBreakCount.setBounds(147, 144, 86, 20);
  142. parameterPanel.add(edgeBreakCount);
  143. edgeBreakCount.setColumns(10);
  144. JLabel lblEdgeBreakProb = new JLabel("Edge Break Amount");
  145. lblEdgeBreakProb.setBounds(10, 147, 117, 14);
  146. parameterPanel.add(lblEdgeBreakProb);
  147. iterationsField = new JTextField();
  148. iterationsField.setText("1");
  149. iterationsField.setBounds(147, 169, 86, 20);
  150. parameterPanel.add(iterationsField);
  151. iterationsField.setColumns(10);
  152. JLabel lblSimIteration = new JLabel("Sim Iterations");
  153. lblSimIteration.setBounds(10, 172, 91, 14);
  154. parameterPanel.add(lblSimIteration);
  155. edgeMutationField = new JTextField();
  156. edgeMutationField.setText("0.01");
  157. edgeMutationField.setBounds(147, 194, 86, 20);
  158. parameterPanel.add(edgeMutationField);
  159. edgeMutationField.setColumns(10);
  160. JLabel lblMutationProb = new JLabel("Edge Mutation Prob");
  161. lblMutationProb.setBounds(10, 197, 117, 14);
  162. parameterPanel.add(lblMutationProb);
  163. suppliedField = new JTextField();
  164. suppliedField.setText("+10.0");
  165. suppliedField.setBounds(147, 297, 86, 20);
  166. parameterPanel.add(suppliedField);
  167. suppliedField.setColumns(10);
  168. JLabel lblFittnesspointsPerAttribute = new JLabel("Fittnesspoints per Attribute:");
  169. lblFittnesspointsPerAttribute.setFont(new Font("Tahoma", Font.PLAIN, 12));
  170. lblFittnesspointsPerAttribute.setBounds(59, 275, 157, 14);
  171. parameterPanel.add(lblFittnesspointsPerAttribute);
  172. JLabel lblSuppliedEntity = new JLabel("each supplied Entity");
  173. lblSuppliedEntity.setBounds(10, 300, 117, 14);
  174. parameterPanel.add(lblSuppliedEntity);
  175. oversuppliedField = new JTextField();
  176. oversuppliedField.setText("+10.0");
  177. oversuppliedField.setBounds(147, 322, 86, 20);
  178. parameterPanel.add(oversuppliedField);
  179. oversuppliedField.setColumns(10);
  180. JLabel lblOversuppliedEntity = new JLabel("each oversupplied Entity");
  181. lblOversuppliedEntity.setBounds(10, 325, 127, 14);
  182. parameterPanel.add(lblOversuppliedEntity);
  183. undersuppliedField = new JTextField();
  184. undersuppliedField.setText("-10.0");
  185. undersuppliedField.setBounds(147, 347, 86, 20);
  186. parameterPanel.add(undersuppliedField);
  187. undersuppliedField.setColumns(10);
  188. JLabel lblEachUndersuppliedEntity = new JLabel("each undersupplied Entity");
  189. lblEachUndersuppliedEntity.setBounds(10, 350, 127, 14);
  190. parameterPanel.add(lblEachUndersuppliedEntity);
  191. edgeLengthField = new JTextField();
  192. edgeLengthField.setText("-1.0");
  193. edgeLengthField.setBounds(147, 397, 86, 20);
  194. parameterPanel.add(edgeLengthField);
  195. edgeLengthField.setColumns(10);
  196. JLabel lblForEdge = new JLabel("for 100 edge length");
  197. lblForEdge.setBounds(10, 400, 127, 14);
  198. parameterPanel.add(lblForEdge);
  199. wildcardUsageField = new JTextField();
  200. wildcardUsageField.setText("-7.0");
  201. wildcardUsageField.setBounds(147, 422, 86, 20);
  202. parameterPanel.add(wildcardUsageField);
  203. wildcardUsageField.setColumns(10);
  204. JLabel lblWildcardUsage = new JLabel("each Wildcard usage");
  205. lblWildcardUsage.setBounds(10, 425, 127, 14);
  206. parameterPanel.add(lblWildcardUsage);
  207. JLabel lblWildcardMutation = new JLabel("Wildcard Mutation Prob");
  208. lblWildcardMutation.setBounds(10, 222, 117, 14);
  209. parameterPanel.add(lblWildcardMutation);
  210. wildcardMutationField = new JTextField();
  211. wildcardMutationField.setText("0.01");
  212. wildcardMutationField.setBounds(147, 219, 86, 20);
  213. parameterPanel.add(wildcardMutationField);
  214. wildcardMutationField.setColumns(10);
  215. JLabel lblEachPartiallySupplied = new JLabel("each partialsupplied Entity");
  216. lblEachPartiallySupplied.setBounds(10, 375, 137, 14);
  217. parameterPanel.add(lblEachPartiallySupplied);
  218. partialSuppliedField = new JTextField();
  219. partialSuppliedField.setText("-2.0");
  220. partialSuppliedField.setBounds(147, 372, 86, 20);
  221. parameterPanel.add(partialSuppliedField);
  222. partialSuppliedField.setColumns(10);
  223. JLabel lblForOverproduction = new JLabel("for 1000 overproduction");
  224. lblForOverproduction.setBounds(10, 450, 117, 14);
  225. parameterPanel.add(lblForOverproduction);
  226. overproductionField = new JTextField();
  227. overproductionField.setText("-5.0");
  228. overproductionField.setBounds(147, 447, 86, 20);
  229. parameterPanel.add(overproductionField);
  230. overproductionField.setColumns(10);
  231. generationAmountField = new JTextField();
  232. generationAmountField.setText("1");
  233. generationAmountField.setBounds(147, 12, 86, 20);
  234. parameterPanel.add(generationAmountField);
  235. generationAmountField.setColumns(10);
  236. JLabel lblNodesInWildcards = new JLabel("Nodes in Wildcards?");
  237. lblNodesInWildcards.setBounds(10, 247, 117, 14);
  238. parameterPanel.add(lblNodesInWildcards);
  239. chckbxWildNodes = new JCheckBox("");
  240. chckbxWildNodes.setBounds(147, 245, 97, 20);
  241. parameterPanel.add(chckbxWildNodes);
  242. logArea = new JTextArea();
  243. rightSplitPane.setRightComponent(logArea);
  244. MouseListener ml = new MouseAdapter() {
  245. public void mousePressed(MouseEvent e) {
  246. int selRow = genTree.getRowForLocation(e.getX(), e.getY());
  247. TreePath selPath = genTree.getPathForLocation(e.getX(), e.getY());
  248. if(selRow != -1) {
  249. if(e.getClickCount() == 1) {
  250. nodeSingleClick(selRow, selPath);
  251. }
  252. else if(e.getClickCount() == 2) {
  253. nodeDoubleClick(selRow, selPath);
  254. }
  255. }
  256. }
  257. };
  258. genTree.addMouseListener(ml);
  259. }
  260. public void nodeSingleClick(int selRow, TreePath selPath){
  261. DefaultMutableTreeNode node = (DefaultMutableTreeNode)selPath.getLastPathComponent();
  262. if(node.getUserObject() instanceof HolegGeneration){
  263. logArea.setText(((HolegGeneration)node.getUserObject()).getInformation());
  264. }
  265. }
  266. public void nodeDoubleClick(int selRow, TreePath selPath){
  267. DefaultMutableTreeNode node = (DefaultMutableTreeNode)selPath.getLastPathComponent();
  268. if(treeIndiHashmap.get(node) != null){
  269. algoHandler.drawIndividualWithPos(treeIndiHashmap.get(node));
  270. logArea.setText(treeIndiHashmap.get(node).log);
  271. }
  272. }
  273. public void populationCreated(HolegGeneration holegGen) {
  274. DefaultMutableTreeNode genNode = new DefaultMutableTreeNode(holegGen);
  275. generationHistory.add(holegGen);
  276. ArrayList<HolegIndividual> population = holegGen.getGeneration();
  277. for(int i = 0; i < population.size(); i++){
  278. DefaultMutableTreeNode child = new DefaultMutableTreeNode("Individual " + i);
  279. population.get(i).setId(holegGen.getGenCount(), i);
  280. treeIndiHashmap.put(child, population.get(i));
  281. genNode.add(child);
  282. }
  283. generationNodes.add(genNode);
  284. treeRoot.insert(genNode, 0);
  285. treeModel.reload();
  286. if(holegGen.getGenCount() == HolegGeneration.ORIGINAL_GEN){
  287. int nodeAmount = holegGen.getGeneration().get(0).getIndexes().size();
  288. int maxEdges = (nodeAmount*(nodeAmount-1))/2;
  289. edgeAmountField.setText(Integer.toString(maxEdges));
  290. params.set(params.ORIGINAL_NETWORK, holegGen.getGeneration().get(0));
  291. }
  292. }
  293. /**
  294. * sets All Parameters from the Textfields into the ParameterArray;
  295. */
  296. public void setParameters(){
  297. params.set(params.MAX_EDGES, Integer.parseInt(edgeAmountField.getText()));
  298. params.set(params.EDIT_EDGES, chckbxEditEdges.isSelected());
  299. params.set(params.POPULATION_SIZE, Integer.parseInt(popSizeField.getText()));
  300. params.set(params.TOURNAMENT_SIZE, Integer.parseInt(tournamentSizeField.getText()));
  301. params.set(params.EDGE_BREAK_AMOUNT, Integer.parseInt(edgeBreakCount.getText()));
  302. params.set(params.SIM_ITERATIONS, Integer.parseInt(iterationsField.getText()));
  303. params.set(params.EDGE_MUTATION_PROB, Double.parseDouble(edgeMutationField.getText()));
  304. params.set(params.SUPPLIED_POINTS, Double.parseDouble(suppliedField.getText()));
  305. params.set(params.OVERSUPPLIED_POINTS, Double.parseDouble(oversuppliedField.getText()));
  306. params.set(params.UNDERSUPPLIED_POINTS, Double.parseDouble(undersuppliedField.getText()));
  307. params.set(params.LENGTH_POINTS, Double.parseDouble(edgeLengthField.getText()));
  308. params.set(params.WILDCARD_USAGE, Double.parseDouble(wildcardUsageField.getText()));
  309. params.set(params.WILDCARD_MUTATION_PROB, Double.parseDouble(wildcardMutationField.getText()));
  310. params.set(params.PARTIALSUPPLIED_POINTS, Double.parseDouble(partialSuppliedField.getText()));
  311. params.set(params.OVERPRODUCTION, Double.parseDouble(overproductionField.getText()));
  312. params.set(params.NODES_IN_WILDCARDS, chckbxWildNodes.isSelected());
  313. params.set(params.TOURNAMENT_PROB, 0.15);
  314. }
  315. public ArrayList<HolegGeneration> evaluationRun(ParameterArray params){
  316. generationHistory = new ArrayList<HolegGeneration>();
  317. params.set(params.ORIGINAL_NETWORK, this.params.get(params.ORIGINAL_NETWORK));
  318. algoHandler.createGeneration(100, params);
  319. return generationHistory;
  320. }
  321. public void setEvalParameters(ParameterArray params){
  322. this.params = params;
  323. }
  324. }