Newsgroup: it.comp.ia
Titolo: Aiuto: metodi di apprendimento (lungo)

Salve a tutti, ho creato un programmino (allegato sotto) per
addestrare un robot scritto nell'ambiente P-Robots (una versione
corretta e' scaricabile a 
www.lagrandezucca.cjb.net
) attraverso la
modifica di un unico parametro scelto tra una serie impostabile in
fase di input, il meccanismo di apprendimento che ho implementato e'
in realta' piuttosto banale: una volta scelto a caso il valore esegue
una simulazione assegnando +2 punti per la vittoria e -1 per la
sconfitta, se pero' i valori a fianco hanno punteggio migliore
seleziona per la simulazione il valore di due posizioni a destra o a
sinistra. Quello che vi chiedo e' se con un solo parametro e'
possibile fare di meglio, cosa si potrebbe fare di "figo"
(passatemela) con piu' parametri, quale materiale potrei consultare
per prendere delle idee. Specifico che in fatto di IA sono totalmente
digiuno quindi cercate di "limare" i termini troppo tecnici.
Grazie anticipatamente.
Omega e' omega e basta.
DOCUMENTAZIONE
Coach e' stato creato per essere d'aiuto in quelle situazioni in cui
abbiamo un robot il cui funzionamento dipende da un parametro numerico
ma
non siamo sicuri di quale sia il valore piu' efficiente ai fini della
vittoria. Coach s'incarica di risolvere questo problema in maniera
semplice
ed empirica: una volta istruito sulla serie di valori che si vuole
testare e
sulla batteria di robots con cui confrontarsi, esegue una serie di
scontri
(anche questi impostabili) scegliendo ogni volta un valore a caso tra
quelli
assegnati e registrando sconfitte e vittorie tramite un meccanismo di
apprendimento, alla fine emettera' i risultati sotto forma di
punti-vittoria
per ogni valore.
Per eseguire in pratica quanto finora detto bisogna per prima cosa
aprire il
file [.pr] del robot in esame e inserire alla destra dell'assegnamento
del
parametro che ci interessa la speciale dicitura $coach$, poi creiamo
un file di
testo con nome [coach.dat] con le regole che verranno spiegate. Nella
prima
riga si metta il numero di scontri che si vuole far combattere al
nostro robot,
ovviamente maggiore sara' questo numero maggiore sara' l'affidabilita'
dei
risultati. Nella seconda riga si metta il nome di tale robot completo
dell'estensione [.pr]. Nella terza riga si mettano i nomi dei robots
che faranno
da avversari. Infine nella quarta riga andranno messi i valori - che
devono essere
obbligatoriamente di tipo intero, separati da spazi - da noi scelti e
che andranno
a sostituire $coach$; sebbene poi non e' necessario siano in ordine
crescente in
molti casi questa e' una scelta consigliabile.
I risultati verranno poi stampati in fondo allo stesso file
[coach.dat] e al
posto di $coach$ verra' sostituito il valore con il piu' alto
conseguimento di
punti-vittoria.
A eccezione di quanto detto finora se il numero di valori e' pari a
due non
viene compiuta l'analisi descritta, bensi' un test statistico basato
sulla
distribuziome binomiale. Esso permette di calcolare la probabilita'
che in
un eguale numero di scontri alternando un valore all'altro,
nell'ipotesi che
in entrambe le situazioni il robot abbia la stessa possibilita' di
vincere
(chiamata ipotesi nulla), la disparita' di vittorie sia solo una
fluttuazione
casuale. In caso questa probabilita' sia bassa si concludera' che il
valore
maggiormente vincente apporta un significativo miglioramento al robot.
SORGENTE
program Coach;
{$N+,E+}
{$M $4000,0,0}
uses Dos;
const
maxval=50;
ppstr='$coach$';
var
nvalori : integer;
valori : array[0..maxval,0..1] of integer;
nscontri : integer;
robtest : string[12];
robscrew : string[50];
pprow,ppcol,pplen : integer;
procedure Errore(nerr : integer);
begin
case nerr of
  1: writeln('File non trovato');
  2: writeln(ppstr,' non trovato');
  3: writeln('Errore di P-Robots');
  4: writeln('Nessun valore trovato');
end;
halt(1);
end;
function Pot(a : double; b : integer) : double;
var
i : integer;
aus : double;
begin
aus:=1.0;
for i:=1 to abs(b) do aus:=aus*a;
if b<0 then aus:=1.0/aus;
pot:=aus;
end;
function Fatt(n1,n2 : integer) : double;
var
i : integer;
aus : double;
begin
aus:=1.0;
for i:=n1 to n2 do aus:=aus*i;
fatt:=aus;
end;
procedure Leggi;
var
f : text;
i : integer;
begin
pprow:=-1;
if fsearch('coach.dat','.')='' then Errore(1);
assign(f,'coach.dat');
reset(f);
readln(f,nscontri);
readln(f,robtest);
readln(f,robscrew);
nvalori:=0;
for i:=0 to maxval do
  if not eoln(f) then
    begin
      read(f,valori[i,0]);
      nvalori:=i+1;
    end
  else break;
