Professional Documents
Culture Documents
Algoritmi 6
Algoritmi 6
ogranienja
Metoda grananja i ogranienja
LCS pretraivanje
Ne koristi se ni BFS ni DFS ve se svakom stanju definira
isplativost i razvija se ona grana stabla koja ima najveu
procjenjenu isplativost.
Prema minimizacijskoj varijanti, ovo se pretraivanje
naziva pretraivanje najmanje cijene (least cost)
Funkcija procjene isplativosti je najee brza heuristika
koja daje suboptimalno rjeenje.
Metoda grananja i ogranienja
if ((a+potezi[i][0]>=0) &&
(a+potezi[i][0]<n)
&& (b+potezi[i][1]>=0) &&
(b+potezi[i][1]<n)
&& (p[a+potezi[i][0]][b+potezi[i][1]]
==0)) {
p[a+potezi[i][0]][b+potezi[i][1]]=pot;
Knight(n,a+potezi[i][0],
b+potezi[i][1], p, pot+1);
p[a+potezi[i][0]][b+potezi[i][1]]=0;
}
}
Problem "konjiev skok"
else {
for (int i=0; i<n; i++) {
for (int j=0;j<n; j++)
cout << p[i][j] << "\t";
cout << endl;
}
system("pause");
exit(0);
}
}
Problem "konjiev skok"
Sloenost?
TMaxKnight(n)=O(8n)
Problem "konjiev skok"
if ((a+potezi[i][0]>=0) &&
(a+potezi[i][0]<n)
&& (b+potezi[i][1]>=0) &&
(b+potezi[i][1]<n)
&& (p[a+potezi[i][0]][b+potezi[i][1]]
==0)) {
int c=Check(n,a+potezi[i][0],
b+potezi[i][1], p);
int j=nn++;
Problem "konjiev skok"
else {
for (int i=0; i<n; i++) {
for (int j=0;j<n; j++)
cout << p[i][j] << "\t";
cout << endl;
}
system("pause");
exit(0);
}
}
Metoda grananja i ogranienja
Sortiraj(e,n)
Nai inicijalno rjeenje
BBKnap(e,n)
0-1 ranac
Sortiranje
Koristit e se ranije razvijeni heapsort algoritam
0-1 ranac
Funkcija isplativosti
Koristit emo pohlepni algoritam za stvari i, ..., n i
preostali obujam ranca.
Mogu se koristiti sljedee ocjene
Algoritam koji smo koristili za inicijalno rjeenje, s time to nije
potrebno vraati rjeenje, ve samo iznos procjene
Algoritam koji smo koristili za problem realnog ranca.
Koristit emo ovaj drugi, jer je on neto bri.
0-1 ranac
Struktura podataka
Koristit emo listu u kojoj emo uvati vorove koji se
trenutno razmatraju s podacima koji su nam potrebni
kako bismo procijenili isplativost razvoja neke grane:
Trenutno rjeenje s brojem stvari o kojima je ve donesena
odluka
Procjena isplativosti grane
Procjena perspektivnosti grane
Trenutno ostvarenu cijenu
Preostali obujam
vorovi e biti sortirani silazno prema procjeni isplativosti
0-1 ranac
Struktura podataka
Uvijek emo uzimati prvi element liste, obraditi
ga, te u listu dodati njegovu djecu, na mjesto
gdje spadaju prema procjeni isplativosti (insertion
sort)
Kako veliina ove liste moe jako varirati, koristit
emo implementaciju liste pomou pokazivaa
0-1 ranac
struct elem {
int i;
long sol;
double persp, ispl, P, V;
elem *next;
};
0-1 ranac
*n.sol=*el.sol;
*n.i=*el.i+1;
*n.P=*el.P;
*n.V=*el.V;
*n.persp=*el.persp-e[*el.i][0];
*n.ispl=*el.P+Cost(*el.i+1,n,*el.V,e,p);
0-1 ranac
*n.sol=*el.sol+int(pow(2.,i));
*n.i=*el.i+1;
*n.P=*el.P+e[*el.i][0];
*n.V=*el.V-e[*el.i][1];
*n.persp=*el.persp;
*n.ispl=*el.P+e[i][0]+Cost(*el.i+1,n,*el.V,e,p);
0-1 ranac
if (*el.persp-e[*el.i][0]>=P) {
0-1 ranac
if ((*el).V>=e[(*el).i][1]) {
0-1 ranac
if (*el.persp>P) {
?
0-1 ranac
if ((*el).V>=e[(*el).i][1]) {
elem *nw = new elem, *l = list;
(*nw).sol=
(*el).sol+int(pow(2.,(*el).i));
(*nw).i=(*el).i+1;
(*nw).P=(*el).P+e[(*el).i][0];
(*nw).V=(*el).V-e[(*el).i][1];
(*nw).persp=(*el).persp;
0-1 ranac
(*nw).ispl=(*el).P+e[(*el).i][0]+
Cost((*el).i+1,n,(*el).V,e,p);
while ((*l).next!=NULL &&
((*(*l).next).ispl>(*nw).ispl))
l=(*l).next;
(*nw).next=(*l).next;
(*l).next=nw;
}
}
0-1 ranac
else {
if ((e[n-1][1]<=(*el).V) &&
((*el).P+e[n-1][0]>P)) {
P=(*el).P+e[n-1][0];
sol=(*el).sol+int(pow(2.,n-1));
}
0-1 ranac
if ((e[n-1][1]>(*el).V) &&
((*el).P>P)) {
P=(*el).P;
sol=(*el).sol;
}
}
}
delete el;
}
delete [] p;
return sol;
}
0-1 ranac
Sloenost?
TmacxBBKnap(n)=O(n2n)