Sunteți pe pagina 1din 11

Universitatea de Vest din Timi³oara

Departamentul de Informatic  Aritoni Ovidiu

Inteligent,   Articial  2011-2012


Tutorial 1

Strategii de c utare informate si neinformate ,

1 Excursie în Banat
Harta din gura 1 de mai jos, ilustreaz  principalele oras, e s, i sate din Banat, precum s, i
leg turile rutiere s, i feroviare dintre localit t, i.

Figure 1: Harta Banatului

1. Pornind de la harta de mai sus, realizat, i un graf care s  modeleze legaturile rutiere
dintre localit t, i. Analog construit, i un alt graf care s  ilustreze leg turile feroviare
dintre localit t, i.

1
Universitatea de Vest din Timi³oara
Departamentul de Informatic  Aritoni Ovidiu

2. Singurele cai navigabile din Banat sunt reprezentate de Tisa, canalul Bega (Begejski
Canal) s, i Dun re. Realizat, i un graf care s  cont, in  toate leg turile navigabile dintre
oras, e.

3. Alc tuit, i o list  de obiective turistice din Banat care intent, ionat, i s  le vizitat, i.
Putet, i folosi ca surs  de inspirat, ie site-ul http://www.intercultural.ro/. Intro-
ducet, i în aceast  list  atât obiective de pe teritoriul României cât s, i de pe teritoriul
Serbiei s, i al Ungariei.

4. Creat, i un proiect Java, denumit TurismInBanat. În cadrul acestui proiect creat, i un


pachet denumit main .

5. Realizat, i o clas  Rut , conform diagramei de clas , din gura 2de mai jos. Aceast 
clas  se va realiza în pachetul main. Constructorul clasei va seta pentru toate
obiectele atributul skip al clasei pe valoarea false .
Ruta
#localitatePlecare: String
#localitateSosire: String
#distanta: int
#skip: boolean
#fluvial: boolean
#rutier: boolean
#feroviar: boolean
+getLocalitatePlecare(): String
+setLocalitatePlecare(localitate:String): void
+getLocalitateSosire(): String
+setLocalitateSosire(localitate:String): void
+getDistanta(): int
+setDistanta(dist:int): void
+isTrue(): boolean
+setSkip(skip:boolean): void
+Ruta(localitateStart:String,localitateEnd:String,
dist:int,rutier:boolean,feroviar:boolean,
fluvial:boolean)
+equals(obj:Object): boolean
+isFluvial(): boolean
+isRutier(): boolean
+isFeroviar(): boolean

Figure 2: Diagrama de clas  a clasei Ruta

6. În cadrul pachetului main creat, i o clas  MotorCautare as, a cum este prezentat mai
jos:

1 public class MotorCautare {


2 / ∗∗ C o n s t a n t a MAX s t o c h e a z a nu maru l maxim de r u t e ∗/
3 protected final i n t MAX= 1 0 0 ;
4 protected Ruta r u t e [ ] = new Ruta [MAX] ;
5 / ∗∗ Aceasta comanda retine n umar ul de rute ocupate din
vectorul r u t e ∗/
6 protected int n r R u t e =0;
7 / ∗∗ Stiva de mai jos va fi folosita pentru a retine solutia
finala . Este stiva pt B a c t r a c k i n g ∗/

2
Universitatea de Vest din Timi³oara
Departamentul de Informatic  Aritoni Ovidiu

8 Stack b t S t a c k=new Stack ( ) ;


9
10 }

7. În cadrul clasei MotorCautare create anterior creat, i o metod  adaugaRuta, asa cum
,

este descris în cele ce urmeaz :

