Ifi6057w5

Allikas: Lambda

5. Nädal

Lokaalne otsing; AIMA chapter 4.1-4.1.1.

Lühendatud slaidid: PDF

N-Queens hill climbing otsinguga

Harjutustund

Heuristiline otsing.

Toorik koos testseisudega:

import search

class EightPuzzle(search.Problem):
    def actions(self, state):
        space = state.index(0)
        row = space // 3
        col = space % 3

        act = []
        if row == 0:
            act.append(state[space + 3])
        elif row == 1:
            act.append(state[space + 3])
            act.append(state[space - 3])
        elif row == 2:
            act.append(state[space - 3])
        if col == 0:
            act.append(state[space + 1])
        elif col == 1:
            act.append(state[space + 1])
            act.append(state[space - 1])
        elif col == 2:
            act.append(state[space - 1])
        return act

    def result(self, state, action):
        newstate = list(state)
        klotsi_idx = newstate.index(action)
        space = newstate.index(0)
        newstate[space] = action
        newstate[klotsi_idx] = 0
        return tuple(newstate)

    def h1(self, node):
        h = 0
        for i in range(9):
            if node.state[i] != 0:
                if node.state[i] != self.goal[i]:
                    h += 1
        return h

    def h2(self, node):
        rightpos = {
            1 : (0, 0),
            2: (0, 1),
            3: (0, 2),
            4: (1, 0),
            5: (1, 1),
            6: (1, 2),
            7: (2, 0),
            8: (2, 1),
        }
        h = 0
        for i in range(9):
            if node.state[i] != 0:
                row = i // 3
                col = i % 3
                goal_row, goal_col = rightpos[node.state[i]]
                h += abs(row - goal_row)
                h += abs(col - goal_col)
        return h



inistate = (1,2,3,7,0,5,8,4,6)
test1=(1,4,3,8,6,2,7,0,5)
test2=(2,1,8,0,4,3,7,6,5)
test3=(2,1,8,4,6,3,0,7,5)
test4=(5,7,6,4,0,8,3,2,1)
test5=(0,1,5,7,3,2,8,4,6)

goal = (1,2,3,4,5,6,7,8,0)
#problem = EightPuzzle(inistate, goal)
problem = EightPuzzle(test3, goal)

#print(problem.actions(goal))
#print(problem.result(inistate, 7))

#asi = search.breadth_first_tree_search(problem)
#si = search.breadth_first_search(problem)
asi = search.astar_search(problem, problem.h2)
print(asi.solution())
#print(asi.path())