Newsgroup: it.hobby.scacchi
Titolo: Rapidità di calcolo di un programma

Ciao a tutti,
mi rivolgo agli scacchisti/informatici (peccato che Montaruli è in
vacanza!). 
Io sto sviluppando, in Visual Basic 6.0., un programma di scacchi; esso è
già in grado di giocare delle partite, l'algoritmo che calcola le varianti
e sceglie la mossa migliore funziona. Certo, le posizioni vengono valutate
ancora in modo un po' rozzo, ma a questo penserò in un secondo momento.
Il problema che adesso voglio risolvere è quello della rapidità di
calcolo. Al momento il programma è indubbiamente lento, impiega 2-3 minuti
per calcolare le varianti con una profondità che non è certo sufficiente a
giocare delle buone mosse. Per giocare delle buone mosse, probabilmente
impiegherebbe molto più tempo, mentre ai migliori programmi di scacchi
occorrono pochi secondi.
So che molti programmi di scacchi vengono scritti in C; pensate che
'traducendo' il mio programma dal Visual Basic al C la velocità
d'esecuzione migliorerebbe molto? Ed esistono linguaggi ancora più veloci
del C (imparare nuovi linguaggi non mi farebbe male!)?
So che la velocità di esecuzione si può migliorare anche riducendo in modo
opportuno il numero di varianti da calcolare; il mio programma in effetti
sfoltisce il numero di varianti, sicuramente potrebbe farlo meglio ma
anche questo è un problema che mi porrò in seguito; per ora voglio solo
sapere se, cambiando linguaggio, posso migliorare in modo significativo la
velocità di esecuzione.
Grazie!
       Giulio Simeone
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 del C (imparare nuovi linguaggi non mi farebbe male!)?
Senza dubbio; il VB è piuttosto lento.
Più veloce di tutti è l'assembler. Puoi anche scrivere delle parti critiche
(come il generatore di mosse) in questo linguaggio e richiamarle dal tuo
linguaggio principale.
Alex

 del C (imparare nuovi linguaggi non mi farebbe male!)?
Direi che se vuoi avere prestazioni appena appena decenti *DEVI*
passare a linguaggi più veloci tipo C/C++... anzi già che ci sei
puoi guadagnare molto in termini di tempo e fatica tenendoti il
tuo programma VB come interfaccia ma mettendo le routine critiche
del motore di scacchi che hai scritto in una DLL scritta in C o
in Assembler (non so se VB6 ha l'assembler inline ma credo di no).
Direi che ti puoi aspettare un miglioramento nella velocità di
calcolo di alcuni ordini di grandezza :-)
Per l'assembler ti puoi scaricare NASM dalla rete, è ottimo.
Per il C/C++ hai solo l'imbarazzo della scelta :-)

 passare a linguaggi più veloci tipo C/C++...
[SNIP]
Intervengo anche se sono un po' di parte :-)
Diciamo che, per quanto sia certamente consigliabile passare a linguaggi di
piu' basso livello per essere "competitivi", le prestazioni "appena appena
decenti" e forse anche un pizzico in piu' si ottengono tranquillamente con
VB6.
A questo indirizzo
http://digilander.iol.it/larsenvb
trovi il mio programma, ahime' un po' trascurato nell'ultimo anno, scritto
interamente in VB6 e completo di  sorgenti
Il primi punti da considerare per avere una velocita' accettabile in VB
sono:
- Utilizzare la compilazione nativa, e non quella PCode
- Attivare le ottimizzazioni avanzate, rimuovendo (dopo opportuno debug per
verificare che il codice sia a posto) il controllo di overflow sugli interi,
ma soprattutto il controllo sugli indici delle matrici
Naturalmente per misurare la velocita' fai sempre riferimento al compilato,
e non al debugger integrato, che si comporta peggio di un eseguibile PCode
senza ottimizzazioni
Nei tipici applicativi windows che si scrivono in VB le ottimizzazioni
spesso non si sentono molto, ma per un programma di scacchi sono
fondamentali, in particolare l'ultimo punto e' basilare per poter avere
qualcosa di sensato, dato che per lo piu' e' tutto uno scorrere di array
Poi naturalmente dipende anche dalla bonta' dell'algoritmo e delle strutture
dati; queste ultime (parlo della rappresentazione della scacchiera, della
mossa ecc..) per la mia esperienza personale trovano piu' giovamento
dall'essere compatte in termini di dimensioni, piuttosto che dall'usare tipi
di dati "veloci" (=interi a 32 bit) ma piu' ingombranti
Considera oltretutto che LarsenVB (il mio programma) riesce a essere
accettabile pur essendo strutturato in maniera molto canonica, la ricerca e'
un semplice alfa-beta con quiescienza e come uniche funzioni aggiuntive usa
history heuristic e killer moves (scusate il gergo, ma altrimenti e'
difficile dirlo in 2 parole) mentre mancano alcune funzioni altrettanto
comuni nei programmi e estremamente vantaggiose in termini di velocita quali
ad esempio le tabelle hash.
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 Ciao



