Come sviluppare un algoritmo per il brute-forcing / backtracking?

0

Come programmatore principiante, non so come pensare concettualmente al bruto-forzante. La mia mente non può davvero capire come scrivere codice che proverà ogni possibilità.

Ho un problema che voglio risolvere. Ecco uno snippet di codice (ci sono altre funzioni, ma non c'è motivo di includerle qui, fanno solo un lavoro in background):

main():
    step_segment = []           # contains current segment
        STATS = [250,0,0,0,13,0]        # contains 1 step (current step stats)
        # STATS = [step_id, danger, danger_limit, rnd, b_loop, enc]

    # Temporary Interface
    choice = None
    while choice != "0":
        print \
        "\n1 - Benchmark Run"
        choice = raw_input("Choice: ")
        if choice == "0":
            print "\nGoodbye."

        elif choice == "1":
            while (len(step_segment)) < 128:
                step_segment, STATS = take_step(step_segment, STATS)
                if STATS[5] == "B":
                    "Dont know what to do here. Try every possibility!?"

L'obiettivo: voglio produrre un elenco di ogni "percorso" possibile attraverso un segmento, insieme al tempo necessario.

Descrizione:

  1. Farò un passo nel percorso (C'è solo una direzione: avanti). Ogni volta che faccio un passo, le mie statistiche sono aggiornate. Questo fa un passo e aggiorna le statistiche: step_segment, STATS = take_step(step_segment, STATS)

  2. Viene tenuto un elenco di passaggi presi, insieme alle statistiche %codice%. Questo è così che posso 'annullare' una quantità arbitraria di passi, se voglio Per annullare un passo chiama la funzione: step_segment

  3. Riesco a vedere quanto tempo ha impiegato il mio percorso corrente: step_segment, STATS = undo_step(step_segment, STATS) .

  4. Ad un certo punto, entrerò in una battaglia. Vado in una battaglia quando time = frames(step_segment)

  5. Quando c'è una battaglia, ho semplicemente due scelte: i. Combatti battaglia, o ii. scappa.

  6. Se voglio combattere, faccio: STATS[5] == "B" . Questo riporta anche che ho scelto di combattere, insieme con le statistiche, in step_segment = do_fight(step_segment, STATS) . (Quindi posso annullare, se voglio).

  7. Se voglio eseguire Away, faccio: step_segment .

Qualcuno mi può consigliare, come posso codificare un forcer bruto per questo problema?

Specificamente , vorrei sapere come posso dire al computer di provare ogni possibilità; Semplicemente non riesco a pensare a come ... >. < '

Voglio vedere ogni possibile combinazione di Run & Combatti (le uniche due scelte, quando raggiungo una battaglia).

Ci sono solo circa 200 possibilità. Ho solo bisogno di fare 128 passi, quindi ci sono un numero finito di possibilità, quindi: step_segment = run_away(step_segment,STATS) .

Non so come realizzare una cosa del genere in Python. La mia intera ragione per imparare a programmare è risolvere questo problema ..

Penso di poter spiegare la soluzione in inglese, come ho fatto sopra, ma non so come codificarla. Sarei molto riconoscente se qualcuno potesse consigliarmi su questo !!

Grazie.

    
posta BBedit 11.03.2014 - 12:18
fonte

1 risposta

4

Ci sono più "possibilità" di quanto tu possa pensare, ti spiegherò perché:

Come ho compreso la tua spiegazione del tuo scenario, hai effettivamente una struttura ad albero di passaggi. Si inizia alla "radice" (il primo passo) e poi si sale.

In ogni punto in cui incontri una battaglia e quindi puoi scegliere, crei un ramo di possibilità: Il tuo percorso si divide in un percorso "combatti" e un percorso "non combatti", sul quale continuerai il tuo viaggio.

Questi rami si dirameranno di nuovo ad ogni punto di battaglia. Quando raggiungi la tua "fine", tornerai indietro alla decisione precedente e prenderai l'azione opposta.

Dal punto di vista dei programmatori, questa sarebbe la situazione ideale per un algoritmo ricorsivo, poiché sai che hai una quantità limitata di passaggi.

Le parole chiave da cercare sono "attraversamento ad albero ricorsivo". Non posso aiutarti con codice specifico, dato che non ho esperienza con Python.

    
risposta data 11.03.2014 - 15:01
fonte

Leggi altre domande sui tag