Advertisement
Guest User

Untitled

a guest
Feb 20th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.53 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Random;
  3. import java.util.Stack;
  4.  
  5. public class AntColony {
  6.  
  7. private static Random random = new Random();
  8.  
  9. public static void main(String[] args) {
  10. // LABEL VERTEX
  11. String[][] label = new String[8][2];
  12. label[0][0] = "A";
  13. label[0][1] = "City Market Palopo";
  14. label[1][0] = "B";
  15. label[1][1] = "Toko Baru";
  16. label[2][0] = "C";
  17. label[2][1] = "Pasar Andi Tadda Palopo";
  18. label[3][0] = "D";
  19. label[3][1] = "Opsal Plaza";
  20. label[4][0] = "E";
  21. label[4][1] = "Toko Matahari";
  22. label[5][0] = "F";
  23. label[5][1] = "Pusat Niaga Palopo";
  24. label[6][0] = "G";
  25. label[6][1] = "Mega Plaza";
  26. label[7][0] = "H";
  27. label[7][1] = "Mangga Dua";
  28.  
  29. // MATRIKS ADJACENCY
  30. double[][] adjacency = { { 0, 0.5, 1.6, 1.3, 1.7, 1.7, 1.7, 2.3 }, { 0.5, 0, 1.1, 0.8, 1.2, 1.2, 1.2, 2.2 },
  31. { 1.6, 1.1, 0, 0.85, 1.2, 1.2, 1.2, 2.3 }, { 1.3, 0.8, 0.85, 0, 0.55, 0.55, 0.4, 1.4 },
  32. { 2.4, 1.9, 1.1, 0.55, 0, 0.11, 0.35, 1.6 }, { 2.4, 1.9, 1.1, 0.55, 0.11, 0, 0.35, 1.6 },
  33. { 1.7, 1.2, 1.2, 0.4, 0.35, 0.35, 0, 1.2 }, { 2.3, 2.2, 2.3, 1.4, 1.5, 1.6, 1.2, 0 } };
  34.  
  35. // INISIALISASI PARAMETER
  36. double tou_awal = 0.01;// ---->menyatakan intensitas awal pheromone (jejak semut) disetiap vertex
  37. int n = adjacency.length;// -->jumlah vertex
  38. double Q = 1;// -------------->konstanta siklus semut
  39. double alpha = 1;// ---------->Konstanta pengendali intensitas jejak semut
  40. double beta = 1;// ----------->Konstanta pengendali visibilitas
  41. double rho = 0.5;// ---------->Tetapan penguapan jejak semut (penguapan pheromone)
  42. int m = 10;// ---------------->Banyaknya Semut
  43. int NC_MAX = 18;// ---------->Banyaknya Siklus Semut
  44.  
  45. /**
  46. * PERSIAPAN MEMULAI SIKLUS SEMUT
  47. */
  48.  
  49. // VISIBILITAS ANTAR VERTEX (invers jarak dinotasikan dg simbol eta)
  50. double[][] eta = new double[n][n];
  51. for (int i = 0; i < eta.length; i++) {
  52. for (int j = 0; j < eta[i].length; j++) {
  53. if (adjacency[i][j] > 0) {
  54. eta[i][j] = 1.0 / adjacency[i][j];
  55. } else {
  56. eta[i][j] = 0;
  57. }
  58. }
  59. }
  60.  
  61. // INISIALISASI MATRIX TOU. mula-mulai nilainya sama untuk setiap edge
  62. // yaitu sebesar tou_awal
  63. double[][] tou = new double[n][n];
  64. for (int i = 0; i < tou.length; i++) {
  65. for (int j = 0; j < tou[i].length; j++) {
  66. if (adjacency[i][j] > 0) {
  67. tou[i][j] = tou_awal;
  68. } else {
  69. tou[i][j] = 0;
  70. }
  71. }
  72. }
  73.  
  74. /**
  75. * MEMULAI SIKLUS SEMUT
  76. */
  77. for (int nc = 1; nc <= NC_MAX; nc++) {// melakukan looping siklus sebanyak NC_MAX
  78. System.out.println("SIKLUS-" + nc);
  79. double[][] deltaTou = new double[n][n];
  80.  
  81. // menebar semut buatan (artificial ants) ke vertex-vertex secara
  82. // random
  83. for (int semut = 0; semut < m; semut++) {
  84. System.out.println("-->Semut-" + (1 + semut));
  85.  
  86. // menyediakan object stack untuk menyimpan vertex yang telah
  87. // dikunjungi
  88. // serta agar semut dapat bergerak mundur
  89. Stack stackVertex = new Stack();
  90.  
  91. // memilih vertex pertama untuk dikunjungi secara acak
  92. int vo = randomBetweenInteger(0, (n - 1));
  93. stackVertex.push(vo);// menambahkan vo ke stack
  94.  
  95. boolean[] block = new boolean[n];// membuat array block untuk menandai vertex yang sudah pernah dikunjungi
  96. block[vo] = true;
  97.  
  98. int nVisited = 1;// baru ada satu vertex yang dikunjungi yaitu vertex awal (vo)
  99. while (!stackVertex.isEmpty() && nVisited < n) {
  100. int vertexAsal = (int) stackVertex.peek();
  101.  
  102. // mencari kandidat Vertex tujuan dari semua vertex yang
  103. // terhubung ke vertexAsal dan belum terblock
  104. ArrayList<Double> kandidatVertexTujuan = new ArrayList<Double>();
  105. for (int j = 0; j < n; j++) {
  106. if (adjacency[vertexAsal][j] > 0 && block[j] == false) {
  107. kandidatVertexTujuan.add((double) j);
  108. }
  109. }
  110.  
  111. if (kandidatVertexTujuan.isEmpty()) {// jika kandidatVertexTujuan KOSONG/EMPTY
  112. // jika tidak ditemukan kandidatVertexTujuan maka semut
  113. // akan bergerak mundur
  114. // secara struktur data gerakan mundur ini dilakukan
  115. // melalui operasi pop() pada stack
  116. stackVertex.pop();
  117. } else {
  118. // jika ditemukan kandidatVertexTujuan
  119. // maka hitung probabilitas ke masing-masing vertex
  120. // kandidat menggunakan
  121. // formula probabilitas semut
  122. // pembilang = tou_ij_pangkat_alpha +
  123. // eta_ij_pangkat_beta
  124. ArrayList<Double> pembilang = new ArrayList<Double>();
  125. double penyebut = 0;
  126. int i = vertexAsal;
  127. for (int k = 0; k < kandidatVertexTujuan.size(); k++) {
  128. int j = (int) Math.floor(kandidatVertexTujuan.get(k));
  129. double tou_ij_pangkat_alpha = Math.pow(tou[i][j], alpha);
  130. double eta_ij_pangkat_beta = Math.pow(eta[i][j], beta);
  131. double tou_ij_pangkat_alpha_plus_eta_ij_pangkat_beta = tou_ij_pangkat_alpha
  132. + eta_ij_pangkat_beta;
  133. pembilang.add(tou_ij_pangkat_alpha_plus_eta_ij_pangkat_beta);
  134. penyebut += tou_ij_pangkat_alpha_plus_eta_ij_pangkat_beta;
  135. }
  136.  
  137. // improve menggunakan roda roulette
  138. ArrayList<Double> probabilitasKomulatif = new ArrayList<Double>();
  139. double MAX_SUM_PROB_KOMULATIF = 0;
  140.  
  141. // hitung probabilistik ke setiap vertex kandidat
  142. ArrayList<Double> p_ij = new ArrayList<Double>();
  143. for (int k = 0; k < pembilang.size(); k++) {
  144. double peluang = pembilang.get(k) / penyebut;
  145. p_ij.add(peluang);
  146. MAX_SUM_PROB_KOMULATIF += peluang;
  147. probabilitasKomulatif.add(MAX_SUM_PROB_KOMULATIF);
  148. }
  149.  
  150. // bangkitkan sebuah bilangan acak r antara
  151. // [0..MAX_SUM_PROB_KOMULATIF] untuk memilih vertex
  152. // tujuan
  153. double r = randomBetweenDouble(0, MAX_SUM_PROB_KOMULATIF);
  154. int vertexTujuan = (int) Math.floor(kandidatVertexTujuan.get(kandidatVertexTujuan.size() - 1));// -1;
  155. for (int k = 0; k < probabilitasKomulatif.size(); k++) {
  156. if (r <= probabilitasKomulatif.get(k)) {
  157. vertexTujuan = (int) Math.floor(kandidatVertexTujuan.get(k));
  158. break;
  159. }
  160. }
  161.  
  162. // semut menemuan vertex baru
  163. stackVertex.push(vertexTujuan);
  164. block[vertexTujuan] = true;
  165. nVisited++;
  166. System.out.print(vertexAsal + " - " + vertexTujuan + "; ");
  167.  
  168. }
  169. }
  170.  
  171. System.out.println();
  172. }
  173.  
  174. }
  175.  
  176. }
  177.  
  178. private static int randomBetweenInteger(int min, int max) {
  179. if (min >= max) {
  180. throw new IllegalArgumentException("nilai variabel max harus lebih besar dari nilai variabel min");
  181. }
  182. return random.nextInt((max - min) + 1) + min;
  183. }
  184.  
  185. private static double randomBetweenDouble(double min, double max) {
  186. if (min >= max) {
  187. throw new IllegalArgumentException("nilai variabel max harus lebih besar dari nilai variabel min");
  188. }
  189. return (random.nextDouble() * ((max - min) + 1)) + min;
  190. }
  191.  
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement