Академический Документы
Профессиональный Документы
Культура Документы
Solving Problems
by
Searching
Problem solving
We want:
To automatically solve a problem
We need:
A representation of the problem
Algorithms that use some strategy to solve
the problem defined in that representation
Backtracking
Backtracking is a general algorithm for
finding all (or some) solutions to some
computational problems, notably constraint
satisfaction problems, that incrementally
builds candidates to the solutions, and
abandons each partial candidate c
("backtracks") as soon as it determines that
c cannot possibly be completed to a valid
solution.
Backtracking
The classic textbook example of the use of
backtracking is the eight queens puzzle, that asks
for all arrangements of eight chess queens on a
standard chessboard so that no queen attacks any
other. In the common backtracking approach, the
partial candidates are arrangements of k queens
in the first k rows of the board, all in different rows
and columns. Any partial solution that contains two
mutually attacking queens can be abandoned,
since it cannot possibly be completed to a valid
solution.
Backtracking
Backtracking is an important tool for
solving constraint satisfaction problems,
such as crosswords, verbal arithmetic,
Sudoku, and many other puzzles.
Source:
https://en.wikipedia.org/wiki/Backtracking
PROLOG Backtracking
The term Nondeterministic algorithm
refers to a class of algorithms in which
computational progress may correctly follow
several different paths. Since we are satisfied that
the algorithm computes the solution to a particular
problem even if only one such path leads to
termination with a solution, nondeterministic
algorithms require a strategy for exploring the
multiple paths that may emanate from some
choice point. The simplest such strategy, which
Prolog uses, is called blind backtracking.
PROLOG Backtracking
Starting from some initial value, a backtrack
program incrementally constructs a solution by
extending the current partial solution with some
legal choice. If the partial solution becomes a
complete solution it is returned. Otherwise, upon
reaching a dead end, the program backtracks to
the previous choice point, discards the choice it
made there, and continues as though that choice
were illegal in the first place.
It may happen that every possible choice is
examined and rejected, in which case the problem
has no solution. Prolog will also backtrack if you
tell it to search for additional solutions to a
problem.
Problem representation
General:
State space: a problem is divided into a set
of resolution steps from the initial state to the
goal state
Reduction to sub-problems: a problem is
arranged into a hierarchy of sub-problems
Specific:
Game resolution
Constraints satisfaction
States
A problem is defined by its elements and their
relations.
In each instant of the resolution of a problem,
those elements have specific descriptors (How
to select them?) and relations.
A state is a representation of those elements in
a given moment.
Two special states are defined:
Initial state (starting point)
Final state (goal state)
State modification:
successor function
A successor function is needed to move
between different states.
A successor function is a description of
possible actions, a set of operators. It is a
transformation function on a state
representation, which convert it into another
state.
The successor function defines a relation of
accessibility among states.
Representation of the successor function:
Conditions of applicability
Transformation function
State space
The state space is the set of all states
reachable from the initial state.
It forms a graph (or map) in which the nodes are
states and the arcs between nodes are actions.
A path in the state space is a sequence of
states connected by a sequence of actions.
The solution of the problem is part of the map
formed by the state space.
Problem solution
A solution in the state space is a path from the
initial state to a goal state or, sometimes, just a
goal state.
Path/solution cost: function that assigns a
numeric cost to each path, the cost of applying
the operators to the states
Solution quality is measured by the path cost
function, and an optimal solution has the
lowest path cost among all solutions.
Solutions: any, an optimal one, all. Cost is
important depending on the problem and the
type of solution sought.
Problem description
Components:
Example: 8-puzzle
State space: configuration of the eight
tiles on the board
Initial state: any configuration
Goal state: tiles in a specific order
Operators or actions: blank moves
Condition: the move is within the board
Transformation: blank moves Left, Right, Up,
or Down
Example: n queens
(n = 4, n = 8)
Example: n queens
(n = 4, n = 8)
State space: configurations from 0 to n queens on
the board with only one queen per row and
column
Initial state: configuration without queens on the
board
Goal state: configuration with n queens such that
no queen attacks any other
Operators or actions: place a queen on the
board
Romania
Whats the problem?
Accomplish a goal
Reach Bucharest by 13:00
Romania
Whats an example of a non-goal-based
problem?
Live long and prosper
Maximize the happiness of your trip to
Romania
Dont get hurt too much
Romania
What qualifies as a solution?
You can/cannot reach Bucharest by 13:00
The actions one takes to travel from Arad to
Bucharest along the shortest (in time) path
Romania
What additional information does one
need?
A map
An initial state
A goal state
Choose a representation
An initial state
A goal state
A function defining state
transitions
A function defining the cost of a
state sequence
eWhile
eAlgorithm
Arad
Arad
Successors= generate_successors(Current)
Successors= process_repeated(Successors, Closed_states,
Open_states)
Open_states.insert(Successors)
Arad
Zerind (75)
Timisoara (118)
Sibiu (140)
Arad
Zerind (75)
Timisoara (118)
Sibiu (140)
Successors= generate_successors(Current)
Successors= process_repeated(Successors, Closed_states,
Open_states)
Open_states.insert(Successors)
Arad
Zerind (75)
Timisoara (118)
Dradea (151)
Sibiu (140)
Faragas (99)
Node
Data structure constituting part of a search
tree
Includes parent, children, depth, path cost g(x)
Search strategies
A strategy is defined by picking the order of node
expansion
Strategies are evaluated along the following
dimensions:
Completeness does it always find a solution if
one exists?
Time complexity number of nodes
generated/expanded
Space complexity maximum nodes in memory
Optimality does it always find a least-cost
solution?
Search strategies
Time and space complexity are measured in
terms of:
b maximum branching factor of the search tree
(may be infinite)
d depth of the least-cost solution
m maximum depth of the state space (may be
infinite)
Nodes
Open nodes:
Generated, but not yet explored
Explored, but not yet expanded
Closed nodes:
Explored and expanded
40
Breadth-first search
Expand shallowest unexpanded node
Implementation:
fringe is a FIFO queue, i.e., new successors
go at end
Breadth-first search
Expand shallowest unexpanded node
Implementation:
fringe is a FIFO queue, i.e., new successors go
at end
Breadth-first search
Expand shallowest unexpanded node
Implementation:
fringe is a FIFO queue, i.e., new successors
go at end
Breadth-first search
Expand shallowest unexpanded node
Implementation:
fringe is a FIFO queue, i.e., new successors
go at end
Depth-first search
Expand deepest unexpanded node
Implementation:
fringe = LIFO queue, i.e., put successors at front
Depth-first search
Expand deepest unexpanded node
Implementation:
fringe = LIFO queue, i.e., put successors at front
Depth-first search
Expand deepest unexpanded node
Implementation:
fringe = LIFO queue, i.e., put successors at front
Depth-first search
Expand deepest unexpanded node
Implementation:
fringe = LIFO queue, i.e., put successors at front
Depth-first search
Expand deepest unexpanded node
Implementation:
fringe = LIFO queue, i.e., put successors at front
Depth-first search
Expand deepest unexpanded node
Implementation:
fringe = LIFO queue, i.e., put successors at front
Depth-first search
Expand deepest unexpanded node
Implementation:
fringe = LIFO queue, i.e., put successors at front
Depth-first search
Expand deepest unexpanded node
Implementation:
fringe = LIFO queue, i.e., put successors at front
Depth-first search
Expand deepest unexpanded node
Implementation:
fringe = LIFO queue, i.e., put successors at front
Depth-first search
Expand deepest unexpanded node
Implementation:
fringe = LIFO queue, i.e., put successors at front
Depth-first search
Expand deepest unexpanded node
Implementation:
fringe = LIFO queue, i.e., put successors at front
Depth-first search
Expand deepest unexpanded node
Implementation:
fringe = LIFO queue, i.e., put successors at front
Comparison of Strategies
Breadth-first is complete and optimal, but
has high space complexity
Depth-first is space efficient, but neither
complete nor optimal
Iterative deepening is asymptotically
optimal
Repeated States
No
Few
8-queens
Many
1 2 3
search tree is infinite
4 5
7 8 6
assembly
planning
Avoids loops
Solution 2:
Keep track of all states generated so far
If the state of a new node has already been generated, then
discard the node
Uniform-Cost Strategy
Each step has some cost.
The cost of the path to each fringe node N is
g(N) = costs of all steps.
The goal is to generate a solution path of minimal cost.
The queue FRINGE is sorted in increasing cost.
S
A
S
5 B 5
15
10
1
11
B
G
0
5
10
15
Summary
Search tree state space
Search strategies: breadth-first, depthfirst, and variants
Evaluation of strategies: completeness,
optimality, time and space complexity
Avoiding repeated states
Optimal search with variable step costs
- Albert Einstein