Documente Academic
Documente Profesional
Documente Cultură
Marti 13.01.2015
Miercuri 07.01.2014
t =0
t= t+1
populaia P(t+1)
diversitatea populaiei
intervalul [a, b]
precizia p
dimensiunea populaiei n
numrul de generaii
probabilitatea de ncruciare pc
probabilitatea de mutaie pm
Problema rucsacului
TSP (Travelling salesman problem) ciclul
hamiltonian minim
Criptare, code-breaking
Teoria jocurilor
Clustering
etc
f (H , t) n
(H )
m( H , t 1) m( H , t )
pm o( H )
1 pc
F (t )
l 1
Teorema schemei:
f (H , t) n
(H )
m( H , t 1) m( H , t )
1 pc
pm o( H )
F (t )
l 1
(
Probabilitatea de distrugere a schemei dup ncruciare
Teorema schemei:
f (H , t) n
(H )
m( H , t 1) m( H , t )
1 pc
pm o( H )
F (t )
l 1
(blocuri constituente/constructive)
Springer-Verlag.
Categorii
Monte Carlo
Las Vegas
numerici
**
1 - 1/2k
Pentru k=20, aceast probabilitate este
mai mare dect 0,999999.
repeat
i random(1..n); j random(1..n);
if ij and ti=tj
write ti; stop
until false
probabilitatea ca tj = t0
probabilitatea ca ti = tj = t0 este
1/10 * 1/10 = 1/100
1/10
probabilitatea ca tj = t0
1/10
probabilitatea ca ti = tj = t0 este
1/10 * 1/10 = 1/100
1/10
probabilitatea ca tj = t0
1/10
probabilitatea ca ti = tj = t0 este
1/10 * 1/10 = 1/100
Teoretic sunt suficiente 100 de ncercri,
independent de valoarea lui n
http://backtracking.xhost.ro/prcd.html
Reprezentarea soluiei
x = {x1, x2,, xn}, unde
xk = coloana pe care este plasat dama
de pe linia k
xk {1,2,,n}
pr
Algoritm probabilist
presupunnd c am plasat cte o dam pe liniile 1,...,k1, facem o list a poziiilor posibile pentru dama de pe
linia k
Dac lista este nevid, alegem aleator o poziie din
list
Altfel relum ntreg algoritmul (!nu ne ntoarcem la
linia precedent)
Algoritm probabilist
Algoritm probabilist
Algoritm probabilist
Algoritm probabilist
NE_SV[2..2n] (j + i = constant)
C[1..n]
0 1
n-1
2 3
n+1
n+2
-1
NV_SE
-n+1
NE_SV
2n
repeat
repeat
iniializm componentele celor 3 vectori C,
NV_SE, NE_SV cu valoarea true
k 1
formm un vector a cu acele poziii i{1,...,n}
cu
C[i] = NV_SE[i-k] = NE_SV[i+k] = true
i notm na lungimea vectorului obinut
if na>0 then
aleg aleator i{1,...,na}; i ai
xk i ;
NV_SE[i-k] false; NE_SV[i+k] false;
Ci false;
k k+1
until na=0 sau k=n+1
until k=n+1
write(x)
repeat
repeat
iniializm componentele celor 3 vectori C,
NV_SE, NE_SV cu valoarea true
k 1
formm un vector a cu acele poziii i{1,...,n}
cu
C[i] = NV_SE[i-k] = NE_SV[i+k] = true
i notm na lungimea vectorului obinut
if na>0 then
aleg aleator i{1,...,na}; i ai
xk i ;
NV_SE[i-k] false; NE_SV[i+k] false;
Ci false;
k k+1
until na=0 sau k=n+1
until k=n+1
write(x)
Aproximarea lui
Aproximarea
f ( x) dx
a
f : a , b c, d
va fi "suficient de aproape" de .
va fi "suficient de aproape" de .
va fi "suficient de aproape" de .
tinde la
f ( x) dx,
f : a , b c, d
fhfghfgh
f ( x) dx,
f : a , b c, d
fhfghfgh
b
f ( x) dx,
f : a , b c, d
s 0
for i=1,n
x random([a,b]);
s s+f(x)
s s.(b-a)/n
write(s)
fhfghfgh
xk
Dac nu este satisfcut condiia de
continuare nu se mai parcurge subarborele
xk
Atribuie i avanseaz
x1
x2
xk v
sunt verificate condiiile de continuare
xk+1
ncercare euat
x1
x2
xk v
nu sunt verificate condiiile
de continuare
Revenire
x1
x2
xk
xk
xn
soluie
revenire dup
determinarea unei soluii
Ci, i;
k1;
while k>0
if k=n+1
retsol(x); kk-1;{revenire dup o soluie}
else
if Ck Xk
alege vXk\Ck; CkCk{v};
if k(x1,,xk-1,v)
xkv; kk+1; { atribuie i avanseaz }
else
{ ncercare euat }
else Ck; kk-1;
{ revenire }
Ci, i;
k1;
while k>0
if k=n+1
retsol(x); kk-1;{revenire dup o soluie}
else
if Ck Xk
alege vXk\Ck; CkCk{v};
if k(x1,,xk-1,v)
xkv; kk+1; { atribuie i avanseaz }
else
{ ncercare euat }
else Ck; kk-1;
{ revenire }
Ci, i;
k1;
while k>0
if k=n+1
retsol(x); kk-1;{revenire dup o soluie}
else
if Ck Xk
alege vXk\Ck; CkCk{v};
if k(x1,,xk-1,v)
xkv; kk+1; { atribuie i avanseaz }
else
{ ncercare euat }
else Ck; kk-1;
{ revenire }
Ci, i;
k1;
while k>0
if k=n+1
retsol(x); kk-1;{revenire dup o soluie}
else
if Ck Xk
alege vXk\Ck; CkCk{v};
if k(x1,,xk-1,v)
xkv; kk+1; { atribuie i avanseaz }
else
{ ncercare euat }
else Ck; kk-1;
{ revenire }
Ci, i;
k1;
while k>0
if k=n+1
retsol(x); kk-1;{revenire dup o soluie}
else
if Ck Xk
alege vXk\Ck; CkCk{v};
if k(x1,,xk-1,v)
xkv; kk+1; { atribuie i avanseaz }
else
{ ncercare euat }
else Ck; kk-1;
{ revenire }
Ci, i;
k1;
while k>0
if k=n+1
retsol(x); kk-1;{revenire dup o soluie}
else
if Ck Xk
alege vXk\Ck; CkCk{v};
if k(x1,,xk-1,v)
xkv; kk+1; { atribuie i avanseaz }
else
{ ncercare euat }
else Ck; kk-1;
{ revenire }
Colorarea hrilor
Reprezentareansoluiei
x = {x1, x2,, xn}, unde
xk {1,2,,n} (pk = 1, uk = n).
1
1
1
1
1
1
1
1
1
1
1
1
1
2
2
2
2
2
3
3
3
3
3
1
2
3
3 soluie
1
2
2 soluie
3
2
2 1
2 1
2 1
2 1
2 1
etc
1
2
3
3 soluie
Reprezentareansoluiei
x = {x1, x2,, xn}, unde
vecin cu ara k
Reprezentareansoluiei
x = {x1, x2,, xn}, unde
xk = culoarea cu care este colorat ara k
xk {1,2,3,4} (pk = 1, uk = 4).
vecin cu ara k
Reprezentareansoluiei
x = {x1, x2,, xn}, unde
xk = culoarea cu care este colorat ara k
xk {1,2,3,4} (pk = 1, uk = 4).
vecin cu ara k
Reprezentareansoluiei
x = {x1, x2,, xn}, unde
xk = culoarea cu care este colorat ara k
xk {1,2,3,4} (pk = 1, uk = 4).
vecin cu ara k
void back(){
int k=1;
x=new int[n+1];
for(int i=1;i<=n;i++) x[i]=0;
while(k>0){
if(k==n+1){retsol(x); k--;} //revenire dupa sol
else{
if(x[k]<4){
x[k]++;
//atribuie
if (cont(k)) k++;
//si avanseaza
}
else{ x[k]=0; k--; }
}
}
}
//revenire
void back(){
int k=1;
x=new int[n+1];
for(int i=1;i<=n;i++) x[i]=0;
while(k>0){
if(k==n+1){retsol(x); k--;} //revenire dupa sol
else{
if(x[k]<4){
x[k]++;
//atribuie
if (cont(k)) k++;
//si avanseaza
}
else{ x[k]=0; k--; }
}
}
}
//revenire
void back(){
int k=1;
x=new int[n+1];
for(int i=1;i<=n;i++) x[i]=0;
while(k>0){
if(k==n+1){retsol(x); k--;} //revenire dupa sol
else{
if(x[k]<4){
x[k]++;
//atribuie
if (cont(k)) k++;
//si avanseaza
}
else{ x[k]=0; k--; }
}
}
}
//revenire
Reprezentareansoluiei
x = {x1, x2,, xn}, unde
de pe linia k
xk {1,2,,n}
(pk = 1, uk = n).
Condiii de continuare
pentru orice i<k: xixk i |xi-xk|k-i
Reprezentareansoluiei
x = {x1, x2,, xn}, unde
de pe linia k
xk {1,2,,n}
(pk = 1, uk = n).
Condiii de continuare
pentru orice i<k: xixk i |xi-xk|k-i
Reprezentareansoluiei
x = {x1, x2,, xn}, unde
de pe linia k
xk {1,2,,n}
(pk = 1, uk = n).
Condiii de continuare
pentru orice i<k: xixk i |xi-xk|k-i
Reprezentareansoluiei
x = {x1, x2,, xn}, unde
de pe linia k
xk {1,2,,n}
(pk = 1, uk = n).
Condiii de continuare
pentru orice i<k: xixk i |xi-xk|k-i
void back(){
int k=1;
x=new int[n+1];
else{
if(x[k]<n){
x[k]++;
//atribuie
if (cont(k)) k++;
//si avanseaza
}
else{ x[k]=0;
}
}
}
k--; }
//revenire
void back(){
int k=1;
x=new int[n+1];
else{
if(x[k]<n){
x[k]++;
//atribuie
if (cont(k)) k++;
//si avanseaza
}
else{ x[k]=0;
}
}
}
k--; }
//revenire
Reprezentareansoluiei
x = {x1, x2,, xn}, unde
xk {'(', ')'}
Condiii de continuare
dif 0
dif n-k
-> i suficient
Reprezentareansoluiei
x = {x1, x2,, xn}, unde
xk {'(', ')'}
Condiii de continuare
dif 0
dif n-k
-> i suficient
Reprezentareansoluiei
x = {x1, x2,, xn}, unde
xk {'(', ')'}
Condiii de continuare
dif 0
dif n-k
-> i suficient
Reprezentareansoluiei
x = {x1, x2,, xn}, unde
xk {'(', ')'}
Condiii de continuare
dif 0
Reprezentareansoluiei
x = {x1, x2,, xn}, unde
xk {'(', ')'}
Condiii de continuare
dif 0
dif n-k
-> i suficient
void back(){
dif=0;
back(1);
}
void back(int k){
if(k==n+1)
retsol(x);
else{
x[k]='(';
dif++;
if (dif <= n-k)
back(k+1);
dif--;
x[k]=')';
dif--;
if (dif >= 0)
back(k+1);
dif++;
}
}
void back(){
dif=0;
back(1);
}
void back(int k){
if(k==n+1)
retsol(x);
else{
x[k]='(';
dif++;
if (dif <= n-k)
back(k+1);
dif--;
x[k]=')';
dif--;
if (dif >= 0)
back(k+1);
dif++;
}
}
void back(){
dif=0;
back(1);
}
void back(int k){
if(k==n+1)
retsol(x);
else{
x[k]='(';
dif++;
if (dif <= n-k)
back(k+1);
dif--;
x[k]=')';
dif--;
if (dif >= 0)
back(k+1);
dif++;
}
}
Reprezentareansoluiei
x = {x1, x2,, xk}, unde
xi {1,,n}
xk = n
Condiii de continuare
xk-1 xk
x1 + x2 +... +
xk {xk-1,,n}
xk n
xk
Reprezentareansoluiei
x = {x1, x2,, xk}, unde
xi {1,,n}
xk = n
Condiii de continuare
xk-1 xk
x1 + x2 +... +
xk {xk-1,,n}
xk n
xk
Reprezentareansoluiei
x = {x1, x2,, xk}, unde
xi {1,,n}
xk = n
xk
Condiii de continuare
xk-1 xk
x1 + x2 +... +
xk {xk-1,,n} = Xk
xk n
void back(){
int k=1,s=0; int x[]=new int[n+1];
x[1]=0;
while(k>=1){
if(x[k]<n){
x[k]++; s++;
if(s<=n){//cont verif. conditiilor de cont
if(s==n){//dc este sol
retsol(x,k);
s=s-x[k]; k--;//revenire dupa sol
}
else{ k++; x[k]=x[k-1]-1; s+=x[k]; //avansare
}
}
else{ s=s-x[k]; k--; //revenire
}
}
}
}
void back(){
int k=1,s=0; int x[]=new int[n+1];
x[1]=0;
while(k>=1){
if(x[k]<n){
x[k]++; s++;
if(s<=n){//cont verif. conditiilor de cont
if(s==n){//dc este sol
retsol(x,k);
s=s-x[k]; k--;//revenire dupa sol
}
else{ k++; x[k]=x[k-1]-1; s+=x[k]; //avansare
}
}
else{ s=s-x[k]; k--; //revenire
}
}
}
}
void back(){
int k=1,s=0; int x[]=new int[n+1];
x[1]=0;
while(k>=1){
if(x[k]<n){
x[k]++; s++;
if(s<=n){//cont verif. conditiilor de cont
if(s==n){//dc este sol
retsol(x,k);
s=s-x[k]; k--;//revenire dupa sol
}
else{ k++; x[k]=x[k-1]-1; s+=x[k]; //avansare
}
}
else{ s=s-x[k]; k--; //revenire
}
}
}
}
void back(){
int k=1,s=0; int x[]=new int[n+1];
x[1]=0;
while(k>=1){
if(x[k]<n){
x[k]++; s++;
if(s<=n){//cont verif. conditiilor de cont
if(s==n){//dc este sol
retsol(x,k);
s=s-x[k]; k--;//revenire dupa sol
}
else{ k++; x[k]=x[k-1]-1; s+=x[k]; //avansare
}
}
else{ s=s-x[k]; k--; //revenire
}
}
}
}
0 1 0 1
0 1 0 1
Reprezentareansoluiei
x = {x1, x2,, xk}, unde
xi = a i-a celul din drum
Condiii de continuare
xk celul liber (cu 0) prin care nu am mai trecut
Reprezentareansoluiei
x = {x1, x2,, xk}, unde
xi = a i-a celul din drum
Condiii de continuare
xk celul liber (cu 0) prin care nu am mai trecut
Reprezentareansoluiei
x = {x1, x2,, xk}, unde
xi = a i-a celul din drum
Condiii de continuare
xk celul liber (cu 0) prin care nu am mai trecut
Apel:
x1 (i0, j0);
k = 1;
back(i0, j0)