PSOAlgotihm.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. package exampleAlgorithms;
  2. import java.awt.BorderLayout;
  3. import java.awt.Component;
  4. import java.awt.Dimension;
  5. import java.awt.FlowLayout;
  6. import java.awt.Font;
  7. import java.awt.GridBagConstraints;
  8. import java.awt.GridBagLayout;
  9. import java.math.RoundingMode;
  10. import java.text.DecimalFormat;
  11. import java.text.NumberFormat;
  12. import java.util.ArrayList;
  13. import java.util.HashMap;
  14. import java.util.List;
  15. import java.util.ListIterator;
  16. import java.util.Locale;
  17. import java.util.stream.Collectors;
  18. import javax.swing.BorderFactory;
  19. import javax.swing.JButton;
  20. import javax.swing.JCheckBox;
  21. import javax.swing.JFormattedTextField;
  22. import javax.swing.JFrame;
  23. import javax.swing.JLabel;
  24. import javax.swing.JPanel;
  25. import javax.swing.JScrollPane;
  26. import javax.swing.JSplitPane;
  27. import javax.swing.JTextArea;
  28. import javax.swing.JTextField;
  29. import javax.swing.text.NumberFormatter;
  30. import api.Algorithm;
  31. import classes.AbstractCpsObject;
  32. import classes.CpsEdge;
  33. import classes.CpsNode;
  34. import classes.CpsUpperNode;
  35. import classes.HolonElement;
  36. import classes.HolonObject;
  37. import classes.HolonSwitch;
  38. import ui.controller.Control;
  39. import ui.model.IntermediateCableWithState;
  40. import ui.model.Model;
  41. import ui.model.DecoratedCable.CableState;
  42. public class PSOAlgotihm implements Algorithm {
  43. //Parameter for Algo with default Values:
  44. private int swarmSize = 20;
  45. private int maxIterations = 100;
  46. private double limit = 1.0;
  47. private double dependency = 2.01;
  48. //Gui Part:
  49. private Control control;
  50. private JTextArea textArea;
  51. private JPanel content = new JPanel();
  52. public static void main(String[] args)
  53. {
  54. JFrame newFrame = new JFrame("exampleWindow");
  55. PSOAlgotihm instance = new PSOAlgotihm();
  56. newFrame.setContentPane(instance.getAlgorithmPanel());
  57. newFrame.pack();
  58. newFrame.setVisible(true);
  59. newFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  60. }
  61. public PSOAlgotihm() {
  62. content.setLayout(new BorderLayout());
  63. textArea = new JTextArea();
  64. textArea.setEditable(false);
  65. JScrollPane scrollPane = new JScrollPane(textArea);
  66. JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
  67. createOptionPanel() , scrollPane);
  68. splitPane.setResizeWeight(0.9);
  69. content.add(splitPane, BorderLayout.CENTER);
  70. content.setPreferredSize(new Dimension(800,800));
  71. }
  72. public JPanel createOptionPanel() {
  73. JPanel optionPanel = new JPanel(new BorderLayout());
  74. JScrollPane scrollPane = new JScrollPane(createParameterPanel());
  75. scrollPane.setBorder(BorderFactory.createTitledBorder("Parameter"));
  76. optionPanel.add(scrollPane, BorderLayout.CENTER);
  77. optionPanel.add(createButtonPanel(), BorderLayout.PAGE_END);
  78. return optionPanel;
  79. }
  80. private Component createParameterPanel() {
  81. JPanel parameterPanel = new JPanel(null);
  82. parameterPanel.setPreferredSize(new Dimension(510,300));
  83. JLabel info = new JLabel("Tune the variables of the PSO algorithm in order to reach better results.");
  84. info.setBounds(10, 10, 480, 15);
  85. parameterPanel.add(info);
  86. JLabel swarmSizeLabel = new JLabel("Swarm Size:");
  87. swarmSizeLabel.setBounds(20, 60, 100, 20);
  88. parameterPanel.add(swarmSizeLabel);
  89. JLabel showDiagnosticsLabel = new JLabel("Show Diagnostic:");
  90. showDiagnosticsLabel.setBounds(200, 60, 110, 20);
  91. parameterPanel.add(showDiagnosticsLabel);
  92. JLabel cautionLabel = new JLabel(
  93. "Caution: High values in the fields of 'Swarm Size' and 'Max. Iteration' may take some time to calculate.");
  94. cautionLabel.setFont(new Font("Serif", Font.ITALIC, 12));
  95. cautionLabel.setBounds(10, 210, 500, 15);
  96. parameterPanel.add(cautionLabel);
  97. JLabel maxIterLabel = new JLabel("Max. Iterations:");
  98. maxIterLabel.setBounds(20, 85, 100, 20);
  99. parameterPanel.add(maxIterLabel);
  100. JLabel limitLabel = new JLabel("Limit:");
  101. limitLabel.setBounds(20, 110, 100, 20);
  102. parameterPanel.add(limitLabel);
  103. JLabel dependecyLabel = new JLabel("Dependency:");
  104. dependecyLabel.setBounds(20, 135, 100, 20);
  105. parameterPanel.add(dependecyLabel);
  106. JCheckBox diagnosticsCheckBox = new JCheckBox();
  107. diagnosticsCheckBox.setSelected(true);
  108. diagnosticsCheckBox.setBounds(320, 60, 25, 20);
  109. parameterPanel.add(diagnosticsCheckBox);
  110. //Integer formatter
  111. NumberFormat format = NumberFormat.getIntegerInstance();
  112. format.setGroupingUsed(false);
  113. format.setParseIntegerOnly(true);
  114. NumberFormatter integerFormatter = new NumberFormatter(format);
  115. integerFormatter.setMinimum(0);
  116. integerFormatter.setCommitsOnValidEdit(true);
  117. JFormattedTextField swarmSizeTextField = new JFormattedTextField(integerFormatter);
  118. swarmSizeTextField.setValue(swarmSize);
  119. swarmSizeTextField.setToolTipText("Only positive Integer.");
  120. swarmSizeTextField.addPropertyChangeListener(propertyChange -> swarmSize = Integer.parseInt(swarmSizeTextField.getValue().toString()));
  121. swarmSizeTextField.setBounds(125, 60, 50, 20);
  122. parameterPanel.add(swarmSizeTextField);
  123. JFormattedTextField maxIterTextField = new JFormattedTextField(integerFormatter);
  124. maxIterTextField.setValue(maxIterations);
  125. maxIterTextField.setToolTipText("Only positive Integer.");
  126. maxIterTextField.addPropertyChangeListener(propertyChange -> maxIterations = Integer.parseInt(maxIterTextField.getValue().toString()));
  127. maxIterTextField.setBounds(125, 85, 50, 20);
  128. parameterPanel.add(maxIterTextField);
  129. //Double Format:
  130. NumberFormat doubleFormat = NumberFormat.getNumberInstance(Locale.US);
  131. doubleFormat.setMinimumFractionDigits(1);
  132. doubleFormat.setMaximumFractionDigits(3);
  133. doubleFormat.setRoundingMode(RoundingMode.HALF_UP);
  134. //Limit Formatter:
  135. NumberFormatter limitFormatter = new NumberFormatter(doubleFormat);
  136. limitFormatter.setMinimum(0.0);
  137. limitFormatter.setMaximum(1.0);
  138. JFormattedTextField limitTextField = new JFormattedTextField(limitFormatter);
  139. limitTextField.setValue(limit);
  140. limitTextField.setToolTipText("Only Double in range [0.0, 1.0] with DecimalSeperator Point('.').");
  141. limitTextField.addPropertyChangeListener(propertyChange -> limit = Double.parseDouble(limitTextField.getValue().toString()));
  142. limitTextField.setBounds(125, 110, 50, 20);
  143. parameterPanel.add(limitTextField);
  144. //Limit Formatter:
  145. NumberFormatter dependencyFormatter = new NumberFormatter(doubleFormat);
  146. dependencyFormatter.setMinimum(2.001);
  147. dependencyFormatter.setMaximum(2.4);
  148. JFormattedTextField dependencyTextField = new JFormattedTextField(dependencyFormatter);
  149. dependencyTextField.setValue(dependency);
  150. dependencyTextField.setToolTipText("Only Double in range [2.001, 2.4] with DecimalSeperator Point('.').");
  151. dependencyTextField.addPropertyChangeListener(propertyChange -> dependency = Double.parseDouble(dependencyTextField.getValue().toString()));
  152. dependencyTextField.setBounds(125, 135, 50, 20);
  153. parameterPanel.add(dependencyTextField);
  154. return parameterPanel;
  155. }
  156. public JPanel createButtonPanel() {
  157. JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
  158. JButton clearButton = new JButton("Clear Console");
  159. clearButton.addActionListener(actionEvent -> clear());
  160. buttonPanel.add(clearButton);
  161. JButton plottButton = new JButton("Plott");
  162. buttonPanel.add(plottButton);
  163. JButton runButton = new JButton("Run");
  164. runButton.addActionListener(actionEvent -> executePsoAlgoWithCurrentParameters());
  165. buttonPanel.add(runButton);
  166. return buttonPanel;
  167. }
  168. private void printParameter() {
  169. println("SwarmSize:" + swarmSize + ", MaxIter:" + maxIterations + ", Limit:" + limit + ", Dependency:" + dependency);
  170. }
  171. @Override
  172. public JPanel getAlgorithmPanel() {
  173. return content;
  174. }
  175. @Override
  176. public void setController(Control control) {
  177. this.control = control;
  178. }
  179. private void clear() {
  180. textArea.setText("");
  181. }
  182. private void print(String message) {
  183. textArea.append(message);
  184. }
  185. private void println(String message) {
  186. textArea.append(message + "\n");
  187. }
  188. //Algo Part:
  189. private void executePsoAlgoWithCurrentParameters() {
  190. println("SwarmSize:" + swarmSize + ", MaxIter:" + maxIterations + ", Limit:" + limit + ", Dependency:" + dependency);//maybe local parameter to not get override by runnign
  191. extractPosition(control.getModel());
  192. // initSwarm(startPos);
  193. // runFunction(model, control);
  194. // evaluate();
  195. for (int iteration = 0; iteration < maxIterations ; iteration++) {
  196. for (int i = 0; i < swarmSize; i++) {
  197. // Particle temp = swarm.getSwarm().get(i);
  198. // Binary PSO 2 (S. Lee)
  199. // Update Velocity
  200. // temp.setVelocityAdv(updateNewVelAdv(temp.getVelocityAdv(), temp.getPositionAdv(),
  201. // temp.getBestLocalPosAdv(), iterations));
  202. // Update Position
  203. // temp.setPositionAdv(updateNewPosAdv(temp.getVelocityAdv(), temp.getPositionAdv()));
  204. // Mutation Position
  205. // temp.setPositionAdv(mutatePos(temp.getPositionAdv()));
  206. // Decode Position
  207. // temp.setPositionAdv(decodePos(temp.getPositionAdv()));
  208. }
  209. // plotSwarm();
  210. // runFunction(model, control);
  211. // evaluate();
  212. }
  213. }
  214. private List<Boolean> extractPosition(Model model) {
  215. println("Start extracting");
  216. List<Boolean> position = new ArrayList<Boolean>();
  217. HashMap<Integer, AccessWrapper> access= new HashMap<Integer, AccessWrapper>();
  218. rollOutNodes(model.getObjectsOnCanvas(), position, access, model.getCurIteration());
  219. println("[" + position.stream().map(Object::toString).collect(Collectors.joining(", ")) + "]");
  220. ListIterator<Boolean> i = position.listIterator();
  221. while(i.hasNext()) {
  222. boolean actual = i.next();
  223. double randomDouble = Math.random();
  224. if (randomDouble < limit) {
  225. i.set(!actual);
  226. }
  227. }
  228. println("[" + position.stream().map(Object::toString).collect(Collectors.joining(", ")) + "]");
  229. setState(position, access);
  230. updateVisual();
  231. return null;
  232. }
  233. private void updateVisual() {
  234. control.calculateStateForCurrentTimeStep();
  235. control.updateCanvas();
  236. }
  237. private void rollOutNodes(List<AbstractCpsObject> nodes, List<Boolean> positionToInit, HashMap<Integer, AccessWrapper> access, int timeStep) {
  238. for(AbstractCpsObject aCps : nodes) {
  239. if (aCps instanceof HolonObject) {
  240. for (HolonElement hE : ((HolonObject) aCps).getElements()) {
  241. positionToInit.add(hE.isActive());
  242. access.put(positionToInit.size() - 1 , new AccessWrapper(hE));
  243. }
  244. }
  245. else if (aCps instanceof HolonSwitch) {
  246. HolonSwitch sw = (HolonSwitch) aCps;
  247. positionToInit.add(sw.getState(timeStep));
  248. access.put(positionToInit.size() - 1 , new AccessWrapper(sw));
  249. }
  250. else if(aCps instanceof CpsUpperNode) {
  251. rollOutNodes(((CpsUpperNode)aCps).getNodes(), positionToInit, access ,timeStep );
  252. }
  253. }
  254. }
  255. private void setState(List<Boolean> position, HashMap<Integer, AccessWrapper> access) {
  256. for(int i = 0;i<position.size();i++) {
  257. access.get(i).setState(position.get(i));
  258. }
  259. }
  260. public class AccessWrapper {
  261. public static final int HOLONELEMENT = 0;
  262. public static final int SWITCH = 1;
  263. private int type;
  264. private HolonSwitch hSwitch;
  265. private HolonElement hElement;
  266. public AccessWrapper(HolonSwitch hSwitch){
  267. type = SWITCH;
  268. this.hSwitch = hSwitch;
  269. }
  270. public AccessWrapper(HolonElement hElement){
  271. type = HOLONELEMENT;
  272. this.hElement = hElement;
  273. }
  274. public void setState(boolean state) {
  275. if(type == HOLONELEMENT) {
  276. hElement.setActive(state);
  277. }else{//is switch
  278. hSwitch.setManualMode(true);
  279. hSwitch.setManualState(state);
  280. }
  281. }
  282. public boolean getState(int timeStep) {
  283. return (type == HOLONELEMENT)?hElement.isActive():hSwitch.getState(timeStep);
  284. }
  285. }
  286. }