.. _tabusearch-py: ############# tabusearch.py ############# SIMO metaheuristic TABUSEARCH algorithm:: >>> epsilon = 0.00001 **************************** class TabuSearch(Optimizer): **************************** TabuSearch heuristic optimization algorithm implementation. Initialize with keyword arguments eg. maxiterations=1000, entrytenure=10, exittenure=20 def __init__(self, logger, logname, optlogger, taskdef, simdbin, opdbin, simdbout, opdbout, \*\*keywords): ========================================================================================================== Initialize optimizer:: >>> from simo.optimization.tabusearch import TabuSearch >>> execfile('optimization/test/mocks4optimizer.py') >>> chart_path = 'optimization/test' >>> ts = TabuSearch(logger, logname, taskdef, simdbin, simdbout, ... False, False, False, chart_path, True, 'test', True, ... keyword1='test-kw') Called Logger.log_message( 'optimization-test', 'ERROR', 'Parameter "repeats" missing!') Called Logger.log_message( 'optimization-test', 'ERROR', 'Parameter "initial_solutions" missing!') Called Logger.log_message( 'optimization-test', 'ERROR', 'Parameter "maximum_iterations" missing!') Called Logger.log_message( 'optimization-test', 'ERROR', 'Parameter "entrytenure" missing!') Called Logger.log_message( 'optimization-test', 'ERROR', 'Parameter "exittenure" missing!') >>> ts = TabuSearch(logger, logname, taskdef, simdbin, simdbout, False, ... False, False, chart_path, True, 'test', True, ... repeats=2, initial_solutions=100, ... maximum_iterations=5, entrytenure=2, exittenure=3) def optimize(self): =================== Run tabu search optimization algorithm def _run_TS(self): ================== Run TS algorithm for a single iteration/repeat Parameters:: iteration -- current simulated iteration as int :: >>> ts._stat_logger = ologger # replace stat logger with a mock >>> ts._data = omatrix2 # replace data handler with another mock >>> ts._analyze_data() # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE Called OMatrix.analyze_data( , >) True >>> ts.set_data(0) # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE Called OMatrix.construct_data(0) True >>> ts._run_TS() # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE Called OMatrix.solution_feasibility(array([...])) Called OMatrix.solution_utility(array([...])) Called OMatrix.compare_utilities(...) Called OLogger.add_round(array(...]), 1.0, 1.0) ... def _update_tabu_set(self, unit, b_from, b_to): =============================================== Add a new taboo move to the set and decrease the tenure counter for existing taboos Parameters :: unit -- unit indice as int b_from -- from branch indice as int b_to -- to branch indice as int :: >>> ts._exit_map[...] = False >>> ts._entry_map[...] = False >>> ts._exit_timer[...] = 0 >>> ts._entry_timer[...] = 0 >>> ts._exit_tenure = 4 >>> ts._entry_tenure = 2 >>> ts._update_tabu_set(0, 0, 1) >>> ts._update_tabu_set(1, 2, 3) >>> ts._update_tabu_set(2, 2, 3) >>> ts._update_tabu_set(3, 0, 2) >>> ts._exit_map array([[ True, False, False, False, False, False], [False, False, True, False, False, False], [False, False, True, False, False, False], [ True, False, False, False, False, False], [False, False, False, False, False, False]], dtype=bool) >>> ts._entry_map array([[False, False, False, False, False, False], [False, False, False, False, False, False], [False, False, False, True, False, False], [False, False, True, False, False, False], [False, False, False, False, False, False]], dtype=bool) >>> ts._exit_timer array([[1, 0, 0, 0, 0, 0], [0, 0, 2, 0, 0, 0], [0, 0, 3, 0, 0, 0], [4, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]) >>> ts._entry_timer array([[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 2, 0, 0, 0], [0, 0, 0, 0, 0, 0]]) def _is_move_tabu(self, unit, b_from, b_to): ============================================ True if taboo, False if not Parameters :: unit -- unit indice as int b_from -- from branch indice as int b_to -- to branch indice as int :: >>> ts._is_move_tabu(0, 0, 1) True >>> ts._is_move_tabu(1, 0, 1) False def _can_exit(self, unit, b_from): ================================== True if exit map value at (unit, frombranch) is False Parameters :: unit -- unit indice as int b_from -- from branch indice as int :: >>> ts._can_exit(0,0) False >>> ts._can_exit(0,1) True >>> ts._can_exit(2,2) False def _get_neighbourhood(self, unit, b_from, num_b): ================================================== Get non-taboo neighbours of (unit, b_from) Parameters :: unit -- unit indice as int b_from -- from branch indice as int num_b -- number of branches as int :: >>> ts._get_neighbourhood(1, 0) array([False, True, True, True, True, True], dtype=bool)