RandomPriority.java 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package addOns;
  2. import java.awt.BorderLayout;
  3. import java.awt.Dimension;
  4. import java.util.ArrayList;
  5. import java.util.Hashtable;
  6. import java.util.List;
  7. import java.util.stream.Collectors;
  8. import javax.swing.BorderFactory;
  9. import javax.swing.BoxLayout;
  10. import javax.swing.JButton;
  11. import javax.swing.JFrame;
  12. import javax.swing.JLabel;
  13. import javax.swing.JPanel;
  14. import javax.swing.JSlider;
  15. import api.AddOn;
  16. import classes.AbstractCanvasObject;
  17. import classes.GroupNode;
  18. import classes.Flexibility;
  19. import classes.HolonElement;
  20. import classes.HolonElement.Priority;
  21. import classes.HolonObject;
  22. import classes.HolonSwitch;
  23. import ui.controller.Control;
  24. /**
  25. * A short algorithm to distribute the Priorities for the whole Canvas.
  26. * @author tom
  27. *
  28. */
  29. public class RandomPriority implements AddOn {
  30. /**
  31. * Its like a Gradient the Values are on one Axis from Start to End:
  32. * |--start--lm--mh--he--end--|
  33. * lm: lowMedium
  34. * mh: mediumHigh
  35. * he: highEssential
  36. */
  37. private int lm = 25 , mh = 50, he = 75;
  38. private final int start = 0, end = 100;
  39. private Control control;
  40. private JPanel content = new JPanel();
  41. private JSlider lowChanceSlider = new JSlider(JSlider.HORIZONTAL,0, 100, lm - start);
  42. private JSlider mediumChanceSlider = new JSlider(JSlider.HORIZONTAL,0, 100, mh - lm);
  43. private JSlider highChanceSlider = new JSlider(JSlider.HORIZONTAL,0, 100, he - mh);
  44. private JSlider essentialChanceSlider = new JSlider(JSlider.HORIZONTAL,0, 100, end - he);
  45. public static void main(String[] args)
  46. {
  47. JFrame newFrame = new JFrame("exampleWindow");
  48. RandomPriority instance = new RandomPriority();
  49. newFrame.setContentPane(instance.getPanel());
  50. newFrame.pack();
  51. newFrame.setVisible(true);
  52. newFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  53. }
  54. public RandomPriority(){
  55. content.setLayout(new BorderLayout());
  56. content.add(createParameterPanel(), BorderLayout.CENTER);
  57. JButton buttonRun = new JButton("Run");
  58. buttonRun.addActionListener(actionEvent -> run());
  59. content.add(buttonRun, BorderLayout.PAGE_END);
  60. content.setPreferredSize(new Dimension(300,300));
  61. }
  62. private JPanel createParameterPanel() {
  63. JPanel parameterPanel = new JPanel();
  64. parameterPanel.setLayout(new BoxLayout(parameterPanel, BoxLayout.PAGE_AXIS));
  65. createParamaterSlider(parameterPanel);
  66. return parameterPanel;
  67. }
  68. private void createParamaterSlider(JPanel parameterPanel) {
  69. parameterPanel.add(initVisualizeSlider(this.lowChanceSlider, "Low"));
  70. parameterPanel.add(initVisualizeSlider(this.mediumChanceSlider, "Medium"));
  71. parameterPanel.add(initVisualizeSlider(this.highChanceSlider, "High"));
  72. parameterPanel.add(initVisualizeSlider(this.essentialChanceSlider, "Essential"));
  73. lowChanceSlider.addChangeListener(actionEvent ->{
  74. setLM(lowChanceSlider.getValue());
  75. updateSliders();
  76. System.out.println("lowChance = " +lowChanceSlider.getValue());
  77. });
  78. mediumChanceSlider.addChangeListener(actionEvent ->{
  79. if(lm + mediumChanceSlider.getValue() <= 100) setMH(lm + mediumChanceSlider.getValue());
  80. else setLM(end - mediumChanceSlider.getValue());
  81. updateSliders();
  82. System.out.println("mediumChance = " + mediumChanceSlider.getValue());
  83. });
  84. highChanceSlider.addChangeListener(actionEvent ->{
  85. if(mh + highChanceSlider.getValue() <= 100) setHE(mh + highChanceSlider.getValue());
  86. else setMH(end - highChanceSlider.getValue());
  87. updateSliders();
  88. System.out.println("highChance = " +highChanceSlider.getValue());
  89. });
  90. essentialChanceSlider.addChangeListener(actionEvent ->{
  91. setHE(end - essentialChanceSlider.getValue());
  92. updateSliders();
  93. System.out.println("essentialChance = " +essentialChanceSlider.getValue());
  94. });
  95. }
  96. private void setLM(int value) {
  97. lm = clamp(value, 0, 100);
  98. if(lm > mh) mh = lm;
  99. if(lm > he) he = lm;
  100. }
  101. private void setMH(int value) {
  102. mh = clamp(value, 0, 100);
  103. if(mh < lm) lm = mh;
  104. if(mh > he) he = mh;
  105. }
  106. private void setHE(int value) {
  107. he = clamp(value, 0, 100);
  108. if(he < lm) lm = he;
  109. if(he < mh) mh = he;
  110. }
  111. private int clamp(int input, int min , int max) {
  112. return Math.max(min, Math.min(max, input));
  113. }
  114. private void updateSliders(){
  115. lowChanceSlider.setValue(lm - start);
  116. mediumChanceSlider.setValue(mh - lm);
  117. highChanceSlider.setValue(he - mh);
  118. essentialChanceSlider.setValue(end - he);
  119. }
  120. private JSlider initVisualizeSlider(JSlider jslider, String name) {
  121. jslider.setBorder(BorderFactory.createTitledBorder(name));
  122. jslider.setMajorTickSpacing(50);
  123. jslider.setMinorTickSpacing(5);
  124. jslider.setPaintTicks(true);
  125. Hashtable<Integer, JLabel> labelTable = new Hashtable<Integer, JLabel>();
  126. labelTable.put( Integer.valueOf( 0 ), new JLabel("0.0") );
  127. labelTable.put( Integer.valueOf( 50 ), new JLabel("0.5") );
  128. labelTable.put( Integer.valueOf( 100 ), new JLabel("1.0") );
  129. jslider.setLabelTable( labelTable );
  130. jslider.setPaintLabels(true);
  131. return jslider;
  132. }
  133. private void run() {
  134. //control.getModel().getObjectsOnCanvas().stream().filter(aCps -> aCps instanceof HolonObject)
  135. List<HolonElement> elementList = createListOfHolonObjects(control.getModel().getObjectsOnCanvas()).stream().flatMap(hObject -> hObject.getElements().stream()).collect(Collectors.toList());
  136. for(HolonElement element : elementList) {
  137. // Generate a random number between 0 and 100
  138. double randomDoubleInRange = Math.random() * 100.0;
  139. if(randomDoubleInRange <= lm) {
  140. element.setPriority(Priority.Low);
  141. } else if(randomDoubleInRange <= mh) {
  142. element.setPriority(Priority.Medium);
  143. } else if(randomDoubleInRange <= he) {
  144. element.setPriority(Priority.High);
  145. } else {
  146. element.setPriority(Priority.Essential);
  147. }
  148. //System.out.println(randomDoubleInRange + ":" + element.getPriority());
  149. }
  150. control.calculateStateAndVisualForCurrentTimeStep();
  151. control.updateCanvas();
  152. List<Flexibility> flexList = control.getSimManager().getActualFlexManager().getAllFlexWrapper().stream().filter(flexwrapper -> flexwrapper.getFlex().offered).map(flex -> flex.getFlex()).collect(Collectors.toList());
  153. long amountOfEssential = flexList.stream().filter(flex -> flex.getElement().getPriority() == Priority.Essential).count();
  154. long amountOfHigh = flexList.stream().filter(flex -> flex.getElement().getPriority() == Priority.High).count();
  155. long amountOfMedium = flexList.stream().filter(flex -> flex.getElement().getPriority() == Priority.Medium).count();
  156. long amountOfLow = flexList.stream().filter(flex -> flex.getElement().getPriority() == Priority.Low).count();
  157. long overall = amountOfEssential + amountOfHigh + amountOfMedium + amountOfLow;
  158. System.out.println(" amountOfEssential: " + amountOfEssential + " amountOfHigh: " + amountOfHigh + " amountOfMedium: " +amountOfMedium + " amountOfLow: " +amountOfLow + " of overall " + overall + "Flexes");
  159. }
  160. private List<HolonObject> createListOfHolonObjects(List<AbstractCanvasObject> objectsOnCanvas) {
  161. List<HolonObject> list = new ArrayList<HolonObject>();
  162. for(AbstractCanvasObject aCps : objectsOnCanvas) {
  163. if(aCps instanceof HolonObject) list.add((HolonObject) aCps);
  164. else if(aCps instanceof GroupNode)list.addAll(createListOfHolonObjects(((GroupNode)aCps).getNodes()));
  165. }
  166. return list;
  167. }
  168. @Override
  169. public JPanel getPanel() {
  170. return content;
  171. }
  172. @Override
  173. public void setController(Control control) {
  174. this.control = control;
  175. }
  176. }