Messaggioda Rigel » 03/01/2011, 20:38

Ecco il codice.

Testo nascosto, fai click qui per vederlo
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>


int nMinX, nMaxX, nMinY, nMaxY;
int **p;
int setcall = 0;

typedef struct { int xl, xr, y, dy; } LINESEGMENT;

#define MAXDEPTH 10000

#define PUSH(XL, XR, Y, DY) \
if( sp < stack+MAXDEPTH && Y+(DY) >= nMinX && Y+(DY) <= nMaxY ) \
{ sp->xl = XL; sp->xr = XR; sp->y = Y; sp->dy = DY; ++sp; }

#define POP(XL, XR, Y, DY) \
{ --sp; XL = sp->xl; XR = sp->xr; Y = sp->y+(DY = sp->dy); }

int GetPixel(int x, int y) {
return p[x][y];
}

void SetPixel(int x, int y, int c) {
p[x][y] = c;
setcall++;
}

// Fill background with given color

void SeedFill_4(int x, int y, int new_color)
{
int left, x1, x2, dy;
int old_color;
LINESEGMENT stack[MAXDEPTH], *sp = stack;

old_color = GetPixel(x, y);
if( old_color == new_color )
return;

if( x < nMinX || x > nMaxX || y < nMinX || y > nMaxY ) {
puts("Border");
return;
}

PUSH(x, x, y, 1); /* needed in some cases */
PUSH(x, x, y+1, -1); /* seed segment (popped 1st) */

while( sp > stack ) {
POP(x1, x2, y, dy);

for( x = x1; x >= nMinX && GetPixel(x, y) == old_color; --x )
SetPixel(x, y, new_color);

if( x >= x1 )
goto SKIP;

left = x+1;
if( left < x1 )
PUSH(y, left, x1-1, -dy); /* leak on left? */

x = x1+1;

do {
for( ; x<=nMaxX && GetPixel(x, y) == old_color; ++x )
SetPixel(x, y, new_color);

PUSH(left, x-1, y, dy);

if( x > x2+1 )
PUSH(x2+1, x-1, y, -dy); /* leak on right? */

SKIP: for( ++x; x <= x2 && GetPixel(x, y) != old_color; ++x ) {;}

left = x;
} while( x<=x2 );
}
}

int main(int argc, char *argv[]) {
// dimensione del reticolo
int d = 1000;
// numero di prove
int iter = 100;
double res[iter];

nMinX = 0;
nMaxX = d-1;
nMinY = 0;
nMaxY = d-1;

p = new int*[d];
for (int i=0; i<d; i++) {
p[i] = new int[d];
}

// inizializza il generatore random
srand(time(0));

double s = 0, ss = 0;

for (int n = 0; n < iter; n++) {
// inizializza il reticolo con dati random fra 0 e 1
for (int i=0; i<d; i++) {
for (int j=0; j<d; j++) {
p[i][j] = rand() % 2;
}
}

setcall = 0;

SeedFill_4(d/2, d/2, 1 - GetPixel(d/2, d/2));

printf("%7d,", setcall);
res[n] = setcall;
s += setcall;
double s2 = setcall;
ss += s2 * s2;
}

double m = s / iter;
double var = (ss - s*s / iter) / (iter - 1);
//printf("\nSomma = %f, Somma quad = %f\n", s, ss);
printf("\nMedia = %f, varianza = %f\n", m, var);
}
Rigel
Cannot live without
Cannot live without
 
Messaggio: 632 di 7818
Iscritto il: 13/01/2010, 08:31

Messaggioda Umby » 03/01/2011, 20:42

Rigel ha scritto:Ecco il codice.



Ti è difficile postare un file testo contenente la griglia ( 0, 1 ) delle 100 simulazioni da te effettuate ?

Mi è piu' facile lavorare su una "base dati comune" anzichè verificare il tuo codice.
Ultima modifica di Umby il 03/01/2011, 21:49, modificato 1 volta in totale.
Umby
Advanced Member
Advanced Member
 
Messaggio: 1125 di 2313
Iscritto il: 01/11/2008, 16:50
Località: Napoli

