Example #1
0
// flipRecons permorms the flip algorithm on list of nodes an events.
func flipRecons(r *events.Recons, nodes, evs []int) float64 {
	best := r.Cost()
	for doAgain := true; doAgain; {
		doAgain = false
		shuffle(nodes)
		for _, n := range nodes {
			prev := r.Rec[n].Flag
			shuffle(evs)
			for _, e := range evs {
				if e == prev {
					continue
				}
				r.Rec[n].Flag = e
				if r.DownPass(n) < best {
					break
				}
			}
			if r.Cost() < best {
				best = r.Cost()
				doAgain = true
				break
			}
			r.Rec[n].Flag = prev
			r.DownPass(n)
		}
	}
	return r.Cost()
}