Documente Academic
Documente Profesional
Documente Cultură
FCIM
Catedra Informatica Aplicativă
RAPORT
la lucrarea de laborator nr. 6
la SDA
2.6. Metoda Branch and Bound foloseste la rezolvarea problemelor la care domeniul în care se caută
soluţia este foarte mare şi nu se cunoaşte un alt algoritm care să conducă mai rapid la rezultat. Problemele
care pot fi abordate prin această metodă pot fi modelate într-un mod asemănător celui folosit la metoda
Backtracking. Se pleacă de la o configuraţie iniţială şi se reţine şirul de operaţii prin care aceasta este
transformată într-o configuraţie finală dacă aceasta este dată, în alte cazuri se cere configuraţia finală ştiind
că trebuie să verifice anumite condiţii de optim.
Diferenţa dintre cele două metode constă în faptul că metoda Backtracking la fiecare etapă selectează un singur
succesor după care se face verificarea condiţiilor de continuare, iar metoda Branch and Bound generează la fiecare
pas toate configuraţiile posibile (toţi succesorii) care rezultă din cea curentă şi le stochează într-o listă. Se alege apoi
un element din listă după un criteriu ce depinde de problemă şi se reia procesul de expandare.
Alegerea optimă a unui element din această listă pentru expandare se face cu ajutorul unei funcţii f = g + h
în care g este o funcţie care măsoară lungimea drumului parcurs de la configuraţia iniţială până la nodul
curent iar h este o funcţie (euristică) care estimează efortul necesar pană se ajunge la soluţie şi este specifică
fiecărei probleme. Alegerea funcţiei h este foarte importantă din punct de vedere a vitezei de execuţie a
programului.
Se lucrează cu două liste: lista open în care se reţin configuraţiile neexpandate încă şi lista close care le
memorează pe cele expandate. Soluţia se construieşte folosind un arbore care se parcurge pe baza legăturii
tată.
Nodurile sunt înregistrări care cuprind următoarele informaţii:
• configuraţia la care s-a ajuns, t;
• valorile funcţiilor g si h,
• adresa nodului 'tată';
• adresa înregistrării următoare în lista open sau close;
• adresa înregistrării următoare în lista succesorilor.
2. Algoritmul:
1. înregistrarea corespunzătoare configuraţiei iniţiale este încărcată în open cu g=0 şi f=h;
2. atât timp cât nu s-a selectat spre expandare nodul corespunzător configuraţiei finale şi lista open este
nevidă, se execută următoarele:
3. se selectează din lista open nodul t cu f minim;
4. se expandează acest nod obţinând o listă liniară simplu înlănţuită cu succesorii săi;
5. pentru fiecare succesor din această listă se execută:
6. se ataşează noul g, obţinut ca sumă între valoarea lui g a configuraţiei t şi costul expandării (de obicei 1);
7. se testează dacă acest succesor aparţine listei open sau close şi în caz afirmativ, se verifică dacă valoarea
lui g este mai mică decât cea a configuraţiei găsite în listă:
8. în caz afirmativ, nodul găsit este direcţionat către actualul părinte (prin fixarea legăturii tată) şi se ataşează
noul g, iar dacă acest nod se găseşte în close, este trecut în open;
9. în caz că acest nod nu se găseşte în open sau close, este introdus în lista open;
10. dacă s-a selectat pentru expandare nodul corespunzător configuraţiei finale atunci se trasează folosind o
procedură recursivă drumul de la configuraţia iniţială la cea finală utilizând legătura 'tată';
11. dacă ciclul se încheie deoarece lista open este vidă înseamnă că problema nu are soluţie
Exemple :
#include <iostream>
using namespace std;
int *p,n,np;
/******************/
void scrie(void)
{
np++;
cout<<"Permutarea nr: "<<np<<endl;
for(int i=1;i<=n;i++)
cout<<p[i]<<" ";
cout<<endl;
//getch();
}
/*******************/
int main(void)
{
// clrscr();
cout<<"n=";
cin>>n;
p=new int[n+1];
for (int i=1;i<=n;i++)
p[i]=i;
cout<<"Permutarea nr: 1"<<endl;
for(int i=1;i<=n;i++)
cout<<p[i]<<" ";
cout<<endl;
int k=1;
np=1;
do
{
int aux=p[k];
for (int i=k;i<n;i++)
p[i]=p[i+1];
p[n]=aux;
if (p[k]==k) k++;
else
{
scrie();
k=1;
}
}
while(k<=n-1);
cout<<"Sunt: "<<np<<" permutari";
delete p;
//getch();
}
#include <iostream>
using namespace std;
#include <stdio.h>
#include <conio.h>
void printMaxActivities(int s[], int f[], int n)
{
int i, j;
int main()
{
int s[] = {1, 3, 0, 5, 8, 5};
int f[] = {2, 4, 6, 7, 9, 9};
int n = sizeof(s)/sizeof(s[0]);
printMaxActivities(s, f, n);
return 0;
}
#include <iostream>
using namespace std;
#include <stdio.h>
#include <conio.h>
int n,a[20][20];
//*******************
int posibil(int i,int j)
{ int l;
for(int k=1;k<=i-1;k++)
for(l=1;l<=n;l++) if (a[i][j]==a[k][l]) return 0;
if ((j) && (a[i][j]<=a[i][j-1])) return 0; return 1; }
//*********************
void tiparire(void)
{ cout<<"Matricea:\n";
for(int i=1;i<=n;i++) { cout<<"\n";
for(int j=1;j<=n;j++) cout<<a[i][j]<<"\ "; } getch(); }
//********************
void back(int i,int j)
{ for(int k=1;k<=n*n;k++) { a[i][j]=k;
if (posibil(i,j))
if ((i==n) && (j==n)) tiparire();
else if (j==n) back(i+1,1); else back(i,j+1); } }
//********************
int main(void)
{ n=2;
back(2,2);
getch(); }
Programele :
51: Program pentru un graf :
#include <stdio.h>
#include <stdlib.h>
struct AdjListNode {
int dest;
struct AdjListNode* next;
};
struct AdjList {
struct AdjListNode *head;
};
struct Graph {
int V;
struct AdjList* array;
};
struct AdjListNode* newAdjListNode(int dest) {
struct AdjListNode* newNode = (struct AdjListNode*) malloc(
sizeof(struct AdjListNode));
newNode->dest = dest;
newNode->next = NULL;
return newNode;
}
struct Graph* createGraph(int V) {
struct Graph* graph = (struct Graph*) malloc(sizeof(struct Graph));
graph->V = V;
graph->array = (struct AdjList*) malloc(V * sizeof(struct AdjList));
int i;
for (i = 0; i < V; ++i)
graph->array[i].head = NULL;
return graph;
}
void addEdge(struct Graph* graph, int src, int dest) {
struct AdjListNode* newNode = newAdjListNode(dest);
newNode->next = graph->array[src].head;
graph->array[src].head = newNode;
newNode = newAdjListNode(src);
newNode->next = graph->array[dest].head;
graph->array[dest].head = newNode;
}
void printGraph(struct Graph* graph) {
int v;
for (v = 0; v < graph->V; ++v) {
struct AdjListNode* pCrawl = graph->array[v].head;
printf("\n Lista pentru nodul %d\n head ", v);
while (pCrawl) {
printf("-> %d", pCrawl->dest);
pCrawl = pCrawl->next;
}
printf("\n");
}
}
int main() {
int V = 5;
struct Graph* graph = createGraph(V);
addEdge(graph, 0, 1);
addEdge(graph, 0, 4);
addEdge(graph, 1, 2);
addEdge(graph, 1, 3);
addEdge(graph, 1, 4);
addEdge(graph, 2, 3);
addEdge(graph, 3, 4);
printGraph(graph);
return 0;
}
58.
#include <malloc.h>
#include <memory.h>
#include <string.h>
#include <stdio.h>
#include<dos.h>
#define max_oferte 10
#define max_sol 10
#define true 1
#define false 0
52 Program cu drapele :
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
int main(void) {
char str[20];
printf("Introduceti propozitia: ");
gets(str);
parse(stdin, stdout);
printf("Final: %s",str);
return 0;
}
Concluzie :Am insusit tehnicele de programare eficienta , asemenea tehnicii Greddy ,
asemenea am realizat programe cu tehnicele eficiente de prelucrarea a datelor mai
rapid si structurat .
Bibliografie
Limbajul de programare C". Brian W.Kernighan. Dennis M.Ritchie.
- Liviu Negrescu. ”Limbajul de programare C şi C++” V.1-4. Buc. 1999
- Knuth, D. E. - "Arta programarii calculatoarelor, vol. 1: Algoritmi fundamentali", Ed. Teora, 1999.
- Knuth, D. E. - "Arta programarii calculatoarelor, vol. 2: Algoritmi seminumerici", Ed. Teora, 2000.
- Knuth, D. E. - "Arta programarii calculatoarelor, vol. 3: Sortare si cautare", Ed. Teora, 2001.
- Bacivarov, A.; Nastac, I. - "Limbajul C. Indrumar de laborator", Tipografia UPB, Bucuresti, 1997.
- Bates, J; Tompkins, T. - "Utilizare C++", Ed. Teora 2001.
- Andonie, R.; Gabarcea, I. - "Algoritmi fundamentali. O perspectiva C++", Ed. Libris, 1995.
- Help din Turbo C ++IDE ,versiunea 3.0. 1999
- CORMEN, T. - LEISERSON, CH. - RIVEST, R. : Introducere in algoritmi, Editura Computer Libris. Agora,
Cluj-Napoca, 2000.
- Conspectele la PC 2009 şi SDA-2010
- L.Negrescu.Limbajele C si C++ pentru incepatori.Vol 1 si 2.Ed.Microinformatica.Cluj-N.,1994 si reeditata in
1996 ,1998,2000.
- L.Livovschi,H.Georgescu.Analiza si sinteza algoritmilor. Ed.Enciclopedica, Bucuresti,, 1986.
- I.Ignat, C.Ignat. Structuri de date si algoritmi. Indrumator de laborator. U.T.Pres, 2001.
- Informatica. Îndrumar metodic pentru lucrările de laborator. Marin Şt. Chişinău 2003. UTM