GenAlgoWindow.java 15 KB

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