Tugas AI forum 1. Adversarial search dan Constraints Satisfaction problem Adversarial search merupakan metode pencarian yang pada dasarnya bekerja dengan cara menemukan berbagai kemungkinan yang ada dalam mengatasi sebuah masalah baik itu yang merupakan efektif maupun yang tidak akan tetap dicari berbagai kemungkinan yang ada . Contoh Implementasinya ada di permainan catur , dalam permainan ini tentu saja banyak sekali kemungkinan untuk sebuah pion catur bergerak dan juga banyak konfigurasi hasil dari papan catur , dan dari user sendiri bisa menentukan dari berbagai kemungkinan bergerak yang ada manakah yang merupakan strategi yang efektif dalam menghadapi lawannya. Bagaimana melakukannya ? yaitu dengan menggunakan algoritma pencarian contohnya : mini-maks algoritma dan algoritma Alpha-beta. Mini-Maks Algoritma Algoritma mini-maks menjadi suatu dasar dalam sistem permainan AI seperti catur , othello dan lain - lain , dimana cara kerjanya membuka dan mencari berbagai kemungkinan yang ada dalam bermain permainan tersebut hingga akhir game selesai . Kerugiannya sangat membutuhkan sumber daya yang besar untuk melakukan proses tersebut tetapi keuntungannya melalui algoritma mini - maks ini dapat mengidentifikasikan kemungkinan posisi berjalan yang terbaik untuk menghasilkan keputusan akhir yang terbaik juga , karena sistem dari algoritma mini-maks berjalan rekursif hingga membuat lawan mendapatkan kerugian yang minimum. Hasil dari pencarian berbagai kemungkinan jalan dan posisi yang yang ada menghasilkan sebuah pohon permainan yang nanti akan diidentifikasikan mana yang termasuk kemungkinan yang terbaik. Dalam penentuan keputusan max/min tersebut dibutuhkan suatu nilai yang merepresentasikan kerugian atau keuntungan yang akan diperoleh jika langkah tersebut dipilih. Untuk itulah disini digunakan sebuah fungsi heuristik. Fungsi heuristik yang digunakan algoritma ini adalah fungsi heuristik statis (Kusumadewi, 2003). Fungsi heuristik digunakan untuk mengevaluasi nilai sebagai nilai yang merepresentasikan hasil permainan yang akan terjadi jika langkah tersebut dipilih. Dari nilainilai heuristik inilah komputer akan menentukan simpul mana dari pohon permainan yang akan dipilih, tentunya simpul yang akan dipilih tersebut adalahsimpul dengan nilai heuristik yang akan menuntun permainan ke hasil akhir yang menguntungkan bagi computer Constraints Satisfaction problem defnisi : Merupakan sebuah problem matematika yang didefinisikan sebagai suatu set objek yang kondisinya harus dapat memenuhi sejumlah batasan . Constraints Satisfaction Problem merepresentasikan entitas dalam sebuah problem sebagai kolek homogen atas variabel, yang diselesaikan dengan menggunakan metode Contraints Satisfaction. contoh : Map coloring , dimana dalam pemetaannya kedua negara atau wilayah yang berdampingan tidak boleh memiliki warna yang sama untuk membedakan. 2. Proporsional Logic sebuah logika yang menangani atau memproses dan memanipulasi penarikan kesimpulan yang logis dari setiap pernyataan yang hanya memiliki nilai benar atau salah . Contoh: A= Anda rajin belajar. B = Anda lulus ujian. C = Anda senang. Bentuk argumen : Jika A, maka B Jika B, maka C Jika A maka C Pernyataan 1 dan 2 merupakan premis-premis dari argumen, sedangkan pernyataan 3 merupakan kesimpulan yang berasal dari premis-premisnya. p q p^q pvq ~p : Hari ini hujan : Murid-murid diliburkan dari sekolah : Hari ini hujan dan murid-murid diliburkan dari sekolah : Hari ini hujan atau murid-murid diliburkan dari sekolah : Tidak benar hari ini hujan (atau: Hari ini tidak hujan) 3. Algoritma A* package aStar; import java.util.ArrayList; import java.util.Collections; import aStar.heuristics.AStarHeuristic; import aStar.utils.Logger; public class AStar { private AreaMap map; private AStarHeuristic heuristic; //private int startX; //private int startY; //private int goalX; //private int goalY; /** * closedList The list of Nodes not searched yet, sorted by their distance to the goal as guessed by our heuristic. */ private ArrayList<Node> closedList; private SortedNodeList openList; private Path shortestPath; Logger log = new Logger(); AStar(AreaMap map, AStarHeuristic heuristic) { this.map = map; this.heuristic = heuristic; closedList = new ArrayList<Node>(); openList = new SortedNodeList(); } public Path calcShortestPath(int startX, int startY, int goalX, int goalY) { //this.startX = startX; //this.startY = startY; //this.goalX = goalX; //this.goalY = goalY; //mark start and goal node map.setStartLocation(startX, startY); map.setGoalLocation(goalX, goalY); //Check if the goal node is blocked (if it is, it is impossible to find a path there) if (map.getNode(goalX, goalY).isObstacle) { return null; } map.getStartNode().setDistanceFromStart(0); closedList.clear(); openList.clear(); openList.add(map.getStartNode()); //while we haven't reached the goal yet while(openList.size() != 0) { //get the first Node from non-searched Node list, sorted by lowest distance from our goal as guessed by our heuristic Node current = openList.getFirst(); // check if our current Node location is the goal Node. If it is, we are done. if(current.getX() == map.getGoalLocationX() && current.getY() == map.getGoalLocationY()) { return reconstructPath(current); } //move current Node to the closed (already searched) list openList.remove(current); closedList.add(current); //go through all the current Nodes neighbors and calculate if one should be our next step for(Node neighbor : current.getNeighborList()) { boolean neighborIsBetter; //if we have already searched this Node, don't bother and continue to the next one if (closedList.contains(neighbor)) continue; //also just continue if the neighbor is an obstacle if (!neighbor.isObstacle) { // calculate how long the path is if we choose this neighbor as the next step in the path float neighborDistanceFromStart = (current.getDistanceFromStart() + map.getDistanceBetween(current, neighbor)); //add neighbor to the open list if it is not there if(!openList.contains(neighbor)) { openList.add(neighbor); neighborIsBetter = true; //if neighbor is closer to start it could also be better } else if(neighborDistanceFromStart < current.getDistanceFromStart()) { neighborIsBetter = true; } else { neighborIsBetter = false; } // set neighbors parameters if it is better if (neighborIsBetter) { neighbor.setPreviousNode(current); neighbor.setDistanceFromStart(neighborDistanceFromStart); neighbor.setHeuristicDistanceFromGoal(heuristic.getEstimatedDistanceT oGoal(neighbor.getX(), neighbor.getY(), map.getGoalLocationX(), map.getGoalLocationY())); } } } } return null; } public void printPath() { Node node; for(int x=0; x<map.getMapWith(); x++) { if (x==0) { for (int i=0; i<=map.getMapWith(); i++) System.out.print("-"); System.out.println(); } System.out.print("|"); for(int y=0; y<map.getMapHeight(); y++) { node = map.getNode(x, y); if (node.isObstacle) { System.out.print("X"); } else if (node.isStart) { System.out.print("s"); } else if (node.isGoal) { System.out.print("g"); } else if (shortestPath.contains(node.getX(), node.getY())) { System.out.print("¤"); } else { System.out.print(" "); } if (y==map.getMapHeight()) System.out.print("_"); } System.out.print("|"); System.out.println(); } for (int i=0; i<=map.getMapWith(); i++) System.out.print("-"); } private Path reconstructPath(Node node) { Path path = new Path(); while(!(node.getPreviousNode() == null)) { path.prependWayPoint(node); node = node.getPreviousNode(); } this.shortestPath = path; return path; } private class SortedNodeList { private ArrayList<Node> list = new ArrayList<Node>(); public Node getFirst() { return list.get(0); } public void clear() { list.clear(); } public void add(Node node) { list.add(node); Collections.sort(list); } public void remove(Node n) { list.remove(n); } public int size() { return list.size(); } public boolean contains(Node n) { return list.contains(n); } } } Algoritma A package d; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Stack; public class a { final int MAX = 100; // This array holds the flight information. d flights[] = new d[MAX]; int numFlights = 0; // number of entries in flight array Stack btStack = new Stack(); // backtrack stack Stack optimal; // holds optimal solution int mincost = 10000; public static void main(String args[]) { String to, from; a ob = new a(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); boolean done = false; d f; ob.setup(); try { System.out.print("From? "); from = br.readLine(); System.out.print("To? "); to = br.readLine(); do { ob.isflight(from, to); if (ob.btStack.size() == 0) done = true; else { ob.route(to); ob.btStack = new Stack(); } } while (!done); // Display optimal solution. if (ob.optimal != null) { System.out.println("Optimal solution is: "); int num = ob.optimal.size(); for (int i = 0; i < num; i++) { f = (d) ob.optimal.pop(); System.out.print(f.from + " to "); } System.out.println(to); System.out.println("minium cost is " + ob.mincost); } } catch (IOException exc) { System.out.println("Error on input."); } } // Initialize the flight database. void setup() { addFlight("Mexico", "Stadium", 900); addFlight("Stadium", "4_killo", 1000); addFlight("Stadium", "Megengna", 500); addFlight("4_killo", "Megengna", 1800); addFlight("4_killo", "6_killo", 1700); addFlight("Mexico", "Pissa",2500); addFlight("Pissa", "6_killo", 500); addFlight("6_killo", "4_killo",1000); addFlight("Stadium", "Pissa", 1000); addFlight("Pissa", "4_killo", 1500); addFlight("Mexico", "Kera", 1000); //addFlight("Kera", "Stadium", 15); } // Put flights into the database. void addFlight(String from, String to, int dist) { if (numFlights < MAX) { flights [numFlights] = new d(from, to, dist); numFlights++; } else System.out.println("Flight database full.\n"); } // Save shortest route. void route(String to) { int dist = 0; d f; int num = btStack.size(); Stack optTemp = new Stack(); for (int i = 0; i < num; i++) { f = (d) btStack.pop(); optTemp.push(f); // save route dist += f.cost; } // If shorter, keep this route if (mincost > dist) { optimal = optTemp; mincost = dist; } } /* * If there is a flight between from and to, return the distance of flight; * otherwise, return 0. */ int match(String from, String to) { for (int i = numFlights - 1; i > -1; i--) { if (flights[i].from.equals(from) && flights[i].to.equals(to) && !flights[i].skip) { flights[i].skip = true; // prevent reuse return flights[i].cost; } } return 0; // not found } // Given from, find any connection using least-cost. d find(String from) { int pos = -1; int dist = 10000; // longer than longest route for (int i = 0; i < numFlights; i++) { if (flights[i].from.equals(from) && !flights[i].skip) { // Use the shortest flight. if (flights[i].cost < dist) { pos = i; dist = flights[i].cost; } } } if (pos != -1) { flights[pos].skip = true; // prevent reuse d f = new d(flights[pos].from, flights[pos].to, flights[pos].cost); return f; } return null; } // Determine if there is a route between from and to. void isflight(String from, String to) { int dist; d f; // See if at destination. dist = match(from, to); if (dist != 0) { btStack.push(new d(from, to, dist)); return; } // Try another connection. f = find(from); if (f != null) { btStack.push(new d(from, to, f.cost)); isflight(f.to, to); } else if (btStack.size() > 0) { // Backtrack and try another connection. f = (d) btStack.pop(); isflight(f.from, f.to); } } Sumber Referensi : http://rinaforall.blogspot.com/2013/04/algoritma-minimax.html http://digilib.ittelkom.ac.id/index.php?option=%20com_content&view=article&id=1090:alg oritma-minimax&catid=21:itp-informatika-teori-dan-pemograman&Itemid=14 http://id.wikipedia.org/wiki/Minimax http://jar28pratama.blogspot.com/2010/12/algoritma-google-search.html Russel,Stuart dkk.2010.Artificial Intelegence - A Modern Approach.New Jersey : Pearson