Messaggioda Rigel » 03/01/2011, 20:45

Ehm, si tratta di griglie 1000x1000...

Per quel che può servire, ti posso postare l'output del programma:

181, 1, 4, 9, 3, 5, 2, 734, 2, 97,
128, 58, 2, 43, 4, 943, 1347, 5, 9, 795,
216, 38, 810, 123, 25, 305, 135, 145, 1181, 72,
26, 2, 127, 34, 29, 177, 3, 34, 22, 50758,
157, 25, 2, 8, 878, 18, 115, 5, 89, 67,
3, 47272, 20, 11, 446, 30, 4, 30, 23, 487,
367, 25, 12, 7, 52, 238, 7707, 479, 98905, 14,
11, 119, 52, 48, 10, 123, 16, 5, 13, 7,
1, 50, 3, 21240, 246, 23, 15, 52, 359, 28,
2916, 1, 1, 19, 1947, 136, 8, 37, 4, 15,

Media = 2436.350000, varianza = 146774187.340909

Sono in effetti sospetti i valori molto elevati (>10000); dovrei dare un'occhiata per vedere se ci sono problemi al bordo.
Rigel
Cannot live without
Cannot live without
 
Messaggio: 633 di 7818
Iscritto il: 13/01/2010, 08:31

Messaggioda Rigel » 03/01/2011, 20:59

Quei lavori elevati sono effettivamente errati; aumentando la dimensione della griglia (e dunque la probabilità di finire al bordo) tendono a sparire.

Questi i risultati con griglia 2000x2000:

7, 1, 2412, 327, 9, 52, 28, 185, 1, 4,
19, 4291, 44, 56, 3, 15, 145, 1, 89, 8,
12, 20, 9, 8, 12, 3, 7, 20, 1, 1734,
2, 31, 6, 18, 5, 5507, 124, 1126, 15, 22,
1, 28, 58, 74, 12, 25, 2271, 1, 39, 277,
164, 365, 23, 130, 733, 37, 1, 229, 48, 56,
9, 4, 1682, 45, 8, 20, 2, 27, 132, 25,
14, 14, 119, 1, 117, 43, 8, 9, 3, 1,
408, 430, 5, 11, 155, 129, 60, 15, 38, 35,
54, 568, 11, 5, 680, 1, 75, 109, 67, 4,

Media = 260.940000, varianza = 629606.218586

E questi con griglia 3000x3000:

65, 5236, 110, 5, 170, 241, 8, 14, 22, 16,
51, 1, 70, 4, 550, 17, 10, 9, 1, 45,
64, 139, 1067, 1, 74, 82, 129, 30, 82, 10,
8, 1, 65, 7, 1, 79, 20, 6, 116, 1,
14, 4, 9, 3080, 689, 16, 1935, 48, 72, 48,
46, 10639, 335, 61, 22, 14, 1, 3, 30, 1,
581, 235, 8, 36, 5, 446, 12, 2187, 689, 32,
62, 20, 4237, 47, 11, 7, 8, 4, 267, 773,
1002, 73, 650, 7, 78, 1, 30, 3551, 203, 1,
10, 68, 122, 1, 1309, 56, 41, 6, 63, 35,

Media = 426.680000, varianza = 1799858.745051
Rigel
Cannot live without
Cannot live without
 
Messaggio: 634 di 7818
Iscritto il: 13/01/2010, 08:31

Messaggioda Deckard » 03/01/2011, 21:32

Lord K ha scritto:Mi viene in mente una distribuzione binomiale (di Bernoulli), considerando un cammino di \( \displaystyle n \) passi con probabilità di continuare pari a \( \displaystyle 1/2 \) con infiniti lanci... risulta che il valore atteso di quella area sia \( \displaystyle \infty \) anche perchè il valore atteso della binomiale è un minorante del valore che l'area percorribile.

Non credo sia corretto: la binomiale si può applicare (ed è quello che hai fatto tu) per calcolare il valore atteso del numero di celle dello stesso colore di quella iniziale (che in una matrice infinita è difatti ovviamente illimitato), ma in questo caso conta anche come sono disposte le celle di uno stesso colore e di conseguenze che la cella j sia raggiungibile non dipende solo dal colore della cella stessa e di conseguenza gli eventi "la cella j è raggiungibile" NON sono indipendenti tra loro.
http://www.mathcomp.leeds.ac.uk/turing2012/

