ControlAlgorithm.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722
  1. package blackstart;
  2. import java.awt.*;
  3. import java.io.IOException;
  4. import java.nio.charset.StandardCharsets;
  5. import java.nio.file.Files;
  6. import java.nio.file.Path;
  7. import java.nio.file.Paths;
  8. import java.util.ArrayList;
  9. import java.util.LinkedList;
  10. import java.util.List;
  11. import javax.swing.*;
  12. import api.AddOn;
  13. import classes.*;
  14. import ui.controller.Control;
  15. import classes.StorageProductionController;
  16. public class ControlAlgorithm implements AddOn {
  17. // Gui Part:
  18. private Control control;
  19. private JTextArea textArea;
  20. private JPanel content = new JPanel();
  21. // ProgressBar
  22. private long startTime;
  23. private Thread runThread;
  24. private HolonObject powerplant;
  25. private TextField blackstartEnergyrequierementTextfield;
  26. private TextField blackstartSuccessTimeTextfield;
  27. private TextField powerplantMaxOutputTextfield;
  28. private TextField blackstartStartTimeTextfield;
  29. private TextField simulationDurationTextfield;
  30. private TextField storageStartCharge;
  31. private TextField carStartCharge;
  32. private TextField waitBetweenIterations;
  33. private TextField fileNameTextfield;
  34. private TextField schedulTextfield;
  35. private TextField renewableTextfield;
  36. private TextField addBatteryTextfield;
  37. private TextField addBatteryTypeTextfield;
  38. private TextField removeBatteryTextfield;
  39. private TextField removeBatteryTypeTextfield;
  40. private int blackstartSuccessTime;
  41. private int blackstartStartTime;
  42. private int blackstartRunningCounter;
  43. private float powerplantMaxOutput;
  44. private List<HolonObject> renewableProducers;
  45. private List<HolonObject> consumers;
  46. private StorageProductionController SPC;
  47. private int scheduleKind;
  48. private int totalNumberOfHouses;
  49. private Path file;
  50. private ArrayList<String> lines;
  51. public static void main(String[] args) {
  52. JFrame newFrame = new JFrame("exampleWindow");
  53. ControlAlgorithm instance = new ControlAlgorithm();
  54. newFrame.setContentPane(instance.getPanel());
  55. newFrame.pack();
  56. newFrame.setVisible(true);
  57. newFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  58. }
  59. public ControlAlgorithm() {
  60. content.setLayout(new BorderLayout());
  61. textArea = new JTextArea();
  62. textArea.setEditable(false);
  63. JScrollPane scrollPane = new JScrollPane(textArea);
  64. JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, createOptionPanel(), scrollPane);
  65. splitPane.setResizeWeight(0.0);
  66. content.add(splitPane, BorderLayout.CENTER);
  67. content.setPreferredSize(new Dimension(1000, 800));
  68. }
  69. public JPanel createOptionPanel() {
  70. JPanel optionPanel = new JPanel(new BorderLayout());
  71. JScrollPane scrollPane = new JScrollPane(createParameterPanel());
  72. scrollPane.setBorder(BorderFactory.createTitledBorder("Parameter"));
  73. optionPanel.add(scrollPane, BorderLayout.CENTER);
  74. optionPanel.add(createButtonPanel(), BorderLayout.PAGE_END);
  75. return optionPanel;
  76. }
  77. private Component createParameterPanel() {
  78. JPanel parameterPanel = new JPanel(null);
  79. parameterPanel.setPreferredSize(new Dimension(510, 300));
  80. blackstartEnergyrequierementTextfield = new TextField("5000000");
  81. blackstartEnergyrequierementTextfield.setBounds(10, 10, 95, 20);
  82. parameterPanel.add(blackstartEnergyrequierementTextfield);
  83. JLabel blackstartEnergyrequierementLabel = new JLabel("Blackstart Energyrequirement in Watt");
  84. blackstartEnergyrequierementLabel.setBounds(110, 10, 300, 20);
  85. parameterPanel.add(blackstartEnergyrequierementLabel);
  86. blackstartSuccessTimeTextfield = new TextField("30");
  87. blackstartSuccessTimeTextfield.setBounds(10, 35, 95, 20);
  88. parameterPanel.add(blackstartSuccessTimeTextfield);
  89. JLabel blackstartSuccessTimeLabel = new JLabel("Time for successfull blackstart in minutes");
  90. blackstartSuccessTimeLabel.setBounds(110, 35, 300, 20);
  91. parameterPanel.add(blackstartSuccessTimeLabel);
  92. blackstartStartTimeTextfield = new TextField("15");
  93. blackstartStartTimeTextfield.setBounds(10, 60, 95, 20);
  94. parameterPanel.add(blackstartStartTimeTextfield);
  95. JLabel blackstartStartTimeLabel = new JLabel("Starttime for the blackstart");
  96. blackstartStartTimeLabel.setBounds(110, 60, 300, 20);
  97. parameterPanel.add(blackstartStartTimeLabel);
  98. simulationDurationTextfield = new TextField("500");
  99. simulationDurationTextfield.setBounds(10, 85, 95, 20);
  100. parameterPanel.add(simulationDurationTextfield);
  101. JLabel simulationDurationLabel = new JLabel("How long should the simulation run?");
  102. simulationDurationLabel.setBounds(110, 85, 300, 20);
  103. parameterPanel.add(simulationDurationLabel);
  104. powerplantMaxOutputTextfield = new TextField("40000000");
  105. powerplantMaxOutputTextfield.setBounds(10, 110, 95, 20);
  106. parameterPanel.add(powerplantMaxOutputTextfield);
  107. JLabel powerplantMaxOutputLabel = new JLabel("Powerplant Output afer Blackstart");
  108. powerplantMaxOutputLabel.setBounds(110, 110, 300, 20);
  109. parameterPanel.add(powerplantMaxOutputLabel);
  110. storageStartCharge = new TextField("25");
  111. storageStartCharge.setBounds(10, 135, 95, 20);
  112. parameterPanel.add(storageStartCharge);
  113. JLabel storageStartChargeLabel = new JLabel("Storage soc at start in %");
  114. storageStartChargeLabel.setBounds(110, 135, 300, 20);
  115. parameterPanel.add(storageStartChargeLabel);
  116. carStartCharge = new TextField("50");
  117. carStartCharge.setBounds(10, 160, 95, 20);
  118. parameterPanel.add(carStartCharge);
  119. JLabel carStartChargeLabel = new JLabel("Car soc at start in %");
  120. carStartChargeLabel.setBounds(110, 160, 300, 20);
  121. parameterPanel.add(carStartChargeLabel);
  122. waitBetweenIterations = new TextField("0");
  123. waitBetweenIterations.setBounds(10, 205, 95, 20);
  124. parameterPanel.add(waitBetweenIterations);
  125. JLabel waitBetweenIterationsLabel = new JLabel("Wait time between iterations");
  126. waitBetweenIterationsLabel.setBounds(110, 205, 300, 20);
  127. parameterPanel.add(waitBetweenIterationsLabel);
  128. ////////collums
  129. fileNameTextfield = new TextField("Eval.txt");
  130. fileNameTextfield.setBounds(425, 10, 95, 20);
  131. parameterPanel.add(fileNameTextfield);
  132. JLabel fileNameLabel = new JLabel("Filename");
  133. fileNameLabel.setBounds(530, 10, 300, 20);
  134. parameterPanel.add(fileNameLabel);
  135. schedulTextfield = new TextField("0");
  136. schedulTextfield.setBounds(425, 35, 95, 20);
  137. parameterPanel.add(schedulTextfield);
  138. JLabel scheduleLabel = new JLabel("Schedule: opt=0,simpl=1,rnd=2");
  139. scheduleLabel.setBounds(530, 35, 300, 20);
  140. parameterPanel.add(scheduleLabel);
  141. renewableTextfield = new TextField("300");
  142. renewableTextfield.setBounds(425, 60, 95, 20);
  143. parameterPanel.add(renewableTextfield);
  144. JLabel renewableLabel = new JLabel("renewable power per element in watt");
  145. renewableLabel.setBounds(530, 60, 300, 20);
  146. parameterPanel.add(renewableLabel);
  147. // addBatteryTextfield = new TextField("0");
  148. // addBatteryTextfield.setBounds(425, 110, 95, 20);
  149. // parameterPanel.add(addBatteryTextfield);
  150. //
  151. // JLabel addBatteryLabel = new JLabel("add number of certain batterytype");
  152. // addBatteryLabel.setBounds(530, 110, 300, 20);
  153. // parameterPanel.add(addBatteryLabel);
  154. //
  155. // addBatteryTypeTextfield = new TextField("Car");
  156. // addBatteryTypeTextfield.setBounds(425, 135, 95, 20);
  157. // parameterPanel.add(addBatteryTypeTextfield);
  158. //
  159. // JLabel addBatteryTypeLabel = new JLabel("What kind of battery to add");
  160. // addBatteryTypeLabel.setBounds(530, 135, 300, 20);
  161. // parameterPanel.add(addBatteryTypeLabel);
  162. //
  163. // removeBatteryTextfield = new TextField("0");
  164. // removeBatteryTextfield.setBounds(425, 160, 95, 20);
  165. // parameterPanel.add(removeBatteryTextfield);
  166. //
  167. // JLabel removeBatteryLabel = new JLabel("remove number of certain batterytype");
  168. // removeBatteryLabel.setBounds(530, 160, 300, 20);
  169. // parameterPanel.add(removeBatteryLabel);
  170. //
  171. // removeBatteryTypeTextfield = new TextField("Car");
  172. // removeBatteryTypeTextfield.setBounds(425, 205, 95, 20);
  173. // parameterPanel.add(removeBatteryTypeTextfield);
  174. //
  175. // JLabel removeBatteryTypeLabel = new JLabel("What kind of battery to remove");
  176. // removeBatteryTypeLabel.setBounds(530, 205, 300, 20);
  177. // parameterPanel.add(removeBatteryTypeLabel);
  178. return parameterPanel;
  179. }
  180. public JPanel createButtonPanel() {
  181. JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
  182. JButton runButton = new JButton("Run");
  183. runButton.addActionListener(actionEvent -> {
  184. Runnable task = this::run;
  185. runThread = new Thread(task);
  186. runThread.start();
  187. });
  188. buttonPanel.add(runButton);
  189. return buttonPanel;
  190. }
  191. private void run() {
  192. clear();
  193. disableGuiInput(true);
  194. startTimer();
  195. initAlgo();
  196. printElapsedTime();
  197. disableGuiInput(false);
  198. }
  199. private void disableGuiInput(boolean bool) {
  200. control.guiDisable(bool);
  201. }
  202. @Override
  203. public JPanel getPanel() {
  204. return content;
  205. }
  206. @Override
  207. public void setController(Control control) {
  208. this.control = control;
  209. }
  210. private void clear() {
  211. textArea.setText("");
  212. }
  213. private void println(String message) {
  214. lines.add(message);
  215. textArea.append(message + "\n");
  216. }
  217. private void startTimer() {
  218. startTime = System.currentTimeMillis();
  219. }
  220. private void printElapsedTime() {
  221. long elapsedMilliSeconds = System.currentTimeMillis() - startTime;
  222. println("Execution Time of Algo in Milliseconds:" + elapsedMilliSeconds);
  223. }
  224. ///////////////////////////////////////////////////////////////////////////////////
  225. /**
  226. *
  227. */
  228. private void initAlgo() {
  229. try {
  230. // init
  231. renewableProducers = getRenewableProducers();
  232. consumers = getConsumers();
  233. // addCertainKindOfBatteries(Integer.parseInt(addBatteryTextfield.getText()),addBatteryTypeTextfield.getText());
  234. // removeCertainKindOfBatteries(Integer.parseInt(removeBatteryTextfield.getText()), removeBatteryTypeTextfield.getText());
  235. totalNumberOfHouses = consumers.size();
  236. lines = new ArrayList<String>();
  237. lines.add(fileNameTextfield.getText());
  238. if(control.getSimManager().getPowerplant() != null){
  239. powerplant = control.getSimManager().getPowerplant();// DANGER DONT GIVE NULL
  240. }else{
  241. println("No Power plant in model");
  242. return;
  243. }
  244. setPowerPlantBlackstartResistance(-Float.parseFloat(blackstartEnergyrequierementTextfield.getText()));
  245. if(getEnergyRequiredForPowerplantBlackstart() != 0){
  246. SPC = new StorageProductionController(getStorageElements(), getEnergyRequiredForPowerplantBlackstart());// DANGER DONT GIVE NULL
  247. }else{
  248. println("No blackstart Power Plant in Model");
  249. return;
  250. }
  251. control.getModel().setResistanceCalculator(new ResistanceCalculator(
  252. 230,
  253. 10000,
  254. 35, 25,0.017, 0.017));
  255. control.getModel().getResistanceCalculator().setDistancesToCalcResistance(powerplant);
  256. blackstartRunningCounter = 0;
  257. deactivateBlackstart();
  258. control.getModel().setCurIteration(0);
  259. // prepare model
  260. /////////
  261. setRenewableElements(Float.parseFloat(renewableTextfield.getText()));
  262. disablePowerplantProduction();
  263. enableAllConsumers();
  264. SPC.setAllStorageToStandy();
  265. // TODO: prios?
  266. /////////
  267. // Get parameters from textfields
  268. scheduleKind = Integer.parseInt(schedulTextfield.getText());
  269. setPowerPlantBlackstartResistance(-Float.parseFloat(blackstartEnergyrequierementTextfield.getText()));
  270. blackstartSuccessTime = Integer.parseInt(blackstartSuccessTimeTextfield.getText());
  271. powerplantMaxOutput = Float.parseFloat(powerplantMaxOutputTextfield.getText());
  272. blackstartStartTime = Integer.parseInt(blackstartStartTimeTextfield.getText());
  273. control.getModel().setIterations(Integer.parseInt(simulationDurationTextfield.getText()));
  274. for (StorageElement se : getStorageElements()) {
  275. if (se.getEleName().startsWith("Car")) {
  276. se.setStateOfCharge(Float.parseFloat(carStartCharge.getText()));
  277. } else {
  278. se.setStateOfCharge(Float.parseFloat(storageStartCharge.getText()));
  279. }
  280. }
  281. file = Paths.get(fileNameTextfield.getText());
  282. updateVisual();
  283. if (blackstartStartTime + blackstartSuccessTime > control.getModel().getIterations() - 1) {
  284. println("No Time for the blackstart, use working numbers");
  285. } else {
  286. blackstartMain(control.getModel().getCurIteration());
  287. }
  288. } catch (NumberFormatException e) {
  289. println("Worng Input, only numbers please");
  290. }
  291. }
  292. private void blackstartMain(int curIteration) {
  293. try {
  294. Thread.sleep(Integer.parseInt(waitBetweenIterations.getText()));
  295. } catch (InterruptedException e) {
  296. e.printStackTrace();
  297. }
  298. control.getModel().setCurIteration(curIteration);
  299. if (control.getSimManager().blackstartRunning()) {
  300. if (!blackstartAlgo()) {
  301. // blackstart for this iteration was not successfull
  302. deactivateBlackstart();
  303. updateVisual();
  304. println("Simulation of blackstart failed in Iteration: " + curIteration);
  305. writeOutputTxt();
  306. } else {
  307. // blackstart for this iteration was successfull
  308. blackstartRunningCounter++;
  309. if (blackstartRunningCounter == blackstartSuccessTime) {
  310. // blackstart was successfull for the needed iterations
  311. SPC.setAllStorageToStandy();
  312. deactivateBlackstart();
  313. enableAllConsumers();
  314. updateVisual();
  315. println("Simulation of blackstart Successfull in Iteration: " + curIteration);
  316. writeOutputTxt();
  317. } else {
  318. // blackstart not finished yet
  319. updateVisual();
  320. blackstartMain(curIteration + 1);
  321. }
  322. }
  323. } else {
  324. // blackstart has not started yet
  325. if (curIteration == blackstartStartTime) {
  326. activateBlackstart();
  327. disableConsumers();
  328. blackstartMain(curIteration);
  329. } else {
  330. updateVisual();
  331. blackstartMain(curIteration + 1);
  332. }
  333. }
  334. }
  335. /**
  336. * TODO: global resistance calculator?
  337. *
  338. *
  339. * maybes:
  340. * * TODO: prios fuer elemente anschalten
  341. * * TODO: batterie status wechesel fuehrt zu unterversorgung in GUI FIX?: in storage if bei charge auskommentieren
  342. * * TODO: batterie laden prios? entfernung? doppelt sortieren
  343. *
  344. * @return true or false depending on whether the blackstart was successful for
  345. * this iteration
  346. */
  347. private boolean blackstartAlgo() {
  348. printCurrentEnergyState();
  349. if (currentRenewableProduction() < getEnergyRequiredForPowerplantBlackstart()) {
  350. // renewable energy production is not sufficient for the blackstart
  351. if (SPC.currentPossibleStorageProduction() >= getEnergyRequiredForPowerplantBlackstart()
  352. - currentRenewableProduction()) {// is there currently enough power available from storage?
  353. SPC.setAllStorageToStandy();//TODO: placement
  354. SPC.scheduleDischarging(getEnergyRequiredForPowerplantBlackstart() - currentRenewableProduction(), scheduleKind);
  355. rampUpPowerplant();
  356. enableConsumers(getPowerplantProduction());
  357. return true;
  358. } else {
  359. // blackstart has failed
  360. SPC.setAllStorageToStandy();
  361. println("Not enough storage energy available");
  362. return false;
  363. }
  364. } else {try {
  365. Files.write(file, lines, StandardCharsets.UTF_8);
  366. } catch (IOException e) {
  367. e.printStackTrace();
  368. }
  369. //TODO: disable storage?
  370. // renewable energy production is sufficient for the blackstart
  371. rampUpPowerplant();
  372. enableConsumers(
  373. currentRenewableProduction() - getEnergyRequiredForPowerplantBlackstart() + getPowerplantProduction());
  374. return true;
  375. }
  376. }
  377. private ArrayList<StorageElement> getStorageElements() {
  378. ArrayList<StorageElement> storageElements = new ArrayList<>();
  379. for (HolonObject holonObject : control.getModel().getAllHolonObjectsOnCanvas()) {
  380. for (HolonElement ele : holonObject.getElements()) {
  381. if(ele instanceof StorageElement){
  382. storageElements.add((StorageElement) ele);
  383. }
  384. }
  385. }
  386. return storageElements;
  387. }
  388. private void disableConsumers() {
  389. // TODO: disableBatteryLoading? will ich das wirklich?
  390. // SPC.disableStorageProduction();
  391. for (HolonObject consumer : consumers) {
  392. for (HolonElement ele : consumer.getElements()) {
  393. if (ele.isActive() && ele.isConsumer()) {
  394. ele.setActive(false);
  395. }
  396. }
  397. }
  398. }
  399. private void enableConsumers(float energyAvailable) {
  400. // println("current pp production: " + getPowerplantProduction());
  401. // println("energy available for consumers" + energyAvailable);
  402. // Damit wir immer die gleiche ausgangslage haben //TODO: wirklich?
  403. disableConsumers();
  404. // TODO: das ganze lieber mit prirotaeten
  405. for (HolonObject consumer : consumers) {
  406. for (HolonElement ele : consumer.getElements()) {
  407. if (energyAvailable > 0
  408. && energyAvailable - Math.abs(ele.getEnergyPerElement() * ele.getAmount()) >= 0) {//TODO: getenergy ist hier falsch
  409. if (!ele.isActive()) {
  410. ele.setActive(true);
  411. energyAvailable = energyAvailable - Math.abs(ele.getEnergyPerElement() * ele.getAmount());// +
  412. // since
  413. // its
  414. // negative
  415. }
  416. } else {
  417. return;
  418. }
  419. }
  420. }
  421. }
  422. private void enableAllConsumers() {
  423. for (HolonObject consumer : consumers) {
  424. for (HolonElement ele : consumer.getElements()) {
  425. if (!ele.isActive() && ele.isConsumer()) {
  426. ele.setActive(true);
  427. }
  428. }//TODO: storage?
  429. }
  430. }
  431. private void setRenewableElements(float energy){
  432. for (HolonObject house : renewableProducers) {
  433. for (HolonElement ele : house.getElements()) {
  434. if (ele.getEleName().equals("Solar Panels")) {// TODO: hier muss noch mehr dazu
  435. ele.setEnergyPerElement(
  436. control.getModel().getResistanceCalculator().calcEnergyAfterResistance(
  437. energy,
  438. ele.getLowDistance(),
  439. ele.getHighDistance(),
  440. getEnergyRequiredForPowerplantBlackstart()));
  441. }
  442. }
  443. }
  444. }
  445. private float currentRenewableProduction() {
  446. float production = 0;
  447. for (HolonObject house : renewableProducers) {
  448. for (HolonElement ele : house.getElements()) {
  449. if (ele.getEleName().equals("Solar Panels")) {// TODO: hier muss noch mehr dazu
  450. production = production + ele.getEnergyAtTimeStep(control.getModel().getCurIteration());
  451. }
  452. }
  453. }
  454. return production;
  455. }
  456. private void rampUpPowerplant() {
  457. for (HolonElement ele : powerplant.getElements()) {
  458. if (ele.getEleName().equals("Power")) {
  459. ele.setEnergyPerElement(ele.getEnergyPerElement() + powerplantMaxOutput / blackstartSuccessTime);
  460. }
  461. }
  462. }
  463. private float getPowerplantProduction() {
  464. float totalProduction = 0;
  465. for (HolonElement ele : powerplant.getElements()) {
  466. if (ele.getEleName().equals("Power")) {
  467. totalProduction = ele.getEnergyPerElement();
  468. }
  469. }
  470. return totalProduction;
  471. }
  472. private void disablePowerplantProduction() {
  473. for (HolonElement ele : powerplant.getElements()) {
  474. if (ele.getEleName().equals("Power")) {
  475. ele.setEnergyPerElement(0);
  476. }
  477. }
  478. }
  479. private float getEnergyRequiredForPowerplantBlackstart() {
  480. for (HolonElement ele : powerplant.getElements()) {
  481. if (ele.getEleName().equals("Blackstart")) {
  482. return -ele.getEnergyPerElement();
  483. }
  484. }
  485. return 0;
  486. }
  487. private void setPowerPlantBlackstartResistance(float resistance) {
  488. for (HolonElement ele : powerplant.getElements()) {
  489. if (ele.getEleName().equals("Blackstart")) {
  490. ele.setEnergyPerElement(resistance);
  491. }
  492. }
  493. }
  494. private void activateBlackstart() {
  495. for (HolonElement ele : powerplant.getElements()) {
  496. if (ele.getEleName().equals("Blackstart")) {
  497. ele.setActive(true);
  498. }
  499. }
  500. }
  501. private void deactivateBlackstart() {
  502. for (HolonElement ele : powerplant.getElements()) {
  503. if (ele.getEleName().equals("Blackstart")) {
  504. ele.setActive(false);
  505. }
  506. }
  507. }
  508. private LinkedList<HolonObject> getRenewableProducers() {
  509. LinkedList<HolonObject> list = new LinkedList<>();
  510. for (HolonObject holonObject : control.getModel().getAllHolonObjectsOnCanvas()) {
  511. if (holonObject.getObjName().contentEquals("House")) {// TODO: das reicht so nicht da muss noch gecheckt
  512. // werden ob es renewables gibt
  513. list.add(holonObject);
  514. }
  515. }
  516. return list;
  517. }
  518. private LinkedList<HolonObject> getConsumers() {
  519. LinkedList<HolonObject> list = new LinkedList<>();
  520. for (HolonObject holonObject : control.getModel().getAllHolonObjectsOnCanvas()) {
  521. if (holonObject.getObjName().contentEquals("House")) {// TODO: das reicht so nicht da muss noch gecheckt
  522. // werden ob es consumer gibt
  523. list.add(holonObject);
  524. }
  525. }
  526. return list;
  527. }
  528. private void removeCertainKindOfBatteries(int amount, String kind){
  529. int start = highestAmountOfBatteriesOfCertainKindInALLHouse(kind);
  530. while(amount > 0){
  531. for (HolonObject hO : consumers){
  532. if(numberOfCertainKindOfBatteryPerHouse(hO, kind) == start) {
  533. if (delSingleElem(hO, kind)) {
  534. amount--;
  535. }
  536. }
  537. if(amount == 0){
  538. return;
  539. }
  540. }
  541. start--;
  542. }
  543. }
  544. private boolean delSingleElem(HolonObject hO, String kind){
  545. for(HolonElement ele : hO.getElements()){
  546. if(ele.getEleName().startsWith(kind)){
  547. // control.deleteElementCanvas(hO.getId(),ele.getId());
  548. hO.getElements().remove(ele);
  549. return true;
  550. }
  551. }
  552. return false;
  553. }
  554. private int highestAmountOfBatteriesOfCertainKindInALLHouse(String kind){
  555. int count = 0;
  556. for (HolonObject hO : consumers){
  557. int eleCount = numberOfCertainKindOfBatteryPerHouse(hO, kind);
  558. if(eleCount > count){
  559. count = eleCount;
  560. };
  561. }
  562. return count;
  563. }
  564. private void addCertainKindOfBatteries(int amount, String kind){
  565. int start = 0;
  566. while(amount > 0){
  567. for (HolonObject hO : consumers){
  568. if(numberOfCertainKindOfBatteryPerHouse(hO, kind) <= start){
  569. if(kind.startsWith("Car")){
  570. hO.addElement(new StorageElement(kind + start,
  571. 1,
  572. 0,
  573. control.getModel(),
  574. 75000,
  575. 22000,
  576. 22000));
  577. }else{
  578. hO.addElement(new StorageElement(kind + start,
  579. 1,
  580. 0,
  581. control.getModel(),
  582. 13500,
  583. 46000,
  584. 4600));
  585. }
  586. amount--;
  587. }
  588. if(amount == 0){
  589. return;
  590. }
  591. }
  592. start++;
  593. }
  594. }
  595. private int numberOfCertainKindOfBatteryPerHouse(HolonObject house, String kind){
  596. int count = 0;
  597. for(HolonElement ele : house.getElements()){
  598. if(ele.getEleName().startsWith(kind)){
  599. count++;
  600. }
  601. }
  602. return count;
  603. }
  604. private void writeOutputTxt(){
  605. println("totalSOC: " + SPC.getTotalSoc() + "W/m");
  606. try {
  607. Files.write(file, lines, StandardCharsets.UTF_8);
  608. } catch (IOException e) {
  609. e.printStackTrace();
  610. }
  611. }
  612. private void printCurrentEnergyState(){
  613. println("CURRENT ALGORITHM ITERATION: "+ control.getModel().getCurIteration());
  614. println("blackstart resi: " + getEnergyRequiredForPowerplantBlackstart());
  615. println("renewable: " + currentRenewableProduction());
  616. println("totalnumber of houses: " + totalNumberOfHouses);
  617. println("totalcars: " + SPC.getTotalCarNumber() + " totalhomebatteries: " + SPC.getTotalHomeBatteryNumber());
  618. println("possiblestorage: " + SPC.currentPossibleStorageProduction());
  619. println("totalSOC: " + SPC.getTotalSoc() + "W/m");
  620. for (StorageElement ele :
  621. getStorageElements()) {
  622. println(ele.getEleName() + " " + ele.getId() + ", SOC: " + (ele.getStateOfCharge()/60)/1000 + "kWh,"
  623. + " SOC%: " + ele.getStateOfChargeInPercent() *100 +"%"
  624. /*+ " SOC: " + ele.getStateOfCharge() + " watt/min"*/
  625. // + " nominal power: " + ele.getNominalOutRatio()/1000 + " kW, "
  626. + " OutPower: "+ ele.getCurrentMaxOutRatio()/1000 + " kW,"
  627. + " dist: " + (ele.getLowDistance()+ele.getHighDistance()));
  628. }
  629. }
  630. /**
  631. * To let the User See the current state without touching the Canvas.
  632. */
  633. private void updateVisual() {
  634. // System.out.println("Start updateVisual in Iteration: " + control.getModel().getCurIteration());
  635. control.calculateStateAndVisualForCurrentTimeStep();
  636. control.updateCanvas();
  637. // System.out.println("Finish updateVisual in Iteration: " + control.getModel().getCurIteration());
  638. }
  639. }