• Aucun résultat trouvé

Algorithmes de recherche g´en´eriques

N/A
N/A
Protected

Academic year: 2022

Partager "Algorithmes de recherche g´en´eriques"

Copied!
18
0
0

Texte intégral

(1)

Il est toujours possible d’´ecrire `a la pi`ece un algorithme de recherche pour un besoin sp´ecifique. Il est cependant plus productif d’´ecrire sa boˆıte `a outil d’algorithmes de recherche

”g´en´erique”. Nous devons pour cela d´efinir :

• Une fa¸con d’exprimer le probl`eme

• Une ou plusieurs fa¸cons de repr´esenter une frange

• Une structure permettant d’encoder un nœud de l’arbre de recherche

• Les algorithmes de recherche !

En cours nous avons vu desinterfaces de chacune de ces composantes. Reste `a les mettre en œuvre.

(2)

Une approche g´ en´ erique. . .

Pro : meilleure conception, utilisabilit´e accrue Cons : plus de code `a ´ecrire !

Prenons Java comme langage d’impl´ementation1.

Nous avons besoin de manipuler un´etat, et ce quelque soit le probl`eme. Soit IState une interface permettant de manipuler des ´etats de mani`ere polymorphique.

interface IState { }

1Je ne programme pasJava, aussi, je ne suis pas au fait des facilit´es templateoffertes par les nouveaux compilateurs et qui devraient ˆetre ici

(3)

Tous les probl`emes seront manipul´es via cette interface : interface IProblem {

public IState INIT();

public boolean GOAL( IState state );

public LinkedList< Triplet > SUCCESSOR_FN(IState state);

}

o`u Triplet est une structure permettant de stocker :

<action,nouvel-etat,step-cost>.

(4)

Les interfaces

Nous allons manipuler diff´erents types de frange (qui d´efiniront le type de recherche effectu´ee).