for i:=0 to nvalori-1 do valori[i,1]:=0;
close(f);
if nvalori=0 then Errore(4);
end;
procedure Preprocessore(numero : integer);
var
f1,f2 : text;
line : string[255];
subline : string[10];
i : integer;
begin
i:=1;
str(numero,subline);
if fsearch(robtest,'.')='' then Errore(1);
assign(f1,robtest);
assign(f2,'coach.tmp');
reset(f1);
rewrite(f2);
while not eof(f1) do
  begin
    readln(f1,line);
    if pprow=-1 then
      begin
        ppcol:=pos(ppstr,line);
        if ppcol>0 then pprow:=i;
        pplen:=length(ppstr);
      end;      
    if pprow=i then
line:=copy(line,1,ppcol-1)+subline+copy(line,ppcol+pplen,length(line)-(ppcol+pplen)+1);
    writeln(f2,line);
    inc(i);
  end;
close(f1);
erase(f1);
close(f2);
rename(f2,robtest);
pplen:=length(subline);
if pprow=-1 then Errore(2);
end;
function Risultato : boolean;
var
f : text;
line : string[30];
begin
assign(f,'results.prb');
reset(f);
readln(f);
readln(f,line);
if pos('Number 1',line)>0 then risultato:=true
else risultato:=false;
close(f);
erase(f);
end;
procedure Spettro;
var
f : text;
ranval : integer;
sxval,dxval : integer;
i,magg : integer;
begin
for i:=0 to nscontri-1 do
  begin
    if i mod 30=0 then randomize;
    ranval:=random(nvalori);
    if ranval-2>=0 then sxval:=pred(ranval) else sxval:=ranval;
    if ranval+2<=nvalori-1 then dxval:=succ(ranval) else
dxval:=ranval;
    if valori[sxval,1]>=valori[dxval,1] then
      if valori[sxval,1]>valori[ranval,1] then dec(ranval,2)
      else
    else
      if valori[dxval,1]>valori[ranval,1] then inc(ranval,2);
    Preprocessore(valori[ranval,0]);
    exec('.\p-robots.exe',robtest+' '+robscrew+' /m-1');
    if doserror>0 then Errore(3);
    if Risultato then inc(valori[ranval,1],2)
    else if valori[ranval,1]>-10 then dec(valori[ranval,1]);
  end;
assign(f,'coach.dat');
append(f);
writeln(f);
writeln(f,'Punti vittoria');
for i:=0 to nvalori-1 do
  write(f,valori[i,1],' ');
close(f);
magg:=0;
for i:=1 to nvalori-1 do
  if valori[i,1]>valori[magg,1] then magg:=i;
Preprocessore(valori[magg,0]);
end;
procedure Test;
var
f : text;
i,j : integer;
p : double;
begin
for i:=0 to 1 do
  begin
    Preprocessore(valori[i,0]);
    for j:=1 to nscontri div 2 do
    begin
      exec('.\p-robots.exe',robtest+' '+robscrew+' /m-1');
      if doserror>0 then Errore(3);
      if Risultato then inc(valori[i,1]);    
    end;
  end;
assign(f,'coach.dat');
append(f);
writeln(f);
writeln(f,'Vittorie');
writeln(f,valori[0,1],' ',valori[1,1]);
if valori[1,1]>valori[0,1] then
  begin
    valori[2,0]:=valori[0,0];
    valori[2,1]:=valori[0,1];
    valori[0,0]:=valori[1,0];
    valori[0,1]:=valori[1,1];
    valori[1,0]:=valori[2,0];
    valori[1,1]:=valori[2,1];
  end;
p:=Fatt(valori[0,1]+1,valori[0,1]+valori[1,1])/Fatt(1,valori[1,1])*
  Pot(0.5,valori[0,1]+valori[1,1]);
writeln(f,'Probabilita'' (ipotesi nulla)=',round(p*100.0),'%');
if p<0.05 then writeln(f,'Il valore ',valori[0,0],' e''
significativamente migliore di ',valori[1,0])
else writeln(f,'I due valori si equivalgono');
close(f);
Preprocessore(valori[0,0]);
end;
begin
Leggi;
if nvalori=2 then Test
else Spettro;
end.

Correzione del sorgente di Coach, nella procedura Spettro sostituire
  if i mod 30=0 then randomize;
con
  if i mod nvalori=0 then randomize;

Ehila mago,
ma perchč ti rompi tanto la testa con simulazioni di questo genere?
stai cercando delle soluzioni alternative al suicidio???
Sei fortunato...io posso aiutarti...
assapora l'amaro del mondo compresso e scatena i tuoi fusionNeuroni
assieme ai nostri...ti assicuro morte certa ;)
bye bye duido
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

bye bye duido
Dio sia con te