Advertisement
Guest User

Untitled

a guest
Feb 28th, 2020
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.54 KB | None | 0 0
  1. package kb;
  2.  
  3. import java.util.PriorityQueue;
  4. import java.util.HashSet;
  5. import java.util.Set;
  6. import java.util.List;
  7. import java.util.Comparator;
  8. import java.util.ArrayList;
  9. import java.util.Collections;
  10.  
  11. public class KB {
  12.  
  13.     public static void main(String[] args) {
  14.         ArrayList<Node> titik = new ArrayList<Node>();
  15.  
  16.         titik.add(new Node("A", 180));
  17.         titik.add(new Node("B", 90));
  18.         titik.add(new Node("C", 89));
  19.         titik.add(new Node("D", 0));
  20.         titik.add(new Node("E", 110));
  21.         titik.add(new Node("F", 79));
  22.         titik.add(new Node("G", 100));
  23.  
  24.         titik.get(0).tetangga = new Edge[]{
  25.             new Edge(titik.get(1), 79),
  26.             new Edge(titik.get(6), 63),
  27.             new Edge(titik.get(5), 81)
  28.         };
  29.         titik.get(1).tetangga = new Edge[]{
  30.             new Edge(titik.get(0), 79),
  31.             new Edge(titik.get(6), 55),            
  32.             new Edge(titik.get(2), 131),
  33.             new Edge(titik.get(3), 109)
  34.         };
  35.         titik.get(2).tetangga = new Edge[]{
  36.             new Edge(titik.get(1), 131),
  37.             new Edge(titik.get(3), 88),};
  38.  
  39.         titik.get(3).tetangga = new Edge[]{
  40.             new Edge(titik.get(1), 109),
  41.             new Edge(titik.get(5), 126),
  42.             new Edge(titik.get(2), 88),
  43.             new Edge(titik.get(4), 92),};
  44.  
  45.         titik.get(4).tetangga = new Edge[]{
  46.             new Edge(titik.get(5), 148),
  47.             new Edge(titik.get(3), 92),};
  48.  
  49.         titik.get(5).tetangga = new Edge[]{
  50.             new Edge(titik.get(6), 60),
  51.             new Edge(titik.get(0), 81),
  52.             new Edge(titik.get(3), 126),};
  53.        
  54.         titik.get(6).tetangga = new Edge[]{
  55.             new Edge(titik.get(0), 63),
  56.             new Edge(titik.get(1), 55),
  57.             new Edge(titik.get(5), 60),};
  58.        
  59.         AstarSearch(titik.get(0), titik.get(3));
  60.         List<Node> path = printPath(titik.get(3));
  61.         System.out.println("Perhitungan dengan algoritma A* dari titik A Ke D");
  62.         System.out.println("path :" + path);
  63.  
  64.     }
  65.  
  66.     public static List<Node> printPath(Node target) {
  67.         List<Node> path = new ArrayList<Node>();
  68.         for (Node node = target; node != null; node = node.parent) {
  69.             path.add(node);
  70.         }
  71.         Collections.reverse(path);
  72.         return path;
  73.     }
  74.  
  75.     public static void AstarSearch(Node source, Node goal) {
  76.  
  77.         Set<Node> explored = new HashSet<>();
  78.  
  79.         PriorityQueue<Node> queue = new PriorityQueue<>(20, (Node i, Node j) -> {
  80.             if (i.f_scores > j.f_scores) {
  81.                 return 1;
  82.             } else if (i.f_scores < j.f_scores) {
  83.                 return -1;
  84.             } else {
  85.                 return 0;
  86.             }
  87.         }
  88.         );
  89.  
  90.         source.g_scores = 0;
  91.  
  92.         queue.add(source);
  93.  
  94.         boolean found = false;
  95.  
  96.         while ((!queue.isEmpty()) && (!found)) {
  97.  
  98.             Node current = queue.poll();
  99.  
  100.             explored.add(current);
  101.  
  102.             if (current.value.equals(goal.value)) {
  103.                 found = true;
  104.             }
  105.  
  106.             for (Edge e : current.tetangga) {
  107.                 Node child = e.target;
  108.                 double cost = e.cost;
  109.                 double temp_g_scores = current.g_scores + cost;
  110.                 double temp_f_scores = temp_g_scores + child.h_scores;
  111.  
  112.                 if ((explored.contains(child))
  113.                         && (temp_f_scores >= child.f_scores)) {
  114.                     continue;
  115.                 }
  116.                 else if ((!queue.contains(child))
  117.                         || (temp_f_scores < child.f_scores)) {
  118.  
  119.                     child.parent = current;
  120.                     child.g_scores = temp_g_scores;
  121.                     child.f_scores = temp_f_scores;
  122.  
  123.                     if (queue.contains(child)) {
  124.                         queue.remove(child);
  125.                     }
  126.                     queue.add(child);
  127.  
  128.                 }
  129.  
  130.             }
  131.  
  132.         }
  133.  
  134.     }
  135.  
  136. }
  137.  
  138. class Node {
  139.  
  140.     public final String value;
  141.     public double g_scores;
  142.     public double f_scores = 0;
  143.     public Edge[] tetangga;
  144.     public Node parent;
  145.     public final double h_scores;
  146.  
  147.     public Node(String val, double hVal) {
  148.         value = val;
  149.         h_scores = hVal;
  150.     }
  151.  
  152.     public String toString() {
  153.         return value;
  154.     }
  155.  
  156. }
  157.  
  158. class Edge {
  159.  
  160.     public final double cost;
  161.     public final Node target;
  162.  
  163.     public Edge(Node targetNode, double costVal) {
  164.         target = targetNode;
  165.         cost = costVal;
  166.     }
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement