Advertisement
Guest User

Untitled

a guest
Feb 21st, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.02 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 = {
  31. { 0, 0.5, 1.6, 1.3, 1.7, 1.7, 1.7, 2.3 },
  32. { 0.5, 0, 1.1, 0.8, 1.2, 1.2, 1.2, 2.2 },
  33. { 1.6, 1.1, 0, 0.85, 1.2, 1.2, 1.2, 2.3 },
  34. { 1.3, 0.8, 0.85, 0, 0.55, 0.55, 0.4, 1.4 },
  35. { 2.4, 1.9, 1.1, 0.55, 0, 0.11, 0.35, 1.6 },
  36. { 2.4, 1.9, 1.1, 0.55, 0.11, 0, 0.35, 1.6 },
  37. { 1.7, 1.2, 1.2, 0.4, 0.35, 0.35, 0, 1.2 },
  38. { 2.3, 2.2, 2.3, 1.4, 1.5, 1.6, 1.2, 0 } };
  39.  
  40. // INISIALISASI PARAMETER
  41. double tou_awal = 0.01;// ---->menyatakan intensitas awal pheromone (jejak semut) disetiap vertex
  42. int n = adjacency.length;// -->jumlah vertex
  43. double Q = 1;// -------------->konstanta siklus semut
  44. double alpha = 0.5;// ---------->Konstanta pengendali intensitas jejak semut
  45. double beta = 0.5;// ----------->Konstanta pengendali visibilitas
  46. double rho = 0.5;// ---------->Tetapan penguapan jejak semut (penguapan pheromone)
  47. int m = 100;// ---------------->Banyaknya Semut
  48. int NC_MAX = 1000;// ---------->Banyaknya Siklus Semut
  49.  
  50. /**
  51. * PERSIAPAN MEMULAI SIKLUS SEMUT
  52. */
  53.  
  54. // VISIBILITAS ANTAR VERTEX (invers jarak dinotasikan dg simbol eta)
  55. double[][] eta = new double[n][n];
  56. for (int i = 0; i < eta.length; i++) {
  57. for (int j = 0; j < eta[i].length; j++) {
  58. if (adjacency[i][j] > 0) {
  59. eta[i][j] = 1.0 / adjacency[i][j];
  60. } else {
  61. eta[i][j] = 0;
  62. }
  63. }
  64. }
  65.  
  66. // INISIALISASI MATRIX TOU. mula-mulai nilainya sama untuk setiap edge
  67. // yaitu sebesar tou_awal
  68. double[][] tou = new double[n][n];
  69. for (int i = 0; i < tou.length; i++) {
  70. for (int j = 0; j < tou[i].length; j++) {
  71. if (adjacency[i][j] > 0) {
  72. tou[i][j] = tou_awal;
  73. } else {
  74. tou[i][j] = 0;
  75. }
  76. }
  77. }
  78.  
  79. //MEMPERSIAPKAN arrayList MST untuk menyimpan Spanning Tree dengan total bobot paling minimum yang didapatkan oleh semut
  80. //NILAI MST INI AKAN DIEVALUASI MELALUI OPERASI ELITISM DISETIAP AKHIR SIKLUS
  81. ArrayList<Edge>mst = null;
  82. double bestValue = Double.MAX_VALUE;
  83.  
  84. /**
  85. * MEMULAI SIKLUS SEMUT
  86. */
  87. for (int nc = 1; nc <= NC_MAX; nc++) {// melakukan looping siklus sebanyak NC_MAX
  88. System.out.println("SIKLUS-" + nc);
  89. double[][] deltaTou = new double[n][n];
  90. double[] Lk = new double[m];
  91.  
  92. //PERSIAPKAN VARIABEL UNTUK MENYIMPAN NILAI DARI SEMUT TERBAIK
  93. ArrayList<Edge>mstSemutTerbaik = null;
  94. double valueSemutTerbaik = Double.MAX_VALUE;
  95.  
  96. // menebar semut buatan (artificial ants) ke vertex-vertex secara
  97. // random
  98. for (int semut = 0; semut < m; semut++) {
  99. System.out.println("-->Semut-" + (1 + semut));
  100.  
  101. // menyediakan object stack untuk menyimpan vertex yang telah
  102. // dikunjungi
  103. // serta agar semut dapat bergerak mundur
  104. Stack stackVertex = new Stack();
  105.  
  106. // memilih vertex pertama untuk dikunjungi secara acak
  107. int vo = randomBetweenInteger(0, (n - 1));
  108. stackVertex.push(vo);// menambahkan vo ke stack
  109.  
  110. boolean[] block = new boolean[n];// membuat array block untuk menandai vertex yang sudah pernah dikunjungi
  111. block[vo] = true;
  112.  
  113.  
  114.  
  115. //INISIALISASI EDGE UNTUK MENGKONSTRUKSI MST
  116. ArrayList<Edge>edges = new ArrayList<Edge>();//
  117. //Lk
  118. double L_semut = 0.0;
  119.  
  120. int nVisited = 1;// baru ada satu vertex yang dikunjungi yaitu vertex awal (vo)
  121. while (!stackVertex.isEmpty() && nVisited < n) {
  122. int vertexAsal = (int) stackVertex.peek();
  123.  
  124. // mencari kandidat Vertex tujuan dari semua vertex yang
  125. // terhubung ke vertexAsal dan belum terblock
  126. ArrayList<Double> kandidatVertexTujuan = new ArrayList<Double>();
  127. for (int j = 0; j < n; j++) {
  128. if (adjacency[vertexAsal][j] > 0 && block[j] == false) {
  129. kandidatVertexTujuan.add((double) j);
  130. }
  131. }
  132.  
  133. if (kandidatVertexTujuan.isEmpty()) {// jika kandidatVertexTujuan KOSONG/EMPTY
  134. // jika tidak ditemukan kandidatVertexTujuan maka semut
  135. // akan bergerak mundur
  136. // secara struktur data gerakan mundur ini dilakukan
  137. // melalui operasi pop() pada stack
  138. stackVertex.pop();
  139. } else {
  140. // jika ditemukan kandidatVertexTujuan
  141. // maka hitung probabilitas ke masing-masing vertex
  142. // kandidat menggunakan
  143. // formula probabilitas semut
  144. // pembilang = tou_ij_pangkat_alpha +
  145. // eta_ij_pangkat_beta
  146. ArrayList<Double> pembilang = new ArrayList<Double>();
  147. double penyebut = 0;
  148. int i = vertexAsal;
  149. for (int k = 0; k < kandidatVertexTujuan.size(); k++) {
  150. int j = (int) Math.floor(kandidatVertexTujuan.get(k));
  151. double tou_ij_pangkat_alpha = Math.pow(tou[i][j], alpha);
  152. double eta_ij_pangkat_beta = Math.pow(eta[i][j], beta);
  153. double tou_ij_pangkat_alpha_plus_eta_ij_pangkat_beta = tou_ij_pangkat_alpha + eta_ij_pangkat_beta;
  154. pembilang.add(tou_ij_pangkat_alpha_plus_eta_ij_pangkat_beta);
  155. penyebut += tou_ij_pangkat_alpha_plus_eta_ij_pangkat_beta;
  156. }
  157.  
  158. // improve menggunakan roda roulette
  159. ArrayList<Double> probabilitasKomulatif = new ArrayList<Double>();
  160. double MAX_SUM_PROB_KOMULATIF = 0;
  161.  
  162. // hitung probabilistik ke setiap vertex kandidat
  163. ArrayList<Double> p_ij = new ArrayList<Double>();
  164. for (int k = 0; k < pembilang.size(); k++) {
  165. double peluang = pembilang.get(k) / penyebut;
  166. p_ij.add(peluang);
  167. MAX_SUM_PROB_KOMULATIF += peluang;
  168. probabilitasKomulatif.add(MAX_SUM_PROB_KOMULATIF);
  169. }
  170.  
  171. // bangkitkan sebuah bilangan acak r antara
  172. // [0..MAX_SUM_PROB_KOMULATIF] untuk memilih vertex
  173. // tujuan
  174. double r = randomBetweenDouble(0, MAX_SUM_PROB_KOMULATIF);
  175. int vertexTujuan = -1;//(int) Math.floor(kandidatVertexTujuan.get(kandidatVertexTujuan.size() - 1));// -1;
  176. for (int k = 0; k < probabilitasKomulatif.size(); k++) {
  177. if (r <= probabilitasKomulatif.get(k)) {
  178. vertexTujuan = (int) Math.floor(kandidatVertexTujuan.get(k));
  179. break;
  180. }
  181. }
  182.  
  183. // semut menemuan vertex baru
  184. stackVertex.push(vertexTujuan);
  185. block[vertexTujuan] = true;
  186. double bobot = adjacency[vertexAsal][vertexTujuan];
  187. L_semut += bobot;
  188. edges.add(new Edge(vertexAsal,vertexTujuan,bobot));
  189. nVisited++;
  190. System.out.print(vertexAsal + " - " + vertexTujuan + "; ");
  191. }
  192. }
  193. //SEMUT TELAH BERHASIL MEMBENTUK SATU SOLUSI MST
  194. System.out.println("L Semut: "+L_semut);
  195. Lk[semut]=L_semut;
  196. //LAKUKAN UPDATE DELTA TOU OLEH SEMUT
  197. if(!edges.isEmpty()){
  198. for(Edge edge:edges){
  199. deltaTou[edge.vertexAsal][edge.vertexTujuan] += (Q/L_semut);
  200. }
  201. }
  202.  
  203. //EVALUASI NILAI SEMUT TERBAIK
  204. if(L_semut<valueSemutTerbaik && edges!=null){
  205. valueSemutTerbaik = L_semut;
  206. mstSemutTerbaik = edges;
  207. }
  208.  
  209. }//end of for semut (masing-masing semut mencari solusi MST)
  210.  
  211. //UPDATE TOU SEBELUM LANJUT KE SIKLUS BERIKUTNYA
  212. for (int i = 0; i < tou.length; i++) {
  213. for (int j = 0; j < tou[i].length; j++) {
  214. if (adjacency[i][j] > 0 && deltaTou[i][j]>0) {
  215. tou[i][j] = rho * tou[i][j]+deltaTou[i][j];
  216. } else {
  217. tou[i][j] = 0;
  218. }
  219. }
  220. }
  221.  
  222. //OPERASI ELITISME
  223. //EVALUASI NILAI SEMUT TERBAIK
  224. if(valueSemutTerbaik<bestValue && mstSemutTerbaik!=null){
  225. bestValue = valueSemutTerbaik;
  226. mst = mstSemutTerbaik;
  227. }
  228.  
  229. }//end of siklus semut
  230.  
  231. //PRINT BEST VALUE
  232. System.out.println();
  233. System.out.println("PROSES SIKLUS ANT COLONY SELESAI...");
  234. System.out.println("BEST VALUE: "+bestValue);
  235. if(mst!=null){
  236. System.out.println("MST: ");
  237. for(Edge edge:mst){
  238. int i = edge.vertexAsal;
  239. int j = edge.vertexTujuan;
  240. //System.out.print(i+"-"+j+"; ");
  241. System.out.print(label[i][1]+" - "+label[j][1]+"; ");
  242. }
  243. }
  244.  
  245. }
  246.  
  247. private static int randomBetweenInteger(int min, int max) {
  248. if (min >= max) {
  249. throw new IllegalArgumentException("nilai variabel max harus lebih besar dari nilai variabel min");
  250. }
  251. return random.nextInt((max - min) + 1) + min;
  252. }
  253.  
  254. private static double randomBetweenDouble(double min, double max) {
  255. if (min >= max) {
  256. throw new IllegalArgumentException("nilai variabel max harus lebih besar dari nilai variabel min");
  257. }
  258. return (min + random.nextDouble() * (max - min));
  259. }
  260.  
  261. }
  262.  
  263. class Edge{
  264. int vertexAsal;
  265. int vertexTujuan;
  266. double bobot;
  267.  
  268. public Edge(int vertexAsal, int vertexTujuan) {
  269. super();
  270. this.vertexAsal = vertexAsal;
  271. this.vertexTujuan = vertexTujuan;
  272. }
  273.  
  274. public Edge(int vertexAsal, int vertexTujuan, double bobot) {
  275. super();
  276. this.vertexAsal = vertexAsal;
  277. this.vertexTujuan = vertexTujuan;
  278. this.bobot = bobot;
  279. }
  280.  
  281. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement