Mihai Sprinceana
Un forum de programare cu de toate. Va astept sa va inscrieti si sa deveniti moderatori. Oricine este binevenit aici sa se inscrie si sa aiba acces la informatie free! Fiecare este liber sa adauge proiecte programe free etc. Ajutati acest forum sa devina o comunitate puternica unde fiecare invata de la fiecare! Tot ce trebuie sa faceti este sa va inregistrati si fiecare contributie se poate dovedi utila in timp! Forumul este free informatia free dk aveti timp liber ajutati si pe ceilalti si invatati si voi in acelasi timp! Haideti sa facem ceva pt.a ne ajuta intre noi! Cititi regulament postare forum inainte de a posta!
Lista Forumurilor Pe Tematici
Mihai Sprinceana | Inregistrare | Login

POZE MIHAI SPRINCEANA

Nu sunteti logat.
Nou pe simpatie:
Lolo 24 ani
Femeie
24 ani
Galati
cauta Barbat
25 - 52 ani
Mihai Sprinceana / Inteligenta artificiala / Problema misionarilor si canibalilor strategia de cautare in adancime  
Autor
Mesaj Pagini: 1
mihaispr
Administrator

Inregistrat: acum 18 ani
Postari: 2142
Cuprins

I.    Enuntul problemei .......................................................... pag. 3
II.    Descrierea problemei ..................................................... pag. 3
III.    Descrierea strategiei de cautare aplicata ....................... pag. 5
IV.    Starile problemei ............................................................. pag. 6
V.    Implementarea algoritmului de cautare in adancime ...... pag. 7
VI.    Costul solutiei si solutia gasita ........................................ pag. 8



I. Enuntul problemei

Problema misionarilor şi canibalilor: 3 misionari şi 3 canibali se află pe unul dintre malurile unui râu, împreună cu o barcă ce poate trasporta la un moment dat unul sau doi oameni. Se cere să se găsească o modalitate de a-i transporta pe toţi pe celălalt mal, fără a permite la vreun transport ca numărul de canibali dintr-o locaţie să depăşească numărul de misionari. Problema se va rezolva folosind strategia de căutare în adâncime.

II. Descrierea problemei

Trei misionari si trei canibali se afla de o parte a raului. Ei au o barca ce poate duce cel mult doi oameni. Va trebui sa gasim o posibilitate asa incat sa traverseze toti de cealalta parte a raului cu conditia sa nu existe mai multi canibali decat misionari intr-o parte.

Descrierea starii curente: o secventa de 6 numere, reprezentand numarul misionarilor, al canibalilor si barcilor de pe fiecare mal al raului. Plecand de la premisa ca sunt 3 canibali, 3 misionari si o barca, starea initiala va fi (3,3,1,0,0,0).
Stari: secvente ordonate de 3 numere reprezentand numarul de misionari, canibali si barci de partea in care se aflau initial (3, 3, 1).
Actiuni: mutarea unui misionar sau canibal sau 2 canibali, 2 misionari sau un misionar si un canibal de pe o parte pe alta.
Testarea tintei: starea (0, 0, 0).
Costul drumului: numarul de traversari.



Reprezentare grafica:






Lista transpoartelor ce trebuie efectuate este prezentata mai jos:






Descrierea strategiei de cautare aplicata

Strategia de cautare in adancime limitata
Strategia de căutare în adâncime limitată (depth-first search) este o strategie de căutare neinformată.
Strategia expandează întotdeauna ultimul nod adăugat arborelui (aflat pe nivelul cel mai adânc). Căutarea revine pe nivelele anterioare numai atunci când s-a blocat (a apărut un nod care nu e nodul scop şi care nu poate fi expandat sau s-a ajuns la adâncimea maximă impusă.
Implementarea strategiei de căutare pe nivel se realizează particularizând strategia generală de căutare prin implementarea listei FRONTIERA sub formă de stivă.

Algoritm
1. iniţializează listele FRONTIERA ←{Si} şi TERITORIU ←{}
2. dacă FRONTIERA={} atunci
    întoarce INSUCCES /*nu există soluţie*/
3. elimină primul nod S din FRONTIERA şi inserează-l în TERITORIU
4. daca adancime(S) = Hmax atunci repeta de la pasul 2
4. expandează nodul S
    4.1. generează toţi succesorii direcţi Sj ai nodului S
    4.2. pentru fiecare succesor Sj (1≤j≤n) al lui S execută
        4.2.1. stabileşte legătura Sj → S
        4.2.2. dacă Sj este stare finală atunci
                i.  soluţia este (Sj, S, ..., Si)
                ii. întoarce SUCCES /* a fost găsită soluţia */
        4.2.3. dacă Sj ≠ toate stările anterior generate în     
                  soluţia parţială curentă atunci
                  inserează Sj în FRONTIERA, la inceput
5. repetă de la pasul 2
Sfârşit

Dezavantajul căutării este posibilitatea blocării într-o cale greşit aleasă.

Caracteristici:
•    Complexitatea in spatiu: b*d, unde b=factor de ramificare si d=adancimea cautarii
•    Complexitatea in timp: bd.
•    Căutarea nu este completă.
•    Căutarea nu este optimală.
•    Complexitatea timp este exponenţială, iar complexitatea spaţiu este polinomială.

IV. Starile problemei (tratarea in program)

//verifica daca nr misionarilor>=0, nr canibalilor>=0 si misionari>=canibali

bool Stare::EValid()
{    //verifica daca nr misionarilor>=0, nr canibalilor>=0 si misionari>=canibali
    if (MisDreapta==0)
    {   
        if ((MisStanga>=CanStanga) && (MisStanga>=0) &&
            (CanDreapta>=0) && (CanStanga>=0))
            return (true);
        else
            return (false);
    }
    else
    {
        if (MisStanga==0)
        {   
            if ((MisDreapta>=CanDreapta) && (MisDreapta>=0) &&
                (CanDreapta>=0) && (CanStanga>=0))
                return (true);
            else
                return (false);
        }
        else
        {
            if ((MisDreapta>=CanDreapta) && (MisStanga>=CanStanga) &&
                (MisDreapta>=0) && (MisStanga>=0) &&
                (CanDreapta>=0) && (CanStanga>=0))
                return (true);
            else
                return (false);
        }
    }

}

//verifica daca starea gasita coincide cu starea obiectiv, cea cautata, adica starea: ML=3, MR=0, CL=3, CR=0, B=0. (0,0,0)

bool Stare::EScop()
{   
    if ((MisStanga==3) && (CanStanga==3)
        && (MisDreapta==0) && (CanDreapta==0)
        && (Barca==stanga))
        {
            return (true);
        }
    else
            return (false);
}


V. Implementarea algoritmului de cautare in adancime

void Stare::CautaAdancime()
{//algoritmul cautarii in adancime
    Stare* ChildQueuePtr;
    ChildQueuePtr=new Stare;
    ChildQueuePtr=NULL;

    if (Gasit)    //verifica daca trebuie oprita recursivitatea (recursion)
        return;

    NumStare++;
   
    PrintStare();
    if (!EScop())        //daca nu este starea obiectiv
    {
        ChildQueuePtr=GetChildQueue();    //creeaza coada copil pentru
//aceasta stare
        while (!ChildQueuePtr==NULL)
        {
            ChildQueuePtr->CautaAdancime(); //cautare in adancime
//recursiva la inceputul cozii copil
            ChildQueuePtr=ChildQueuePtr->next; //se deplaseaza cu
//coada copil
        }
        return;
    }
    else
    {
        cout<<"Am gasit!!!"<<endl;
        cout<<"Am trecut prin  "<<NumStare<<" stari"<<endl;
        Gasit=true;    //seteaza Gasit=true pentru a opri recursivitatea
        return;
    }
}




VI. Costul solutiei si solutia gasita

Costul drumului, costul solutiei gasite, este reprezentat de numarul de stari ale acesteia. In cazul nostru acesta este 12.

Solutia gasita:

ML:0 MR:3 CL:0 CR:3 B:1
ML:0 MR:3 CL:2 CR:1 B:0        Mutare: 2C
ML:0 MR:3 CL:1 CR:2 B:1        Mutare: 1C
ML:0 MR:3 CL:3 CR:0 B:0        Mutare: 2C
ML:0 MR:3 CL:2 CR:1 B:1        Mutare: 1C
ML:2 MR:1 CL:2 CR:1 B:0        Mutare: 2M
ML:1 MR:2 CL:1 CR:2 B:1        Mutare: 1M,1C
ML:3 MR:0 CL:1 CR:2 B:0        Mutare: 2M
ML:3 MR:0 CL:0 CR:3 B:1        Mutare: 1C
ML:3 MR:0 CL:2 CR:1 B:0        M: 2C
ML:2 MR:1 CL:2 CR:1 B:1        M: 1M
ML:3 MR:0 CL:3 CR:0 B:0        M: 1M,1C
Am gasit!!!
Am trecut prin 12 stari


pus acum 17 ani
   
Pagini: 1  

Mergi la