현재 해(solution)에서 더 나은 해를 찾기 위해 주변을 탐색하는 방식
- 단순히 가장 좋은 해만 따라가는 '탐욕적(greedy)' 알고리즘의 단점을 보완하기 위해 '금기 목록(tabu list)'이라는 개념을 도입한 것이 특징

일반적으로 FIFO (first in first out) 구조로 매 반복마다 갱신됨
가장 기본적인 구현 방식으로, 금기 목록(Tabu List)이 여기에 해당함
탐색의 효율성을 높이기 위해 더 복잡한 전략을 사용하는 고급 구현 방식
목적: 탐색이 너무 한 곳에만 치우치는 것을 방지하고, 새로운 탐색 영역으로 확장하여 전역 최적해를 찾을 가능성을 높임
구현
매개변수 튜닝: 타부 리스트의 크기(Tabu Tenure)와 같은 매개변수를 문제에 맞게 조절해야 함. 이 값이 너무 작으면 지역 최적해에 빠지기 쉽고, 너무 크면 비효율적인 탐색이 될 수 있음.
복잡성: 리디 알고리즘에 비해 구현이 복잡하고, 메모리 구조(단기/장기 기억)와 같은 추가적인 개념을 고려해야 함
import random
from collections import deque
def objective(solution):
# 목적 함수: 합이 작을수록 좋음
return sum(solution)
def generate_neighbors(solution):
# 이웃 해 생성: 랜덤한 위치 2개를 바꾼다
neighbors = []
for _ in range(10):
new_solution = solution.copy()
i, j = random.sample(range(len(solution)), 2)
new_solution[i], new_solution[j] = new_solution[j], new_solution[i]
neighbors.append(new_solution)
return neighbors
def tabu_search(initial_solution, max_iter=100, tabu_size=10):
current_solution = initial_solution
best_solution = current_solution
best_score = objective(best_solution)
tabu_list = deque(maxlen=tabu_size)
for iteration in range(max_iter):
neighbors = generate_neighbors(current_solution)
neighbors = [n for n in neighbors if n not in tabu_list]
if not neighbors:
break
neighbor_scores = [(n, objective(n)) for n in neighbors]
next_solution, next_score = min(neighbor_scores, key=lambda x: x[1])
# Aspiration Criteria: 좋은 해면 Tabu여도 허용
if next_score < best_score:
best_solution = next_solution
best_score = next_score
tabu_list.append(next_solution)
current_solution = next_solution
print(f"Iter {iteration+1}: best_score = {best_score}")
return best_solution, best_score
# 초기 해: 1~10의 무작위 순열
initial = random.sample(range(1, 11), 10)
best_solution, best_score = tabu_search(initial, max_iter=50, tabu_size=5)
print("\nBest solution:", best_solution)
print("Best score:", best_score)
여러 도시를 한 번씩 방문하고 시작점으로 돌아오는 가장 짧은 경로를 찾는 문제로, 이는 전형적인 NP-하드 문제로, 모든 경우의 수를 확인하기 어려움
동작 방식
ex) 100개의 도시를 방문하는 최단 경로를 찾을 때, 모든 경로를 계산하는 대신 Tabu Search를 사용하면 현실적인 시간 안에 좋은 근사 해 얻을 수 있음.
작업 할당, 생산 계획, 항공기 이착륙 시간 배정 등 복잡한 제약 조건이 있는 스케줄링에서 최적의 해를 찾는 문제
동작 방식
ex) 공장에서 여러 기계에 작업을 할당하여 전체 생산 시간을 최소화하는 문제를 해결할 때, 타부 서치를 사용해 최적의 작업 순서를 찾음
통신망에서 가장 효율적인 연결망을 구축하거나, 물류 네트워크에서 운송 비용을 최소화하는 경로를 설계하는 문제
주어진 자산들로 수익은 최대화하면서 위험은 최소화하는 투자 포트폴리오를 구성하는 문제
Tabu list
- 최근 수행한 이동들을 기록하는 단기 기억 장치
- Closed list, 이전에 방문한 해를 다시 탐색하지 않도록 함
Tabu Tenure (Tabu 지속 기간)
- 한 번 Tabu 리스트에 들어간 이동이 금지되는 횟수
- 이 기간이 지나기 전에는 같은 이동을 다시 시도할 수 없음
Frequency Memory (빈도 기억 장치)
- 너무 자주 선택되었지만 해결책에 도움이 되지 않은 이동은 다음에 선택될 가능성을 낮춤
- 탐색 다양성을 높이기 위한 전략