Ho provato, in breve tempo, ad implementere uno script Matlab (R)
per la risoluzione del problema:
Testo nascosto, fai click qui per vederlo
- Codice:
close all, clear, clc
L=55;
a=floor(mod(randn(L,L),2));
imshow(a),colorbar
b=zeros(size(a)); % matrice di prova
x=1+(L/2)-.5;
y=1+(L/2)-.5;
b(x,y)=1;
iter=1;
while (iter<=10^5 | x==L-1 | y==L-1 )
D=a(x,y);
A=zeros(1,4);
if a(x,y-1)==D, A(1,1)=1; end % a sinistra
if a(x,y+1)==D, A(1,2)=1; end % a destra
if a(x-1,y)==D, A(1,3)=1; end % sopra
if a(x+1,y)==D, A(1,4)=1; end % sotto
k=find(A); % trova i valori non nulli del vettore (A)
s=1+floor(mod(randn(1,1),length(k)));
K=k(s); % primo elemento di k
if K==1, y=y-1; b(x,y)=1; end
if K==2, y=y+1; b(x,y)=1; end
if K==3, x=x-1; b(x,y)=1; end
if K==4, x=x+1; b(x,y)=1; end
iter=iter+1;
end
figure(2),imshow(b), colormap(summer), colorbar
nnz(b)
Per verificarne la bontà ecco la rappresentazione grafica
di una matrice random (50*50) composta da 1 e da 0:
e l'output grafico del programma:
Il numero di caselle gialle, nella figura di sopra, è 124 (che fortuna!!!)
Ecco i valori di altri miei esperimenti:
24 4 10 77 41
32 119 58 10 27
8 78 256 37 34
66 43 8 14 13
100 89 69 35 14
112 272 9 6 37
8 63 103 12 28
60 12 18 21 46
16 51 72 8 9
67 71 71 77 9
50 5 189 27 68
13 17 6 82 10
26 120 107 42 138
88 21 90 56 13
62 52 2 2 9
196 4 52 2 31
188 28 161 5 4
da cui il valore medio è 52.8235 e la deviazione standard è 19.8921.
N.B. tra i valori numerici non compare 1 a causa di un problema corretto
nel codice riportato sotto.
e a questo punto mi sono un pò stancato!!!
Ecco un abbozzo di codice che itera il processo:
(n.b.: a volte lo script si arresta. Ciò accade quando si raggiungono i
bordi della matrice!)
Purtroppo ora il tempo mi è tiranno, ma spero presto di risolvere.
Testo nascosto, fai click qui per vederlo
- Codice:
close all, clear, clc
L=55;
replicati=8;
prove=5;
N=zeros(replicati,prove);
for X=1:replicati
for XX=1:prove
a=floor(mod(randn(L,L),2));
% figure,imshow(a),colorbar
b=zeros(size(a)); % matrice di prova
x=1+(L/2)-.5;
y=1+(L/2)-.5;
b(x,y)=1;
iter=1;
while (iter<=10^5 | x==L-1 | y==L-1 )
D=a(x,y);
A=zeros(1,4);
if a(x,y-1)==D, A(1,1)=1; end % a sinistra
if a(x,y+1)==D, A(1,2)=1; end % a destra
if a(x-1,y)==D, A(1,3)=1; end % sopra
if a(x+1,y)==D, A(1,4)=1; end % sotto
k=find(A); % trova i valori non nulli del vettore (A)
s=1+floor(mod(randn(1,1),length(k)));
if isempty(k)==1
K=0
else
K=k(s); % primo elemento di k
end
if K==0, y=y; x=x; b(x,y)=1; end
if K==1, y=y-1; b(x,y)=1; end
if K==2, y=y+1; b(x,y)=1; end
if K==3, x=x-1; b(x,y)=1; end
if K==4, x=x+1; b(x,y)=1; end
iter=iter+1;
end
% figure,imshow(b), colormap(summer), colorbar
N(X,XX)=nnz(b);
end % prove
end % replicati
Ed ecco un caso in cui si blocca:
e l'output (alla penultima iterazione si è raggiunto il bordo):
59 2 123 5 4
76 108 27 82 24
57 8 133 58 7
50 222 48 45 4
80 1 41 43 133
86 5 232 86 121
24 120 150 41 93
1 24 113 0 0
Per ovviare aumentare la dimensione della matrice... ma fino a quanto???
penso non di molto.
Infatti portando la matrice a 75*75 elementi ecco altri risultati:
[list]20 3 2 31 79
144 18 17 49 90
25 29 9 124 12
48 46 144 92 11
14 6 1 23 15
38 46 61 138 51
19 27 2 40 2
34 105 7 7 1
32 16 7 14 15
77 74 2 107 24
165 4 35 5 66
179 45 7 9 92
33 36 6 35 88
139 24 1 2 130
36 173 16 2 8[\list]
Media: 44.4533 e deviazione standard :7.8685.
Per cui il risultato corretto dovrebbe essere compreso
, come supposto dal propositore del problema,
con la confidenza del 99%, tra $ 44.4533 \pm 2.576 xx 7.8685 $.
Arrotondando l'area della regione è compresa tra 24 e 65.
In attesa di un risultato esatto oltre che approssimato (matematici al lavoro!!!
),
Vi saluto tutti con affetto augurandovi un divertente anno nuovo...