func ValueIteration(qt *discrete.QTable, mdp discrete.MDP, epsilon float64) (numIterations int) { //fmt.Fprintf(os.Stderr, "+ValueIteration\n") //fmt.Println(mdp.GetGamma()) //defer fmt.Fprintf(os.Stderr, "-ValueIteration\n") var error float64 for { numIterations += 1 //fmt.Printf("iteration %d\n", numIterations) error = 0 for s := range mdp.S64() { for a := range mdp.A64() { saError := BackupStateAction(qt, mdp, s, a) error = math.Fmax(error, saError) } } //fmt.Printf("QT\n%v\n", qt) //fmt.Fprintf(os.Stderr, "error %f\n%v\n", error, qt) if error < epsilon { return } } return }