Grazie per la risposta, avevo già pensato a mantenere l'interfaccia
grafica in Visual Basic scrivendo la procedura che calcola e valuta le
varianti in C; solo che avevo in mente un modo un po' contorto per fare
questo, i due linguaggi avrebbero dovuto 'collaborare' tramite dei files.
Invece non sapevo della possibilità di inserire .DLL, ora mi documenterò.
Per quanto riguarda l'Assembly, credo che per impararlo occorra un po' di
tempo: pensi che valga la pena di perderci un mese? Ovviamente non solo
nell'ottica di scrivere un programma di scacchi, nell'ottica di trovare
lavoro!
Ciao,
     Giulio 


Grazie Alex per la risposta, ma non so se avrň la pazienza di studiarmi
l'Assembler, probabilmente mi limiterň al C!
Ciao,
    Giulio


 lavoro!
In questo caso "ni" dipende dal lavoro, al 99.99% ne il C ne l'assembler
oggi sono utili per trovare lavoro, semmai nel campo dell'elettronica dove
si usano microprocessori, pero' difficilmente si usa l'assembler x86. Il
Visual C++ invece sarebbe utile, ma meno di quello che si pensi, oggi si
utilizza Visual basic e ASP, Zio bill aveva dichiarato di voler chiudere il
team di sviluppo del Visual C++.  Oggi per trovare lavoro servono i
linguaggi visivi, anche delphi ovviamente ma Assembler e C (non ++) non
vengono presi in considerazione. Ed anche la parte algoritmica non viene
considerata, conosco molti "programmatori" che di fronte al piu' semplice
degli algoritmi, non sanno che pesci prendere, non saprebbero scriversi da
loro una routine di bubble sort, non sanno calcolare la complessita', per
loro il tempo di elaborazione non esiste, ma neanche ne hanno bisogno, il
"cut" & "paste" impera, sicuramente qualcuno in giro per il mondo avra' gia'
scritto quello che serve basta trovarlo e ricopiarlo.
Io part time ancora lavoro in assembler, ma manutengo software scritti da me
una dozzina di anni fa, difficilmente oggi troverei lavoro, anche se ho
smesso di programmare seriamente da almeno 10 anni, supergiu' quando o
smesso di giocare a scacchi.
Giovanni

 ad esempio le tabelle hash.
e perche' mancano??
non e' che per caso in Visual basic ci sono limiti sulla dimensione degli
array ?
Giovanni

 array ?
No affatto, solo pigrizia del programmatore che non le ha mai scritte, cosi'
come le null moves e altre amenita' del genere ;-)
La limitazione in questo senso direi che e' solo la mancanza di un tipo di
dato intero a 64bit (per generare la hash key), ma questo era vero anche per
i programmi C di anni fa e si puo' sopperire tranquillamente con 2 interi a
32 bit senza overhead particolari
Al momento, tempo permettendo, penso le aggiungero direttamente nella
prossima versione scritta in .NET
