Advertisement
Guest User

Untitled

a guest
Oct 16th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.51 KB | None | 0 0
  1. /*
  2. * To change this license header, choose License Headers in Project Properties.
  3. * To change this template file, choose Tools | Templates
  4. * and open the template in the editor.
  5. */
  6. package io.gameoftrades.student32.Opdracht_3;
  7.  
  8. import io.gameoftrades.debug.Debuggable;
  9. import io.gameoftrades.debug.Debugger;
  10. import io.gameoftrades.debug.DummyDebugger;
  11. import io.gameoftrades.model.algoritme.StedenTourAlgoritme;
  12. import io.gameoftrades.model.kaart.Kaart;
  13. import io.gameoftrades.model.kaart.Pad;
  14. import io.gameoftrades.model.kaart.Stad;
  15. import io.gameoftrades.student32.Opdracht_2.SnelstePadAlgoritmeImpl;
  16. import java.util.ArrayList;
  17. import java.util.Arrays;
  18. import java.util.HashMap;
  19. import java.util.List;
  20. import java.util.Map;
  21.  
  22. /**
  23. * references: https://archive.fo/JYDMs ,
  24. * https://en.wikipedia.org/wiki/Travelling_salesman_problem,
  25. * https://en.wikipedia.org/wiki/2-opt
  26. *
  27. * @author Groep32 :D
  28. *
  29. * Beschrijving klasse: De klasse StedenTourAlgoritme zoekt de snelste route in
  30. * een wereld van stad naar stad. Elke stad mag maar een keer bezocht worden en
  31. * uiteindelijk moet de route met de laagste kosten opgeslagen worden. Dat is
  32. * dan de meeste efficiënte route voor de handelaar. WIj hebben gebruik gemaakt
  33. * van de algortime: 2-Opt. Per iteratie wordt er een nieuwe route gegenereerd
  34. * door de methode: TwoOptSwap(); De huidige route wordt dan qua kosten
  35. * vergeleken met de volgende kosten van de route en als die beter is dan de
  36. * vorige wordt die opgeslagen als best_distance. Zo gaat de algoritme door
  37. * totdat het geen betere route meer vindt.
  38. */
  39. public class StedenTourAlgoritmeImpl implements StedenTourAlgoritme, Debuggable {
  40.  
  41. private Debugger debug;
  42. private final ArrayList<Stad> newRoute = new ArrayList<>();
  43. private ArrayList<Stad> route;
  44. private final SnelstePadAlgoritmeImpl snelstePad = new SnelstePadAlgoritmeImpl();
  45. private Kaart kaart;
  46. private Pad pad = null;
  47. private double new_distance;
  48. private double best_distance;
  49. private int improve = 0;
  50. private int size;
  51. HashMap<String, Double> bekendPad = new HashMap<>();
  52.  
  53. public StedenTourAlgoritmeImpl() {
  54. this.debug = new DummyDebugger();
  55. this.size = 0;
  56. this.best_distance = 0;
  57. this.new_distance = Double.MAX_VALUE;
  58. }
  59.  
  60. /**
  61. * Methode berekend meest efficiënte route
  62. *
  63. * @param kaart
  64. * @param steden
  65. * @return
  66. */
  67. @Override
  68. public List<Stad> bereken(Kaart kaart, List<Stad> steden) {
  69. reset();
  70. this.kaart = kaart;
  71. route = new ArrayList<>(steden);
  72. size = route.size();
  73.  
  74. for (int i = 0; i < size; i++) {
  75. newRoute.add(route.get(i));
  76. }
  77. best_distance = iterateSteden(route);
  78. improveRoute();
  79. debug.debugSteden(kaart, route);
  80. return route;
  81. }
  82.  
  83. /**
  84. * Methode checkt nog 100 keer of er een betere/snellere route is dan de
  85. * huidige gevonden route, door met de methode 2OptSwap() de steden posities
  86. * te veranderen en daarvan de best distances te berekenen.
  87. */
  88. public void improveRoute() {
  89. whileLoop:
  90. while (improve < 100) {
  91. for (int i = 1; i < size - 1; i++) {
  92. for (int k = i + 1; k < size; k++) {
  93. TwoOptSwap(i, k);
  94. new_distance = iterateSteden(newRoute);
  95. compareNewToBest(new_distance, best_distance);
  96. improve++;
  97. debug.debugSteden(kaart, newRoute);
  98. newRoute.clear();
  99. if (improve == 100) {
  100. System.out.println("\nBeste Route: " + Arrays.toString(route.toArray()));
  101. System.out.println(best_distance + " punten..");
  102. break whileLoop;
  103. }
  104. }
  105. }
  106. }
  107. }
  108.  
  109. /**
  110. * Methode vergelijkt de huidige routekosten met de nieuw gevonden route
  111. * kosten en geeft de goedkoopste routekosten terug.
  112. *
  113. * @param newDistance
  114. * @param bestDistance
  115. */
  116. public void compareNewToBest(double newDistance, double bestDistance) {
  117.  
  118. if (new_distance < best_distance) {
  119. improve = 0;
  120. route.clear();
  121. for (int j = 0; j < size; j++) {
  122. route.add(j, newRoute.get(j));
  123. }
  124.  
  125. System.out.println("New distance: " + new_distance);
  126. System.out.println(Arrays.toString(route.toArray()));
  127. best_distance = new_distance;
  128. }
  129. }
  130.  
  131. /**
  132. * Methode loopt door alle steden en telt de kosten van stad naar stad op.
  133. * Ook worden de routes tussen de steden opgeslagen in een Hashmap, hierdoor
  134. * kunnen we met behulp van de klasse Node.java de afstanden cachen.
  135. * Hierdoor hoeft de algoritme bepaalde routes niet opnieuw te berekenen en
  136. * zal dit wat tijd besparen.
  137. *
  138. * @param listRoute
  139. * @return
  140. */
  141. public double iterateSteden(ArrayList<Stad> listRoute) {
  142. double distanceTotaal = 0;
  143. double distance = 0;
  144. for (int i = 0; i < listRoute.size(); i++) {
  145. Stad huidig = listRoute.get(i);
  146. Stad eind = listRoute.get(i + 1);
  147. CacheKosten n = new CacheKosten(huidig.getCoordinaat(), eind.getCoordinaat());
  148.  
  149. if (bekendPad.containsKey(n.toString())) {
  150. for (Map.Entry<String, Double> entry : bekendPad.entrySet()) {
  151. if (entry.getKey().equals(n.toString())) {
  152. distanceTotaal += entry.getValue();
  153. break;
  154. }
  155. }
  156. } else {
  157. pad = snelstePad.bereken(kaart, huidig.getCoordinaat(), eind.getCoordinaat());
  158. distanceTotaal += pad.getTotaleTijd();
  159. distance = pad.getTotaleTijd();
  160. bekendPad.put(n.toString(), distance);
  161. }
  162. if (i == listRoute.size() - 2) {
  163. break;
  164. }
  165. }
  166. return distanceTotaal;
  167. }
  168.  
  169. /**
  170. * Methode swapt op verschillende manieren de steden in een route List, om
  171. * verschillende route mogelijkheden te hebben.
  172. *
  173. * @param i
  174. * @param k
  175. */
  176. private void TwoOptSwap(int i, int k) {
  177.  
  178. int size = route.size();
  179.  
  180. // 1. Take route[0] to route[i-1] and add them in order to new_route
  181. for (int c = 0; c <= i - 1; ++c) {
  182. newRoute.add(c, route.get(c));
  183. }
  184.  
  185. // 2. Take route[i] to route[k] and add them in reverse order to new_route
  186. int dec = 0;
  187. for (int c = i; c <= k; ++c) {
  188. newRoute.add(c, route.get(k - dec));
  189. dec++;
  190. }
  191.  
  192. // 3. Take route k+1 to end and add them in order to new_route
  193. for (int c = k + 1; c < size; ++c) {
  194. newRoute.add(c, route.get(c));
  195. }
  196. }
  197.  
  198. /**
  199. * Methode reset alle variabelen.
  200. */
  201. public void reset() {
  202. size = 0;
  203. best_distance = 0;
  204. new_distance = 0;
  205. improve = 0;
  206. pad = null;
  207. }
  208.  
  209. /**
  210. * Toont algoritme naam bij keuzemenu
  211. *
  212. * @return
  213. */
  214. @Override
  215. public String toString() {
  216. return "Stedentour Algoritme :D";
  217. }
  218.  
  219. /**
  220. * Methode uit Debuggable interface
  221. *
  222. * @param debugger
  223. */
  224. @Override
  225. public void setDebugger(Debugger d) {
  226. this.debug = d;
  227. }
  228. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement