Ifi6057strategies

Allikas: Lambda

8-Puzzle: vali ülesanne (testprob) ja soovitav otsingustrateegia. Hoiatus: kõik strateegiad ei pruugi mõistliku aja jooksul valmis saada, eriti Pythonis.

Python (pane aima-python-master kataloogi):

#eight.py

import search

badmoves = {4 : 3, 7: 6, 3 : 4, 6 : 7} # "teleporting" across board

class EightPuzzle(search.Problem):
    def actions(self, state):
        al = []
        tyhik = state[0]
        for offset in [-3, -1, 1, 3]:
            koht = tyhik + offset
            if koht >= 1 and koht <= 9 and badmoves.get(tyhik) != koht:
                al.append(koht)
        return al

    def result(self, state, action):
        newstate = [action]
        for el in state[1:]:
            if el == action:
                newstate.append(state[0])
            else:
                newstate.append(el)
        return tuple(newstate)

    def goal_test(self, state):
        return self.goal == state

GOAL = (9, 1, 2, 3 ,4 ,5, 6, 7, 8)

def test(initial, searchfunc):
    p = EightPuzzle(initial, GOAL)
    ip = search.InstrumentedProblem(p)
    n=searchfunc(ip)

    # expanded/goal tests/leaves/(solution)
    print (ip)
    if hasattr(n, "path"):
        print (n.path())
    else:
        print (n)

if __name__ == "__main__":
    a = (7, 2, 5, 3 ,1 ,8, 6, 4, 9)
    b = (5, 2, 6, 3, 4, 9, 8, 7, 1)
    c = (4, 2, 3, 8, 1, 9, 7, 6, 5)

    testprob = a

    test(testprob, search.breadth_first_tree_search)
    #test(testprob, search.breadth_first_search)
    #test(testprob, search.depth_first_tree_search)
    #test(testprob, search.depth_first_graph_search)
    def dls(param):
        return search.depth_limited_search(param, 7)
    #test(testprob, dls)
    #test(testprob, search.iterative_deepening_search)

Java (pane aima-gui/src/main/java/aima/gui/demo/search kataloogi):

//eight.java

package aima.gui.demo.search;

import java.util.Iterator;
import java.util.List;
import java.util.Properties;

import aima.core.agent.Action;
import aima.core.environment.eightpuzzle.EightPuzzleBoard;
import aima.core.environment.eightpuzzle.EightPuzzleFunctionFactory;
import aima.core.search.framework.GoalTest;
import aima.core.search.framework.GraphSearch;
import aima.core.search.framework.Problem;
import aima.core.search.framework.Search;
import aima.core.search.framework.SearchAgent;
import aima.core.search.framework.TreeSearch;
import aima.core.search.uninformed.BreadthFirstSearch;
import aima.core.search.uninformed.DepthFirstSearch;
import aima.core.search.uninformed.DepthLimitedSearch;
import aima.core.search.uninformed.IterativeDeepeningSearch;

class MyGoalTest implements GoalTest {
	EightPuzzleBoard goal = new EightPuzzleBoard(new int[] { 1, 2, 3, 4, 5,
			6, 7, 8, 0 });

	public boolean isGoalState(Object state) {
		EightPuzzleBoard board = (EightPuzzleBoard) state;
		return board.equals(goal);
	}
}

public class eight {
	static void test(EightPuzzleBoard initial, Search searchfunc) {
		try {
			Problem problem = new Problem(initial, EightPuzzleFunctionFactory
					.getActionsFunction(), EightPuzzleFunctionFactory
					.getResultFunction(), new MyGoalTest());

			SearchAgent agent = new SearchAgent(problem, searchfunc);
			printInstrumentation(agent.getInstrumentation());
			printActions(agent.getActions());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	static EightPuzzleBoard a = new EightPuzzleBoard(
			new int[] { 4, 1, 3, 7, 2, 6, 0, 5, 8 });

	static EightPuzzleBoard b = new EightPuzzleBoard(
			new int[] { 8, 1, 3, 4, 0, 2, 7, 6, 5 });

	static EightPuzzleBoard c = new EightPuzzleBoard(
			new int[] { 4, 1, 2, 0, 8, 7, 6, 3, 5 });

	public static void main(String[] args) {
		EightPuzzleBoard testprob = a;

		test(testprob, new BreadthFirstSearch(new TreeSearch()));
//		test(testprob, new BreadthFirstSearch(new GraphSearch()));
//		test(testprob, new DepthFirstSearch(new TreeSearch()));
//		test(testprob, new DepthFirstSearch(new GraphSearch()));
//		test(testprob, new DepthLimitedSearch(7));
//		test(testprob, new IterativeDeepeningSearch());
	}

	private static void printInstrumentation(Properties properties) {
		Iterator<Object> keys = properties.keySet().iterator();
		while (keys.hasNext()) {
			String key = (String) keys.next();
			String property = properties.getProperty(key);
			System.out.println(key + " : " + property);
		}
	}

	private static void printActions(List<Action> actions) {
		for (int i = 0; i < actions.size(); i++) {
			String action = actions.get(i).toString();
			System.out.println(action);
		}
	}
}