interface IFrange {

public Node REMOVE_FIRST();

public boolean EMPTY();

public void INSERT_ALL(LinkedList <Node> l);

public void INSERT(Node n);

(5)

Une classe pour repr´esenter un nœud : class Node {

private Node parent;

private IState etat;

private int path_cost,profondeur;

private String action;

public IState STATE() {return etat;}

public int PATH_COST() {return path_cost;}

public int DEPTH() {return profondeur;}

public Node PARENT() {return parent;}

public String ACTION() {return action;}

public Node(IState state, Node parent, String action, int costChemin, int depth) {}

public Node(IState state) {}

(6)

Les classes

Dans le doute : class Triplet {

private IState state;

private String action;

private int step_cost;

public Triplet(IState state_,String action_, int step_cost_) { state = state_;

action = action_;

step_cost = step_cost_;

}

public IState getState() {return state;}

public String getAction() {return action;}

public int getStepCost() {return step_cost;}

(7)

Pour la recherche en largeur d’abord, nous avons besoin d’une file FIFO :

class FIFO implements IFrange {

private LinkedList < Node > frange;

public FIFO() { frange = new LinkedList <Node>(); } public Node

REMOVE_FIRST() { return frange.removeLast(); } public boolean EMPTY() { return frange.size() == 0;}

public void

INSERT_ALL(LinkedList <Node> l) {frange.addAll(0,l);}

public void INSERT(Node n) { frange.addFirst(n);}

(8)

Les classes

Tous lessolverspartagent ces fonctions : class ISolver {

protected void SOLUTION(Node node) { /* to do */}

protected LinkedList< Node >

EXPAND(IProblem problem, Node node) {

LinkedList< Node > succs = new LinkedList< Node >();

for ( Triplet t : problem.SUCCESSOR_FN(node.STATE()) ) succs.add(

new Node(t.getState(), node, t.getAction(), node.PATH_COST() + t.getStepCost(), node.DEPTH() + 1));

return succs;

}

(9)

Il ne manque que l’algorithme de recherche : class TreeSearch extends ISolver {

public TreeSearch(IProblem problem, IFrange fringe) { fringe.INSERT(new Node(problem.INIT()));

do {

Node node = fringe.REMOVE_FIRST();

if (problem.GOAL(node.STATE())) { SOLUTION(node); } fringe.INSERT_ALL(EXPAND(problem,node));

}

while (fringe.EMPTY() == false);

}

(10)

Et enfin ... le probl` eme en lui mˆ eme !

class StateAspirateur implements IState { private boolean dirty [];

private int pos_x; // la position du robot

public StateAspirateur(int x, boolean dirt []) { dirty = new boolean [dirt.length];

System.arraycopy(dirt,0,dirty,0,dirt.length);

pos_x = x;

}

public int getPos() {return pos_x;}

(11)

public boolean allClean() {

for (int i=0; i<dirty.length; ++i) if (dirty[i]) return false;

return true;

}

public void setDirtLocation(int pos, boolean dirt) { dirty[pos] = dirt;

}

public String toString() { String s = "";

for (boolean b : dirty) s += (b + " ");

return "pos=" + pos_x + " dirt=[ " + s + "]";

}

(12)

Et enfin ... le probl` eme en lui mˆ eme !

class ProblemAspirateur implements IProblem { private static final int N = 8;

private static final int STEP_COST = 1;

public IState INIT() {

boolean dirty[] = {true, false, true, true, true, true, true, false};

return new StateAspirateur(1,dirty);

}

public boolean GOAL(IState state) {

return ((StateAspirateur) state).allClean();

}

public LinkedList< Triplet >

SUCCESSOR_FN( IState istate ) {

StateAspirateur state = (StateAspirateur) istate;

(13)

// action 1 : aspirer

if (state.getDirtLocations()[state.getPos()]) { succs.add(

new Triplet(

new StateAspirateur( state.getPos(), state.getDirtLocations()),

"Aspire", STEP_COST ));

StateAspirateur etat =

(StateAspirateur) succs.getLast().getState();

etat.setDirtLocation(state.getPos(),false);

(14)

Et enfin ... le probl` eme en lui mˆ eme !

if (((StateAspirateur) state).getPos() > 0) succs.add( // action 2 : aller a gauche

new Triplet(

new StateAspirateur(state.getPos()-1,

state.getDirtLocations()),

"Gauche", STEP_COST ));

if (state.getPos() < (N-1) )

succs.add( // action 3 : aller a droite new Triplet (

new StateAspirateur(state.getPos()+1, state.getDirtLocations()),

"Droite", STEP_COST ));

return succs;

(15)

Graph-Search

Solution de cout: 13 profondeur: 13 nodes extended: 823 pos=1 dirt=[ D . D D D D D . ]

Gauche pos=0 dirt=[ D . D D D D D . ] Aspire pos=0 dirt=[ . . D D D D D . ] Droite pos=1 dirt=[ . . D D D D D . ] Droite pos=2 dirt=[ . . D D D D D . ] Aspire pos=2 dirt=[ . . . D D D D . ] Droite pos=3 dirt=[ . . . D D D D . ] Aspire pos=3 dirt=[ . . . . D D D . ] Droite pos=4 dirt=[ . . . . D D D . ] Aspire pos=4 dirt=[ . . . D D . ] Droite pos=5 dirt=[ . . . D D . ] Aspire pos=5 dirt=[ . . . D . ] Droite pos=6 dirt=[ . . . D . ]

(16)

Aspirateur en largeur, Tree-Search

Solution de cout: 13 profondeur: 13 nodes extended: 97579 pos=1 dirt=[ D . D D D D D . ]

Gauche pos=0 dirt=[ D . D D D D D . ] Aspire pos=0 dirt=[ . . D D D D D . ] Droite pos=1 dirt=[ . . D D D D D . ] Droite pos=2 dirt=[ . . D D D D D . ] Aspire pos=2 dirt=[ . . . D D D D . ] Droite pos=3 dirt=[ . . . D D D D . ] Aspire pos=3 dirt=[ . . . . D D D . ] Droite pos=4 dirt=[ . . . . D D D . ] Aspire pos=4 dirt=[ . . . D D . ] Droite pos=5 dirt=[ . . . D D . ] Aspire pos=5 dirt=[ . . . D . ] Droite pos=6 dirt=[ . . . D . ]

(17)

Graph-Search

Solution de cout: 11 profondeur: 11 nodes extended: 29 Rive 1 M3 C3 ~~~ M0 C0

action [1 each] Rive 2 M2 C2 ~~~ M1 C1 action [1 miss] Rive 1 M3 C2 ~~~ M0 C1 action [2 cann] Rive 2 M3 C0 ~~~ M0 C3 action [1 cann] Rive 1 M3 C1 ~~~ M0 C2 action [2 miss] Rive 2 M1 C1 ~~~ M2 C2 action [1 each] Rive 1 M2 C2 ~~~ M1 C1 action [2 miss] Rive 2 M0 C2 ~~~ M3 C1 action [1 cann] Rive 1 M0 C3 ~~~ M3 C0 action [2 cann] Rive 2 M0 C1 ~~~ M3 C2 action [1 cann] Rive 1 M0 C2 ~~~ M3 C1

(18)

Cannibale en largeur, Tree-Search

Solution de cout: 11 profondeur: 11 nodes extended: 11852 Rive 1 M3 C3 ~~~ M0 C0

action [1 each] Rive 2 M2 C2 ~~~ M1 C1 action [1 miss] Rive 1 M3 C2 ~~~ M0 C1 action [2 cann] Rive 2 M3 C0 ~~~ M0 C3 action [1 cann] Rive 1 M3 C1 ~~~ M0 C2 action [2 miss] Rive 2 M1 C1 ~~~ M2 C2 action [1 each] Rive 1 M2 C2 ~~~ M1 C1 action [2 miss] Rive 2 M0 C2 ~~~ M3 C1 action [1 cann] Rive 1 M0 C3 ~~~ M3 C0 action [2 cann] Rive 2 M0 C1 ~~~ M3 C2 action [1 cann] Rive 1 M0 C2 ~~~ M3 C1

Références

Documents relatifs

Este proyecto tuvo como objetivo el fortalecimiento de capacidades de las Organizaciones Comunitarias de Servicios de Agua y Saneamiento (OCSAS), término empleado para referirnos

SemRep was selected because of its ability to extract three- part propositions (or semantic predications) from biomedical texts (Rindflesch &amp; Fisz- man, 2003). To obtain

Figure 2 (a) in Section 4 provides an example il- lustrating the correlations between the degree de-coupled PageR- ank (D2PR) scores and external evidence for different values of p

We have tried to quantify a residual trend in stratospheric water vapour entry mixing ratios from the difference between NOAA FP and HALOE middle latitude measurements to val-

First, we show how Theorem 2.1 can be used to derive non-trivial analytical results by specializing the count formulae for the 5-path, the bull, and the spinning top subgraphs, to

For each project, there exists a unique activity network without redundant arcs but since there îs an infinité numher of different sized eventnetworks, the problem is tofind an

Our method is independent of the classification method (Support Vector Machine, K-Nearest Neighbours, Neural Network, etc.), however, in any case we need to transform each

 Les éléments du namespace xsl sont des instructions qui copient des données du document source dans le résultat.  Les autres éléments sont inclus tels quels dans