Hilbert space is a big place.
Deckard
Average Member
Average Member
 
Messaggio: 73 di 503
Iscritto il: 17/08/2010, 08:58

Messaggioda Umby » 03/01/2011, 21:52

Rigel ha scritto:Ehm, si tratta di griglie 1000x1000...



Non importa la grandezza.
Se riesci a generare il file, zippandolo (si tratta di un file testo) ottieni un valore di compressione molto alto
Umby
Advanced Member
Advanced Member
 
Messaggio: 1126 di 2313
Iscritto il: 01/11/2008, 16:50
Località: Napoli

Messaggioda Umby » 03/01/2011, 21:54

Rigel ha scritto:
Sono in effetti sospetti i valori molto elevati (>10000); dovrei dare un'occhiata per vedere se ci sono problemi al bordo.


Perchè ritieni sospetti questi valori elavati !!!
Secondo me, è normale che ci siano .... anzi, piu si va avanti più è facile "continuare"

Mi spiego meglio: è più facile che la "catena" si spezzi all'inizio che non dopo.
Umby
Advanced Member
Advanced Member
 
Messaggio: 1127 di 2313
Iscritto il: 01/11/2008, 16:50
Località: Napoli

Messaggioda cenzo » 03/01/2011, 22:48

Umby ha scritto:Secondo me, è normale che ci siano .... anzi, piu si va avanti più è facile "continuare"
Mi spiego meglio: è più facile che la "catena" si spezzi all'inizio che non dopo.

Mi sembra sensato: più aumenta il perimetro della "marea nera" e più è improbabile contenerla :wink:
Happiness only real when shared
cenzo
Advanced Member
Advanced Member
 
Messaggio: 214 di 2239
Iscritto il: 15/02/2010, 21:31

Messaggioda fu^2 » 04/01/2011, 01:34

lukul ha scritto:
fu^2: l'area "dovrebbe essere" (con elevata probabilità) finita perchè la tua matrice è binaria (consentimi questa accezione
per indicare che è composta solo dai numeri uno e da zero) e random (cioè avente una distribuzione CASUALE degli elementi)


dunque supponi che ogni pixel ha probabilità 0.5 di essere bianco e 0.5 di essere nero. Parlare di distribuzioni ha completamente senso.

In una dimensione l'area è limitata con probabilità uno, in dimensione due secondo me è falso come ho già detto.
Avatar utente
fu^2
Cannot live without
Cannot live without
 
Messaggio: 3400 di 4216
Iscritto il: 06/09/2006, 22:04

Messaggioda Rggb » 04/01/2011, 09:46

fu^2 ha scritto:In una dimensione l'area è limitata con probabilità uno, in dimensione due secondo me è falso come ho già detto.

Cercavo di definire il problema così (e in questo modo mi muoverei per una eventuale dimostrazione), senza usare matrici predefinite in dimensione:
- la cella iniziale ha 4 adiacenti ognuna con $p=1/2$ di essere dello stesso colore, quindi ha un valore atteso di 2 celle adiacenti dello stesso colore;
- le celle adiacenti a queste sono 8, ma se considero il valore atteso di prima sono 5 (6 a seconda della configurazione), essendo sempre $p=1/2$ ho valore atteso di 2 (3) celle dello stesso colore;
- le celle adiacenti a queste sono 12, già le configurazioni si complicano ma credo si possa calcolare il valore atteso;

e possiamo proseguire, magari cercando una formula ricorsivamente utilizzabile.

Quindi è logico aspettarsi una varianza elevata dell'area, così come (sembra) è logico aspettarsi una area mediamente grande (infinita?). Magari dopo provo a fare un algoritmo.
Avatar utente
Rggb
Cannot live without
Cannot live without
 
Messaggio: 1055 di 3226
Iscritto il: 30/07/2009, 17:27

PrecedenteProssimo

Torna a Pensare un po' di più

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite