def test_accepts_equal(): """ Tests if the hill climbing method accepts a solution that results in the same objective value. """ hill_climbing = HillClimbing() assert_(hill_climbing.accept(rnd.RandomState(), Zero(), Zero(), Zero()))
def test_does_not_raise(): """ This set of parameters, on the other hand, should work correctly. """ alns = get_alns_instance([lambda state, rnd: One()], [lambda state, rnd: One()]) alns.iterate(Zero(), [1, 1, 1, 1], .5, HillClimbing(), 100) # 0 and 1 are both acceptable decay parameters (since v1.2.0). alns.iterate(Zero(), [1, 1, 1, 1], 0., HillClimbing(), 100) alns.iterate(Zero(), [1, 1, 1, 1], 1., HillClimbing(), 100)
def test_raises_non_positive_weights(): """ The passed-in weights should all be strictly positive. """ alns = get_alns_instance([lambda state, rnd: None], [lambda state, rnd: None]) with assert_raises(ValueError): alns.iterate(One(), [1, 1, 0, 1], .5, HillClimbing()) with assert_raises(ValueError): alns.iterate(One(), [1, 1, -5, 1], .5, HillClimbing())
def test_raises_non_positive_iterations(): """ The number of iterations should be strictly positive. """ alns = get_alns_instance([lambda state, rnd: None], [lambda state, rnd: None]) with assert_raises(ValueError): alns.iterate(One(), [1, 1, 1, 1], .5, HillClimbing(), 0) with assert_raises(ValueError): alns.iterate(One(), [1, 1, 1, 1], .5, HillClimbing(), -1)
def test_raises_boundary_operator_decay(): """ The boundary cases, zero and one, should both raise. """ alns = get_alns_instance([lambda state, rnd: None], [lambda state, rnd: None]) with assert_raises(ValueError): alns.iterate(One(), [1, 1, 1, 1], 0, HillClimbing()) with assert_raises(ValueError): alns.iterate(One(), [1, 1, 1, 1], 1, HillClimbing())
def test_raises_negative_iterations(): """ The number of iterations should be non-negative, as zero is allowed. """ alns = get_alns_instance([lambda state, rnd: None], [lambda state, rnd: None]) initial_solution = One() # A negative iteration count is not understood, for obvious reasons. with assert_raises(ValueError): alns.iterate(initial_solution, [1, 1, 1, 1], .5, HillClimbing(), -1) # But zero should just return the initial solution. result = alns.iterate(initial_solution, [1, 1, 1, 1], .5, HillClimbing(), 0) assert_(result.best_state is initial_solution)
def test_raises_missing_repair_operator(): """ Tests if the algorithm raises when no repair operators have been set. """ alns = get_alns_instance(destroy_operators=[lambda state, rnd: None]) with assert_raises(ValueError): alns.iterate(One(), [1, 1, 1, 1], 0.95, HillClimbing())
def test_does_not_raise(): """ This set of parameters, on the other hand, should work correctly. """ alns = get_alns_instance([lambda state, rnd: One()], [lambda state, rnd: One()]) alns.iterate(Zero(), [1, 1, 1, 1], .5, HillClimbing(), 100)
def test_raises_insufficient_weights(): """ We need (at least) four weights to be passed-in, one for each updating scenario. """ alns = get_alns_instance([lambda state, rnd: None], [lambda state, rnd: None]) with assert_raises(ValueError): alns.iterate(One(), [1, 1, 1], .5, HillClimbing())
def test_raises_explosive_operator_decay(): """ Tests if the algorithm raises when an explosive operator decay parameter is passed. """ alns = get_alns_instance([lambda state, rnd: None], [lambda state, rnd: None]) with assert_raises(ValueError): alns.iterate(One(), [1, 1, 1, 1], 1.2, HillClimbing())
def test_trivial_example(): """ This tests the ALNS algorithm on a trivial example, where the initial solution is zero, and any other operator returns one. """ alns = get_alns_instance([lambda state, rnd: Zero()], [lambda state, rnd: Zero()]) result = alns.iterate(One(), [1, 1, 1, 1], .5, HillClimbing(), 100) assert_equal(result.best_state.objective(), 0)
def test_on_best_is_called(): """ Tests if the callback is invoked when a new global best is found. """ alns = get_alns_instance([lambda state, rnd: Zero()], [lambda state, rnd: Zero()]) # Called when a new global best is found. In this case, that happens once: # in the only iteration below. It returns a state with value 10, which # should then also be returned by the entire algorithm. alns.on_best(lambda *args: ValueState(10)) result = alns.iterate(One(), [1, 1, 1, 1], .5, HillClimbing(), 1) assert_equal(result.best_state.objective(), 10)
def test_accepts_better(): """ Tests if the hill climbing method accepts a better solution. """ hill_climbing = HillClimbing() assert_(hill_climbing.accept(rnd.RandomState(), One(), One(), Zero()))
def test_rejects_worse(): """ Tests if the hill climbing method accepts a worse solution. """ hill_climbing = HillClimbing() assert_(not hill_climbing.accept(rnd.RandomState(), Zero(), Zero(), One()))