Voters 4

Il programma

Di seguito un listato dimostrativo scritto in linguaggio Octave che ho usato per fare le simulazioni di cui abbiamo parlato precedentemente.

Questo particolare listato implementa il metodo di scelta dell’elettore e del suo vicino completamente casuale, ma modificandolo aggiungendo poche istruzioni in più si ottengono le altre versioni.

Per chi volesse provare ad eseguirlo, sappia che c’e’ VOLUTAMENTE un “bug” sulla routine di generazione dei numeri casuali:  questa non genera numeri completamente a caso se non viene inizializzata correttamente. Se volete una generazione di numeri completamente a caso, senza stare a trovare l’istruzione giusta da inserire dove vi ho segnalato, lanciate il programma, ne interrompete l’esecuzione senza uscire da Octave ( scartando i risultati fino a quel momento ottenuti)  e rilanciate il programma. L’esercizio e’ quello di aggiungere UNA SINGOLA riga di codice che fa generare i numeri casuali in modo veramente casuale.

%
% definizione delle variabili
%
dim_matrice=32;
num_opinioni=10;
numero_di_ciclo=4000000
num_sottocicli=20
numero_di_ciclo_minore=numero_di_ciclo/num_sottocicli;
rel_x=0; 
rel_y=0;
%
% dimensionamento dei vettori dell'istogramma
% istogramma0 = istogramma delle condizioni iniziali
% istogramma1 = istogramma della situazione in divenire
%
istogramma0=zeros(1 num_opinioni);
istogramma1=zeros(1 num_opinioni);
%
% inizializzazione della tabella dove sono conservate le opinioni
%
% inserire qui l'istruzione per inizializzare correttamente il generatore di numeri casuali
%
votanti=int32(((num_opinioni-1)*rand(dim_matrice,dim_matrice))+1);
elementi_matrice=dim_matrice*dim_matrice
%
% calcolo l'istogramma. si potrebbe fare meglio ma per adesso la faccio cosi'.
%
for ( i = 1 : dim_matrice )
     for ( j = 1 : dim_matrice )
         for (k = 1 : num_opinioni ) 
           if (votanti(i,j) == k ) istogramma0(k) = istogramma0(k)+1 ; end
         end     
       end
     end 
%
% stampa l'istogramma ( solo i valori ) a video 
% 
istogramma0 
%
%  inizio del ciclo principale
%
for ( ii = 1 :num_sottocicli )
  for ( i = 1 : numero_di_ciclo_minore )
     %selezione del punto
         x=int32( (dim_matrice-1)*rand())+1;
         y=int32( (dim_matrice-1)*rand())+1;
     %
     %   costruzione dell'intorno di voto ( genera un numero fra -1 ed 1 )
     %     
         rel_x=int32(3*rand()-1.5);
         rel_y=int32(3*rand()-1.5);
         new_x=x+rel_x;
         new_y=y+rel_y;
     %
     % controllo che il punto non vada oltre i limiti e nel caso ci vada gli dico
     % di andare a prendere il valore del corrispondente dall'altro lato della tabella
     % simulo di aver messo la tabella su un toro.     
     %
        temp = (new_x * new_y);
        if (new_x < 1) new_x=dim_matrice; end
        if (new_y < 1) new_y=dim_matrice; end
        if (new_x > dim_matrice) new_x = 1; end
        if (new_y > dim_matrice) new_y = 1; end
     % 
      end
 %
 % **** cambio di opinione ***** modificare qui per cambiare la modalità di convincimento
 %
     if ( rand() >= 0.5 )
         votanti(new_x,new_y)=votanti(x,y);
      end
 end 
%
% azzera l'istogramma1 
% 
istogramma1=zeros(1 num_opinioni);
  for ( i = 1 : dim_matrice )
     for ( j = 1 : dim_matrice )
         for (k = 1 : num_opinioni )
     %
     % calcolo l'istogramma. sarebbe da fare meglio ma per adesso la faccio cosi'. 
     %
             if (votanti(i,j) == k )
             istogramma1(k) =istogramma1(k)+1 ; end
         end
     end
    end
 printf ('ciclo=%i ------- istogramma -----------------------------',ii);
 %
 % stampa l'istogramma ( solo i valori ) a video
 % 
 istogramma1 
end
Advertisements

2 pensieri su “Voters 4

  1. Pingback: Voters 3 | Num3ri v 2.0

  2. Pingback: Pochi ma Buoni ? | Num3ri v 2.0

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...