I miei errori


Questa pagina ha una gerarchia - Pagina madre:Programmazione

Home Forum Programmazione I miei errori

Questo argomento contiene 35 risposte, ha 8 partecipanti, ed è stato aggiornato da Lissandrello Luca Lissandrello Luca 1 anno, 2 mesi fa.

Stai vedendo 15 articoli - dal 1 a 15 (di 36 totali)
  • Autore
    Articoli
  • #5293
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    Dato che a scacchi si impara soprattutto dagli errori, provo ad aprire questo thread; qui invito tutti a esporre i propri errori di programmazione che nel corso dello sviluppo del proprio engine abbiamo sicuramente fatto.

    Bye!

    P.s. Sono convinto che per numero di post in questo thread non mi batterà nessuno. X-D

    LL

    #5294

    .
    Dai, comicio io!
    Finora l’errore più spettacolare l’ho fatto durante la stesura della versione 101 di ProChess. C’è un momento nella scrittura di un chess engine quando ormai si è finito il generatore di mosse in cui si passa a gestire l’albero delle varianti. E’ la parte più entusiasmante, la propria creatura comincia a pensare, a giocare, a vivere di vita propria. Ma la fretta gioca brutti scherzi. Scrivo la quiescenza e lancio una posizione di test per controllare che tutto funzioni. ProChess si addormenta. CPU al 100% tutto bloccato non so che fare. Dopo un minuto la ricerca termina e compare il risultato. Corretto. Milioni di nodi analizzati per giungere alla conclusione che quell’alfiere non va catturato.
    Quando ci sono questi sintomi di solito chiudo, vado a letto e la notte successiva mi accorgo di aver scritto del codice abominevole. Questa volta tutto sembrava perfetto. Ho seguito il codice istruzione per istruzione con il debugger, provato con altre posizioni di test, ricontrollato tutto il codice già scritto, niente. Due giorni bloccato da un baco misterioso finché, dopo otto ore di lezione al Politecnico, l’orribile idea si è fatta strada nella mia mente: maggiore-o-uguale.
    Chi di voi ha passato un po’ di tempo a debuggare un algoritmo alfa-beta ricorsivo sa cosa intendo. Se il sottoalbero restituisce una valutazione troppo bella per essere vera, si interrompe l’analisi. In altre parole si taglia l’albero se la valutazione è maggiore-o-uguale a beta. Maggiore-o-uguale appunto. O-uguale maledizione! La mia quiescenza passava i minuti a confrontare varianti con la stessa valutazione perché avevo messo solo maggiore…

    #5354

    Dato che a scacchi si impara soprattutto dagli errori, provo ad aprire questo thread; qui invito tutti a esporre i propri errori di programmazione che nel corso dello sviluppo del proprio engine abbiamo sicuramente fatto.

    Uh, quanti ne ho fatti…
    Quella del >=beta che citava Edo ce l’ho, e ho anche quella di dimenticarmi di aggiornare alpha tra una iterazione della IID e l’altra dopo aver trovato la bestmove;
    Parentesi graffe messe nel posto sbagliato (per cui rami else non includevano parti di codice, che venivano eseguite sempre);
    Una volta avevo sbagliato la bitmask che uso per controllare l’attacco alle case dell’arrocco lungo del bianco: non tutte, solo quelle del bianco: per qualche motivo sono andato avanti mesi senza sospettare niente, finche’ in un torneo test Chexa perde una parita per mossa irregolare: aveva arroccato attraverso lo scacco…;
    Avevo implementato le ri-ricerche in caso di failhigh di una ricerca a finestra nulla in caso di riduzione: solo che il risultato della ricerca non veniva salvato, quindi perdeva solo tempo senza beneficiare del risultato del lavoro;

    Per ora puo’ bastare 🙂

    bye^2, mr

    #5356
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    ‘Mai rilasciare una versione non testata a ridosso di un evento’. Questo è un concetto base che applico sul lavoro ma non applico con il mio Neurone. E’ successo proprio con l’IGWT; la versione di Neurone era la XX dove ho implementato un bel po’ di modifiche. Non mi ricordavo nemmeno di aver fatto la modifica a quello che io chiamo occhio di falco (un’see molto poco standard). La modifica era talmente banale che non l’ho nè documentata, e nemmeno testata.
    In pratica l’odf non rilevava bene gli attacchi in batteria su una singola casa. Ad esempio due torri sulla stessa linea che attaccano una torre avversaria difesa solo da un pedone non veniva rilevato come un +100 ma come uno 0, dato che la torre successiva, sulla stessa colonna o riga incontrava prima un pezzo del suo stesso colore e non il pedone avversario, e quindi usciva dalla routine.
    Vabbè, mi sono detto, butto dentro il codice per questa casistica e sono a posto. Fatto per tutte le direzioni: nord, sud, destra e sinistra. Verificato? Macchè, tanto era una stupidaggine, funzionerà sicuramente.
    Vengo al dunque: nella seguente posizione

    all’IGWT Neuro risponde tranquillamente con: d3
    d3 ???
    Naaaa! Il codice lo avevo inserito correttamente, ma nello slittamento verso destra, al posto di inserire il codice tra la chiamata e la verifica dei pezzi presenti sulla stessa linea, avevo sovrascritto il codice precedente!
    La conseguenza è stata che non avendo più il codice per il rilevamento dei pezzi nella riga, per Neurone la sua donna e anche l’altra torre difendono tranquillamente la torre in h1!
    Mi chiedo come abbia fatto ad essere promosso nel gruppo D! O.o

    Bye!

    LL

    #5493
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    Ecco, ce ne ho un’altro 🙂 Insieme alla correzione dell’errore cui sopra ho ripulito un po’ il codice con sostituzioni di select case in luogo di if, rimozione di parametri di funzioni non necessari ecc…
    Risultato? La XXI in working se le prende dalla XX rilasciata…argh!
    Non mi entra in testa il fatto che fatta una modifica, anche banale —> va testata!
    Adesso mi tocca tornare indietro e capire qual’è stata la modifica che ha fatto incriccare tutto (e ripartire da lì, pezzo x pezzo… uffa).

    Bye!

    LL

    #5784

    Un errore clamoroso che mi sono portato avanti per mesi, e che qualcuno potrebbe avere nel proprio codice: se state usando Nullmove e TT verificate che la Nullmove venga giocata e ritirata ( Make / Unmake ). Quando si gioca una mossa null, viene cambiato il valore hash della posizione che se non viene ripristinato porta ad errori nella TT.

    #5787
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    Approfitto per un breve spot pubblicitario :-):

    Dopo il torneo di Omegna sarà disponibile una nuova sezione focalizzata al testing dei motori. In pratica man mano che verranno rilasciate nuove release (o su richiesta), questi, verranno testati in gauntlet contro gli altri motori italiani.
    La cadenza sarà sempre di 15′ e sarà possibile seguire in diretta le partite ogni venerdì dalle 20:00.
    In seguito ulteriori dettagli e link.

    Bye!

    LL

    #5809

    Dopo il torneo di Omegna sarà disponibile una nuova sezione focalizzata al testing dei motori. In pratica man mano che verranno rilasciate nuove release (o su richiesta), questi, verranno testati in gauntlet contro gli altri motori italiani.<br>
    La cadenza sarà sempre di 15′ e sarà possibile seguire in diretta le partite ogni venerdì dalle 20:00.<br>

    Wow, molto professional 🙂
    Avevi gia’ accennato a qualcosa sul testing, ma mi aspettavo qualcosa su scala piu’ ristretta…

    bye^2, mr

    #5824

    molto, molto good. mi sa che ne approffitterò subito appena rilascio ProChess 103 “hypercube”… 🙂

    #7141
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    Per la serie “Ho paura di dare una ripulita al codice perché non so quel che troverò”…

    Il seguente codice dovrebbe verificare se esiste un pezzo NERO in una determinata casa;
    Se la variabile MyPezzoInCasaDestinazione = 0 allora è una casa vuota, se è < 0 c’è un pezzo nero, se maggiore c’è un pezzo bianco.

    Era…

    If MyPezzoInCasaDestinazione > 0 Then

    End If

    Solo adesso corretto in…

    If MyPezzoInCasaDestinazione < 0 Then

    End If

    Immaginatevi cosa ha causato nel frattempo 🙂
    Certe volte mi sento un genio 😀

    Bye!

    LL

    #7142
    stegemma
    stegemma
    Moderatore

    Sì ma perché devi distinguere tra pezzi bianchi e neri? Io di solito mi chiedo se è un pezzo del colore che ha la mossa oppure dell’altro colore.

    #7149
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    Mi serve perchè ho una gestione della generazione delle mosse separata (una per i bianchi e una per i neri) a livello di funzioni e lì va a verificare se c’è stata una cattura o no. In caso di spostamento semplice il materiale non occorre ricalcolarlo nell’iterazione successiva.

    Bye!

    LL

    #7153
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    Ah, ho capito male il tuo post. No, in pratica per quello ho un’altra variabile “ColoreAllaRoot” e mentre il ColoreAllaRoot potrebbe variare ad ogni nuova partita oppure ad ogni cambio colore da gui, il MyPezzoInCasaDestinazione varia ad ogni iterazione (depth).

    Bye!

    LL

    #7162

    Alessandro
    Membro

    L’errore più grande in assoluto l’ho fatto usando il “copia e incolla” nella funzione di valutazione. Faceva sì che mentre il bianco giocasse normalmente, il nero facesse di tutto per non promuovere i suoi pedoni.
    L’errore è che non ho smesso di usare il copia-e-incolla… 😉

    #7163
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    L’errore è che non ho smesso di usare il copia-e-incolla…

    🙂

    L’errore più grande in assoluto l’ho fatto usando il “copia e incolla” nella funzione di valutazione. Faceva sì che mentre il bianco giocasse normalmente, il nero facesse di tutto per non promuovere i suoi pedoni.

    Mi ricorda molto un bug ancora più estremo: In pratica, ad una mossa dal matto un programma si rifiutava continuamente di effettuare tale mossa scegliendone un’altra e dando sempre modo all’avversario di continuare la partita. 😀

    Ah, poi ne ho visto un’altro nell’ultimo cct dove un programma della forza di un maestro non riusciva a dar matto con re e torre contro re. 😀

    Questo mi rincuora, non sono solo io a creare bug 🙂

    LL

Stai vedendo 15 articoli - dal 1 a 15 (di 36 totali)

Devi essere loggato per rispondere a questa discussione.

© 2017 G 6 Tutti i diritti riservati - Buon divertimento!

By continuing to use the site, you agree to the use of cookies. more information

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi