GenAlgoWindow.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. package algorithms.geneticAlgorithm.holegGA;
  2. import java.awt.EventQueue;
  3. import javax.swing.JFrame;
  4. import javax.swing.JSplitPane;
  5. import java.awt.BorderLayout;
  6. import javax.swing.GroupLayout;
  7. import javax.swing.GroupLayout.Alignment;
  8. import javax.swing.BoxLayout;
  9. import javax.swing.JScrollPane;
  10. import javax.swing.JTree;
  11. import javax.swing.JPanel;
  12. import javax.swing.tree.DefaultMutableTreeNode;
  13. import javax.swing.tree.DefaultTreeModel;
  14. import javax.swing.tree.TreePath;
  15. import ui.controller.Control;
  16. import ui.model.Model;
  17. import ui.view.MyCanvas;
  18. import ui.view.UnitGraph;
  19. import javax.swing.JButton;
  20. import algorithms.geneticAlgorithm.Components.GAResultListener;
  21. import algorithms.geneticAlgorithm.holegGA.Components.HolegGeneration;
  22. import algorithms.geneticAlgorithm.holegGA.Components.HolegIndividual;
  23. import java.awt.event.ActionListener;
  24. import java.awt.event.ActionEvent;
  25. import java.awt.event.MouseAdapter;
  26. import java.awt.event.MouseEvent;
  27. import java.awt.event.MouseListener;
  28. import java.util.ArrayList;
  29. import java.util.HashMap;
  30. import javax.swing.JTextField;
  31. import javax.swing.JLabel;
  32. import javax.swing.JCheckBox;
  33. import javax.swing.JTextArea;
  34. public class GenAlgoWindow implements GAResultListener<HolegIndividual> {
  35. JFrame frame;
  36. Control controller;
  37. Model model;
  38. JTree genTree;
  39. DefaultTreeModel treeModel;
  40. DefaultMutableTreeNode treeRoot;
  41. HashMap<DefaultMutableTreeNode, HolegIndividual> treeIndiHashmap;
  42. GenAlgoHandler algoHandler;
  43. private JTextField objectAmountField;
  44. private JTextField edgeAmountField;
  45. private JCheckBox chckbxOnlyNodes;
  46. private JTextArea logArea;
  47. private JTextField popSizeField;
  48. private JTextField tournamentSizeField;
  49. private JTextField tournamentProbField;
  50. /**
  51. * Create the application.
  52. */
  53. public GenAlgoWindow(Control controller, Model model) {
  54. this.model = model;
  55. this.controller = controller;
  56. algoHandler = new GenAlgoHandler(controller, model);
  57. algoHandler.addListener(this);
  58. treeIndiHashmap = new HashMap<DefaultMutableTreeNode, HolegIndividual>();
  59. initialize();
  60. HolegIndividual originIndividual = new HolegIndividual(model.getObjectsOnCanvas());
  61. ArrayList<HolegIndividual> originPopulation = new ArrayList<HolegIndividual>();
  62. originPopulation.add(originIndividual);
  63. HolegGeneration originGen = new HolegGeneration(-1);
  64. originGen.setGeneration(originPopulation);
  65. populationCreated(originGen);
  66. }
  67. /**
  68. * Initialize the contents of the frame.
  69. */
  70. private void initialize() {
  71. frame = new JFrame();
  72. frame.setBounds(100, 100, 450, 520);
  73. frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  74. frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.X_AXIS));
  75. JSplitPane mainSplitPane = new JSplitPane();
  76. mainSplitPane.setResizeWeight(0.3);
  77. frame.getContentPane().add(mainSplitPane);
  78. JScrollPane treeScrollPane = new JScrollPane();
  79. mainSplitPane.setLeftComponent(treeScrollPane);
  80. genTree = new JTree();
  81. treeScrollPane.setViewportView(genTree);
  82. treeModel = (DefaultTreeModel) genTree.getModel();
  83. treeRoot = new DefaultMutableTreeNode("Generations");
  84. treeModel.setRoot(treeRoot);
  85. genTree.setModel(treeModel);
  86. JSplitPane rightSplitPane = new JSplitPane();
  87. rightSplitPane.setResizeWeight(0.5);
  88. rightSplitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
  89. mainSplitPane.setRightComponent(rightSplitPane);
  90. JPanel panel = new JPanel();
  91. rightSplitPane.setLeftComponent(panel);
  92. JButton btnCreategeneration = new JButton("createGeneration");
  93. btnCreategeneration.setBounds(10, 11, 117, 23);
  94. btnCreategeneration.addActionListener(new ActionListener() {
  95. public void actionPerformed(ActionEvent arg0) {
  96. int objAmount = Integer.parseInt(objectAmountField.getText());
  97. int edgeAmount = Integer.parseInt(edgeAmountField.getText());
  98. algoHandler.onlyNodes = chckbxOnlyNodes.isSelected();
  99. algoHandler.popSize = Integer.parseInt(popSizeField.getText());
  100. algoHandler.tournamentSize = Integer.parseInt(tournamentSizeField.getText());
  101. algoHandler.createGeneration(objAmount, edgeAmount);
  102. }
  103. });
  104. panel.setLayout(null);
  105. objectAmountField = new JTextField();
  106. objectAmountField.setText("0");
  107. objectAmountField.setBounds(111, 45, 86, 20);
  108. panel.add(objectAmountField);
  109. objectAmountField.setColumns(10);
  110. panel.add(btnCreategeneration);
  111. edgeAmountField = new JTextField();
  112. edgeAmountField.setText("0");
  113. edgeAmountField.setBounds(111, 76, 86, 20);
  114. panel.add(edgeAmountField);
  115. edgeAmountField.setColumns(10);
  116. JLabel lblMaxObjects = new JLabel("Max Objects");
  117. lblMaxObjects.setBounds(10, 48, 91, 14);
  118. panel.add(lblMaxObjects);
  119. JLabel lblMaxEdges = new JLabel("Max Edges");
  120. lblMaxEdges.setBounds(10, 79, 91, 14);
  121. panel.add(lblMaxEdges);
  122. chckbxOnlyNodes = new JCheckBox("\r\n");
  123. chckbxOnlyNodes.setBounds(121, 103, 25, 23);
  124. panel.add(chckbxOnlyNodes);
  125. JLabel lblOnlyNodes = new JLabel("Only Nodes?");
  126. lblOnlyNodes.setBounds(10, 107, 91, 14);
  127. panel.add(lblOnlyNodes);
  128. popSizeField = new JTextField();
  129. popSizeField.setText("100");
  130. popSizeField.setBounds(111, 133, 86, 20);
  131. panel.add(popSizeField);
  132. popSizeField.setColumns(10);
  133. tournamentSizeField = new JTextField();
  134. tournamentSizeField.setText("30");
  135. tournamentSizeField.setBounds(111, 164, 86, 20);
  136. panel.add(tournamentSizeField);
  137. tournamentSizeField.setColumns(10);
  138. tournamentProbField = new JTextField();
  139. tournamentProbField.setText("0.8");
  140. tournamentProbField.setBounds(111, 195, 86, 20);
  141. panel.add(tournamentProbField);
  142. tournamentProbField.setColumns(10);
  143. JLabel lblPopulationSize = new JLabel("Population Size");
  144. lblPopulationSize.setBounds(10, 136, 91, 14);
  145. panel.add(lblPopulationSize);
  146. JLabel lblTournamentSize = new JLabel("Tournament Size");
  147. lblTournamentSize.setBounds(10, 167, 91, 14);
  148. panel.add(lblTournamentSize);
  149. JLabel lblTournamentProb = new JLabel("Tournament Prob");
  150. lblTournamentProb.setBounds(10, 198, 91, 14);
  151. panel.add(lblTournamentProb);
  152. JButton btnMutation = new JButton("mutation");
  153. btnMutation.addActionListener(new ActionListener() {
  154. public void actionPerformed(ActionEvent arg0) {
  155. int objAmount = Integer.parseInt(objectAmountField.getText());
  156. int edgeAmount = Integer.parseInt(edgeAmountField.getText());
  157. algoHandler.onlyNodes = chckbxOnlyNodes.isSelected();
  158. algoHandler.popSize = Integer.parseInt(popSizeField.getText());
  159. algoHandler.tournamentSize = Integer.parseInt(tournamentSizeField.getText());
  160. algoHandler.mutationTest(objAmount, edgeAmount);
  161. }
  162. });
  163. btnMutation.setBounds(137, 11, 89, 23);
  164. panel.add(btnMutation);
  165. logArea = new JTextArea();
  166. rightSplitPane.setRightComponent(logArea);
  167. MouseListener ml = new MouseAdapter() {
  168. public void mousePressed(MouseEvent e) {
  169. int selRow = genTree.getRowForLocation(e.getX(), e.getY());
  170. TreePath selPath = genTree.getPathForLocation(e.getX(), e.getY());
  171. if(selRow != -1) {
  172. if(e.getClickCount() == 1) {
  173. nodeSingleClick(selRow, selPath);
  174. }
  175. else if(e.getClickCount() == 2) {
  176. nodeDoubleClick(selRow, selPath);
  177. }
  178. }
  179. }
  180. };
  181. genTree.addMouseListener(ml);
  182. }
  183. public void nodeSingleClick(int selRow, TreePath selPath){
  184. DefaultMutableTreeNode node = (DefaultMutableTreeNode)selPath.getLastPathComponent();
  185. if(node.getUserObject() instanceof HolegGeneration){
  186. logArea.setText(((HolegGeneration)node.getUserObject()).getInformation());
  187. }
  188. }
  189. public void nodeDoubleClick(int selRow, TreePath selPath){
  190. DefaultMutableTreeNode node = (DefaultMutableTreeNode)selPath.getLastPathComponent();
  191. if(treeIndiHashmap.get(node) != null){
  192. algoHandler.drawIndividual(treeIndiHashmap.get(node));
  193. logArea.setText(treeIndiHashmap.get(node).log);
  194. }
  195. }
  196. @Override
  197. public void populationCreated(HolegGeneration holegGen) {
  198. DefaultMutableTreeNode genNode = new DefaultMutableTreeNode(holegGen);
  199. ArrayList<HolegIndividual> population = holegGen.getGeneration();
  200. for(int i = 0; i < population.size(); i++){
  201. DefaultMutableTreeNode child = new DefaultMutableTreeNode("Individual " + i);
  202. population.get(i).setId(holegGen.getGenCount(), i);
  203. treeIndiHashmap.put(child, population.get(i));
  204. genNode.add(child);
  205. }
  206. treeRoot.insert(genNode, 0);
  207. treeModel.reload();
  208. }
  209. }