1 public void adaugaRuta ( S t r i n g p , String d, int dist , boolean


r u t i e r , boolean f e r o v i a r , boolean fluvial ){
2 i f ( nrRute<MAX) {
3 Ruta z=new Ruta ( p , d , d i s t , r u t i e r , f e r o v i a r , f l u v i a l ) ;
4 r u t e [ n r R u t e ]= z ;
5 n r R u t e ++;
6 }
7 else System . o u t . p r i n t l n ( " Nu mai poate fi adaugat nici o
ruta ") ;
8 }

8. Realizat, i o metod  setup în clasa MotorCautare care s  construiasca harta, adic 


s  adauge ecare rut  existent  pe hart :

public void setup (){


adaugaRuta ( " T i m i s o a r a " , " B i l e d " , 1 0 , t r u e , true , false );
adaugaRuta ( " B i l e d " , " L o v r i n " , 7 , t r u e , true , false );
. . .
}

9. Realizat, i o metod  match care va avea urm toarea structur :

int match ( S t r i n g plecare , String d e s t i n a t i e ){

10. Metoda match caut  in baza de date a aplicatiei daca exista rute directe intre cele
doua orase furnizate ca parametrii. În cazul in care exista rute intre cele doua orase
se returneaza distanta, iar in caz contrar returneaz  0 (zero). O dat  ce o anumit 
rut  a fost gasit , inseamn  c  corespunde solut, iei. As, adar atributul skip al acestei
rute va  setat pe true, pentru a preveni reutilizarea acestei rute in construirea
solutiei nale.

1 int match ( S t r i n g plecare , String destinatie ){


2 int d i s t =0;
3 for ( int i =0; i < nrRute ; i ++){
4 i f ( r u t e [ i ] . l o c a l i t a t e P l e c a r e . e q u a l s ( p l e c a r e ) && rute [ i ] .
l o c a l i t a t e D e s t i n a t i e . e q u a l s ( d e s t i n a t i e ) && r u t e [ i ] . s k i p==
false )
5 {

3
Universitatea de Vest din Timi³oara
Departamentul de Informatic  Aritoni Ovidiu

6 d i s t =r u t e [ i ] . d i s t a n t a ;
7 r u t e [ i ] . s k i p=t r u e ;
8 }
9 }
10 return dist ;
11 }

11. Construit, i o alt  metod , nd(localitate), care s  identice toate rutele care pornesc
dintr-o anumit  localitate. De exemplu din localitatea Jimbolia pornesc urm toarele
rute: Jimbolia - Timis, oara, Jimbolia - Srpska Krnja, Jimbolia - Kikinda, Jimbolia -
Sânnicolaul Mare, Jimbolia - Lovrin, Jimbolia - Biled s, i Jimbolia - Cenei. Metoda
nd(Jimbolia) va trebui s  genereze un drum dintre acestea care nu a fost folosit
anterior.

1 Ruta find ( String from ) {


2 Ruta r=n u l l ;
3 for ( int i =0; i <n r R u t e ; i ++){
4 i f ( r u t e [ i ] . l o c a l i t a t e P l e c a r e . e q u a l s ( f r o m )&& r u t e [ i ] . s k i p
==f a l s e ) {
5 r=new Ruta ( from , r u t e [ i ] . l o c a l i t a t e D e s t i n a t i e , rute [ i ] .
distanta ) ;
6 r u t e [ i ] . s k i p=t r u e ;
7 }
8 }
9 return r;
10 }

12. Realizati o metod  calculRuta care va determina drumul de leg tur  dintre dou 
localit t, i furnizate ca parametru. Scheletul acestei metode este cel de mai jos. Se
va aplica strategia de c utare în adâncime:

1 void calculRuta ( String from , S t r i n g to ) {


2 int dist ;
3 Ruta z;
4
5 / ∗ ∗ 1 . Caut existenta unui rute directe intre cele doua orase
furnizate drept p a r a m e t r u ∗/
6
7
8 / ∗ ∗ 2 . Daca exista ruta directa atunci o adaug in stiva care
retine solutia si inchei executia m e t o d e i ∗/
9
10 /∗∗3. Daca nu exista ruta directa , atunci expandez nodul
curent , si determin un prim s u c c e s o r ∗/
11 / ∗∗ 4 a . Daca exista noduri noi expandate atunci incep
procesul de c a u t a r e ∗/

4
Universitatea de Vest din Timi³oara
Departamentul de Informatic  Aritoni Ovidiu

12 // inacarc noul zbor in stiva


13 // verific daca nu cumva s −a ajuns la solutia finala
14 // daca nu s −a ajuns inca la solutia finala , atunci continui
procesul de cautare
15 / ∗∗ 4 b . Daca nu mai exista noduri expandate , ma intorc la
nodul anterior din stiva si incep procesul de cautare de
la acesta
16 }

13. Realizati o clasa Main, care va contine o metod  main, unde vet, i testa funct, ionalitatea
aplicat, iei create.

2 C utare neinformat  (tem )


În cadrul acestui exercitiu se cere s  implementat, i algoritmii de c utare neinformat, i,
utilizând ca s, i suport graful de rute obt, inut la exercit, iul anterior.

• c utarea în l t, ime;

• c utarea bidirect, ional ;

• c utarea limitat  în adâncime;

• c utare aplicând tehnica de c utare Greedy.

De asemenea realizat, i un program care s  listeze toate rutele existente între dou  localit t, i
de pe hart . La aplicarea algoritmilor de c utare informat, i sau neinformat, i, se returneaz 
o singur  rut . Trebuie s  modicat, i unul dintre programele obt, inute anterior, pentru a
obt, ine toate rutele posibile dintre dou  drumuri.
Indicatie: , în frameworkul ProblemSolving pus la dispozit, ie exist  implement ri pentru
tot, i algoritmii de c utare, atât informat, i cât s, i neinformat, i.

3 Problema c nilor cu ap 

3.1 Framework pentru rezolvarea problemelor

Pentru a implementa în mod rapid problemele specice de c utare în spat, iul st rilor a
fost dezvoltat un framework. Acest framework cont, ine trei pachete:

• Pachetul algorithms, care cont, ine clase care încapsuleaz  tot, i algoritmii de c utare
neinformat, i s, i informat, i.

• Pachetul stacks. Acest pachet este un pachet utilitar, care denes, te o clas  template
Stack s, i un Iterator pentru aceasta.

• Pachetul templates, cont, ine clase pentru denirea conceptului de stare s, i operator.

5
Universitatea de Vest din Timi³oara
Departamentul de Informatic  Aritoni Ovidiu

3.2 Utilizarea algoritmilor neinformat, i

Frameworkul dezvoltat se foloses, te pentru a implementa cu us, urint,   aplicat, ii care s 


efectueze c ut ri în spat, iul st rilor unei probleme. Pentru aceasta este necesar  denirea
urm toarelor clase:

• o clas  care s  modeleze conceptul de stare.

• o clas  care s  modeleze conceptul de stare init, ial .

• clase care s  modeleze operatorii specici problemei c nilor cu ap : Fill1, Fill2,
Empty1, Empty2, Empty_1to2, Empty_2to1.

• o clas  de tip container care s  cont, in 

1. Creat, i un proiect nou denumit WaterCups.

2. În cadrul acestui proiect nou, creat, i un pachet watercups.states .

3. Realizat, i o clas  care s  modeleze conceptul de stare, specic problemei c nilor cu


ap . Aceast  clas  se va numi WaterCupState. Scheletul principal al clasei este
urm torul:

1 package watercups . s t a t e s ;
2
3 import java . u t i l . ArrayList ;
4 import templates . State ;
5
6 public class Wa t er C up S ta t e {
7 protected int capacity1 ;
8 protected int capacity2 ;
9
10 }

4. Clasa WaterCupState nu va avea decât dou  atribute: capacity1 s, i capacity2, care


ret, in volumul maxim de ap  care poate  stocat în ecare din cele dou  c ni. Pentru
aceasta clas  creat, i:

(a) un constructor implicit care va crea starea init, ial , adic  va seta valoarea
atributelor capacity1 s, i capacity2 la zero.

(b) un constructor explicit.

(c) accesor s, i modicator pentru atributul capacity1, respectiv atributul capacity2.

(d) metoda toString.

(e) metoda equals. Spunem c  dou  st ri A s, i B sunt identice dac  s, i numai
volumul de ap  este acelas, i pentru prima can  atât în starea A cât s, i în starea
B, respectiv este acelas, i volum de ap  în cea de-a doua can  atât în starea A
cât s, i în starea B.

6
Universitatea de Vest din Timi³oara
Departamentul de Informatic  Aritoni Ovidiu

5. Realizat, i o metod  de clas  nalStates care va returna mult, imea tuturor st rilor
nale care trebuiesc îndeplinite de c tre problem . Aceast  metod  returneaz  o
list  care va cont, ine aceste st ri:

1 public static A r r a y L i s t <S t a t e <WaterCupState>> finalStates () {


2
3 }

6. Se va construi o list  de st ri fStates, s, i se va ad uga acestei liste ecare din st rile
nale: (0,2), (1,2), (2,2), (3,2).

1 public static A r r a y L i s t <S t a t e <WaterCupState>> finalStates () {


2
3 A r r a y L i s t <S t a t e <WaterCupState>> f S t a t e s=new ArrayList<
S t a t e <WaterCupState >>() ;
4
5 f S t a t e s . add ( new S t a t e <WaterCupState >(new W a te r C up St a te
(0 ,2) , null ) ) ;
6 f S t a t e s . add ( new S t a t e <WaterCupState >(new W a te r C up St a te
(1 ,2) , null ) ) ;
7 f S t a t e s . add ( new S t a t e <WaterCupState >(new W a te r C up St a te
(2 ,2) , null ) ) ;
8 f S t a t e s . add ( new S t a t e <WaterCupState >(new W a te r C up St a te
(3 ,2) , null ) ) ;
9
10 return fStates ;
11 }

7. În cadrul pachetului states creat, i o clas  InitialState ca cea de mai jos:

package watercups . s t a t e s ;

import Templates . Operator ;

public static class InitialState implements O p e r a t o r <WaterCupState >{


public String toString (){
return "Initial State ";
}
}

8. În clasa WaterCupState creat, i o metod  initialState care va returna starea init, ial 
specic  problemei c nilor cu ap .

1 public static S t a t e <WaterCupState> initalState () {


2 return new S t a t e <WaterCupState >(new W at e rC u pS t at e ( ) , new
InitialState () ) ;
3 }

7
Universitatea de Vest din Timi³oara
Departamentul de Informatic  Aritoni Ovidiu

9. Creat, i un pachet watercups.operators.


10. În pachetul watercups.operators creat, i o clas  Fill1. Aceast  clas  va modela op-
eratorul care permite umplerea primei c ni. Deoarece este un operator, clasa Fill1
va trebui s  implementeze interfat, a Operator. Întrucât operatorul se va aplica unei
st ri specice problemei c nilor cu ap , interfat, a Operator va trebui parametrizat 
cu clasa WaterCupState.
1 public static class Fill1 implements O p e r a t o r <WaterCupState
>{
2
3 }

11. Ordinea operatorilor în cazul problemei c nilor cu ap  este urm toarea: umplere_cana1,
umplere_cana2, golire_cana1, golire_cana2, golire_din_cana1_in_cana2, golire_din_cana2_in_ca
As, adar operatorul umpler_cana1 va avea num rul de ordine 1, deci metoda getOp-
eratorNumber din clasa Fill1 va reurna valoarea 1:

1 public int getOperatorNumber ( ) {


2 return 1;
3 }

12. În continuare vom deni metoda available a clasei Fill1. Aceast  metod  verc 
dac  asupra st rii furnizate ca parametru se poate aplica operatorul Fill1. Prima
can  poate  umplut  doar dac  în ea exist  mai put, in de trei litri.

public boolean a v a i l a b l e ( W a te r Cu p St a te s ){
if ( s . g e t C a p a c i t y 1 () <3)
return true ;
else
return false ;
}

13. Ultima etap  este scrierea metodei execute( ) care denes, te comportamentul oper-
atorului Fill1. Deoarece în urma execut, iei acestui operator se obt, ine o nou  stare,
metoda execute( ) va construi un nou obiect de tip WaterCupState, as, a cum este
indicat mai jos:

public W a te r Cu p St a te e x e c u t e ( Wa t e rC u pS t at e s ){
return new W at e rC u pS t at e ( 3 , s . g e t C a p a c i t y 2 ( ) ) ;
}

14. As, adar codul surs  al clasei Fill1 este urm torul:

1 package watercups . o p e r a t o r s ;
2
3 import w a t e r c u p s . s t a t e s . W at e rC u pS t at e ;
4 import templates . Operator ;

8
Universitatea de Vest din Timi³oara
Departamentul de Informatic  Aritoni Ovidiu

5
6 public static class Fill1 implements O p e r a t o r <WaterCupState
>{
7
8 public int getOperatorNumber ( ) {
9 return 1;
10 }
11
12 public Wa t er C up S ta t e e x e c u t e ( Wa t er C up S ta t e s ){
13 return new W at e rC u pS t at e ( 3 , s . g e t C a p a c i t y 2 ( ) ) ;
14 }
15
16 public boolean a v a i l a b l e ( W a te r Cu p St a te s ){
17 if ( s . g e t C a p a c i t y 1 ( ) <3)
18 return true ;
19 else
20 return false ;
21 }
22
23 public String toString () {
24 return "Filling first cup " ;
25 }
26 }

15. Pornind de la modelul oferit de clasa Fill1 construit, i clasele Fill2, Empty1, Empty2,
Empty_1to2 s, i Empty_2to1 în cadrul pachetului watercups.operators.
16. Construit, i în cadrul pachetului watercups.operators o clas  denumit  WaterCup-
Operators:

1 package watercups . o p e r a t o r s ;
2
3 import java . u t i l . ArrayList ;
4 import w a t e r c u p s . s t a t e s . W at e rC u pS t at e ;
5 import templates . Operator ;
6
7 public class WaterCupOperators {
8 private static A r r a y L i s t <O p e r a t o r <WaterCupState>>
waterCupOperators
9 =new A r r a y L i s t <O p e r a t o r <WaterCupState >>() ;
10
11 public static A r r a y L i s t <O p e r a t o r <WaterCupState>>
returnOperators () {
12 w a t e r C u p O p e r a t o r s . add ( new Fill1 () ) ;
13 w a t e r C u p O p e r a t o r s . add ( new Fill2 () ) ;
14 w a t e r C u p O p e r a t o r s . add ( new Empty1 ( ) ) ;

9
Universitatea de Vest din Timi³oara
Departamentul de Informatic  Aritoni Ovidiu

15 w a t e r C u p O p e r a t o r s . add ( new Empty2 ( ) ) ;


16 w a t e r C u p O p e r a t o r s . add ( new Empty_1to2 ( ) ) ;
17 w a t e r C u p O p e r a t o r s . add ( new Empty_2to1 ( ) ) ;
18 return waterCupOperators ;
19 }
20 }

17. Pentru a rula

import java . u t i l . ArrayList ;

import O p e r a t o r s . WaterCupOperators ;
import S t a t e s . CMState ;
import S t a t e s . FarmerStates ;
import S t a t e s . W at e rC u pS t at e ;
import Templates . Operator ;
import Templates . S t a t e ;
import Algorithms . ∗ ;

public class MainClass {

public static void main ( S t r i n g [ ] args ){


/∗∗1. Descrierea p r o b l e m e i ∗∗ /

// 1a . Definirea operatorilor
A r r a y L i s t <O p e r a t o r <WaterCupState>> w a t e r C u p O p e r a t o r s=W a t e r C u p O p e r a t o r s . r e
// 1b . Definirea starii intiale
S t a t e <WaterCupState> w a t e r C u p I n i t i a l S t a t e=W a te r Cu p St a te . i n i t a l S t a t e ( ) ;
// 1c . Definirea starilor finale
A r r a y L i s t <S t a t e <WaterCupState>> w a t e r C u p F i n a l S t a t e=Wa t er C up S ta t e . f i n a l S t a

/ ∗∗ 2. Definirea fisierului de log , care va descrie solutia ∗∗ /


String WaterCupDepth="WaterCupDepth . t x t " ;

/ ∗∗ 3. Definirea contextului de rezolvare si executia strategiei respecti

C o n t e x t<WaterCupState> w ;
w=new C o n t e x t<WaterCupState >(new D e p t h S t r a t e g y <WaterCupState > ( ) ) ;
w. e x e c u t e S t r a t e g y ( w a t e r C u p I n i t i a l S t a t e , waterCupFinalState , waterCupOperato
}

18. La o analiz  a s, ierului de log, se va remarca urm torul rezultat:

1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 Initial State
3 Cup 1 contains : 0 Cup 2 contains : 0

10
Universitatea de Vest din Timi³oara
Departamentul de Informatic  Aritoni Ovidiu

4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 Filling first cup
6 Cup 1 contains : 3 Cup 2 contains : 0
7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
8 Filling second cup
9 Cup 1 contains : 3 Cup 2 contains : 4
10 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
11 Empting first cup
12 Cup 1 contains : 0 Cup 2 contains : 4
13 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
14 Filling first using second cup
15 Cup 1 contains : 3 Cup 2 contains : 1
16 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
17 Empting first cup
18 Cup 1 contains : 0 Cup 2 contains : 1
19 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
20 Filling first using second cup
21 Cup 1 contains : 1 Cup 2 contains : 0
22 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
23 Filling second cup
24 Cup 1 contains : 1 Cup 2 contains : 4
25 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
26 Filling first using second cup
27 Cup 1 contains : 3 Cup 2 contains : 2

19. În mod analog testat, i funct, ionalitatea algoritmilor de c utare în l t, ime, în adâncime
limitat , în ad ncime iterativ . Setat, i diferite valori pentru limita c ut rii în
adâncime, respectiv pentru cea iterativ .

3.3 Utilizarea algoritmului Greedy

11

S-ar putea să vă placă și