μ•Œκ³ λ¦¬μ¦˜

[μ•Œκ³ λ¦¬μ¦˜ 정리] - μ™ΈνŒμ› 순회 문제(Traveling Salesperson Problem, TSP)

kirr 2023. 4. 28. 23:32

 

πŸ’‘μ™ΈνŒμ› 순회 문제(Traveling Salesman Problem, TSP) λž€? 

μ–΄λ–€ λ„μ‹œμ—μ„œ μΆœλ°œν•˜μ—¬ λ‹€λ₯Έ λͺ¨λ“  λ„μ‹œλ“€μ„ 돌고
λ‹€μ‹œ μΆœλ°œν–ˆλ˜ λ„μ‹œλ‘œ λŒμ•„μ˜€λŠ”λ° λ“œλŠ” μ΅œμ†Œ λΉ„μš©μ„ μ°ΎλŠ” 문제

브루트 포슀 해결방법 ( 쒋은 방법 x) 

μ™ΈνŒμ› 순회 문제λ₯Ό λ§‰μ—°ν•˜κ²Œ 생각해보면, νŠΉμ • 좜발 λ„μ‹œλ₯Ό 가정해놓고 λ„μ‹œλ₯Ό μˆœνšŒν•΄λ„ 경둜의 κΈΈμ΄λŠ” λ‹€λ₯΄μ§€ μ•Šμ„ 것이닀. 좜발 λ„μ‹œλ₯Ό  A둜 가정해놓고 λ‹€λ₯Έ λ„μ‹œλ“€μ„ μˆœνšŒν•˜λŠ” 방식은 (n-1)! ν˜•μ‹μœΌλ‘œ 경우의 수λ₯Ό ꡬ할 수 μžˆλ‹€. 

ν•˜μ§€λ§Œ 이 κ²½μš°λŠ” n이 컀지면 컀질수둝 λ§Žμ€ 경우의 수λ₯Ό λ”°μ Έμ£Όμ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 효율적인 λ°©λ²•μœΌλ‘œ μ‚¬μš©λ˜μ§€ μ•ŠλŠ”λ‹€. 

 

 

DP 적용 방식 (λ„μ‹œκ°€ 16개 μ΄ν•˜μΌ λ•Œ) / 졜적의 μ ‘κ·Ό 방식 

DP λ©”λͺ¨μ œμ΄μ…˜ = (n-1)!의 λͺ¨λ“  경둜λ₯Ό μ‘°μ‚¬ν•˜μ§€ μ•Šκ³  μ€‘λ³΅λœ 경둜λ₯Ό μ œκ±°ν•˜λŠ” 기법 
λΉ„νŠΈλ§ˆμŠ€ν¬ = νŠΉμ • λ„μ‹œλ₯Ό λ°©λ¬Έν•œ μƒνƒœλ₯Ό μ €μž₯ν•  λ•Œ μ‚¬μš© 

 

 

DP λ©”λͺ¨μ œμ΄μ…˜ 기법은 λ™μΌν•œ ν•˜μœ„λ¬Έμ œμ˜ λ°˜λ³΅μ„ λ§‰μ•„μ€ŒμœΌλ‘œμ¨ 더 높은 효율의 연산을 κ°€λŠ₯ν•˜κ²Œ ν•΄μ€€λ‹€. 

(λŒ€ν‘œμ μœΌλ‘œλŠ” ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ„ Top-Down 방식을 ꡬ할 λ•Œ μ‚¬μš©) 

 

λΉ„νŠΈλ§ˆμŠ€ν‚Ήμ€ bit μ—°μ‚°μœΌλ‘œ 예λ₯Ό λ“€μ–΄ 16개의 λ„μ‹œλ₯Ό ν‘œν˜„ν•  λ•Œ μœ„μ˜ λ°©λ²•μœΌλ‘œ ν‘œν˜„ν•˜λ €λ©΄ 2^16κ°€μ§€μ˜ 경우λ₯Ό 일일이 λ‹€ ν‘œν˜„ν•΄μ•Όν•˜λŠ”λ° λΉ„νŠΈλ§ˆμŠ€ν‚ΉμœΌλ‘œλŠ” 16bit으둜 ν‘œν˜„ν•  수 μžˆλ‹€. 

예λ₯Ό λ“€μ–΄ 16개의 λ„μ‹œλ“€ 쀑 1번, 2번, 6번 λ„μ‹œλ₯Ό λ°©λ¬Έ ν–ˆλ‹€κ³  ν•˜λ©΄ 0000 0000 0010 0011 μ΄λŸ°μ‹μœΌλ‘œ 각 μžλ¦¬μ— 1둜 λ°©λ¬Έ ν‘œμ‹œλ₯Ό 해쀄 수 μžˆλ‹€. 

 

κ·Έλ¦Όκ³Ό 같이 1번~5번 λ„μ‹œλ“€κ³Ό 이동 κ°€λŠ₯ν•œ κ²½λ‘œκ°€ μžˆλ‹€κ³  κ°€μ •ν•΄λ³Έλ‹€. 

좜발 경둜λ₯Ό 1이라고 μ§€μ •ν–ˆμ„ λ•Œ ,

μ™Όμͺ½ 그림은 1-> 2-> 3-> 5-> 4 순으둜 순회λ₯Ό ν•˜κ³  였λ₯Έμͺ½κ·Έλ¦Όμ€ 1-> 3-> 2-> 5-> 4 순으둜 순회λ₯Ό ν•œλ‹€. 

μœ„ 두 방식은 5->4 의 κ²½λ‘œκ°€ μ€‘λ³΅λ˜μ–΄ ꡬ해진닀. 

이미 λ°©λ¬Έν•œ λ„μ‹œλ“€κ³Ό ν˜„μž¬ μœ„μΉ˜ν•œ λ„μ‹œκ°€ 같은 κ²½μš°μ—λŠ” μ΅œμ†Œ λΉ„μš©μ΄ μΌμ •ν•˜λ―€λ‘œ 5번 λ„μ‹œμ—μ„œμ˜ μ΅œμ†ŒλΉ„μš©μ€ κ°™λ‹€. λ”°λΌμ„œ μ€‘λ³΅λ˜λŠ” 경우λ₯Ό λ‘λ²ˆ κ΅¬ν•˜λŠ”κ±΄ νš¨μœ¨μ μ΄μ§€ μ•Šλ‹€.

이럴 λ•Œ  DP λ©”λͺ¨μ œμ΄μ…˜ 기법을 μ‚¬μš©ν•˜μ—¬ μ΅œμ†ŒλΉ„μš©μ„ μ €μž₯해두어 μ€‘λ³΅ν•˜μ—¬ κ΅¬ν•˜μ§€ μ•Šλ„λ‘ ν•œλ‹€. 

 

 

μ΅œμ†ŒλΉ„μš©μ€ 2차원 λ°°μ—΄λ‘œ ν‘œν˜„ν•˜λŠ”λ°, μ΅œμ†ŒλΉ„μš©μ΄ 같을 쑰건 즉 , 행은 이미 λ°©λ¬Έν•œ λ„μ‹œλ“€μ˜ μ§‘ν•©, 열은 ν˜„μž¬ μžˆλŠ” λ„μ‹œλ²ˆν˜Έλ₯Ό ν‘œμ‹œν•œλ‹€. 

DP[i][j] = 이미 λ°©λ¬Έν•œ λ„μ‹œλ“€μ˜ 집합이 i, ν˜„μž¬ μžˆλŠ” λ„μ‹œλ₯Ό j둜 두어, 아직 λ°©λ¬Έν•˜μ§€ μ•Šμ€ λ‚˜λ¨Έμ§€ λ„μ‹œλ“€μ„ λͺ¨λ‘ λ°©λ¬Έν•œ λ’€ 좜발 λ„μ‹œλ‘œ λŒμ•„μ˜¬ λ•Œ λ“œλŠ” μ΅œμ†Œ λΉ„μš©μ„ κ΅¬ν•œλ‹€. 

μ΄λ•Œ i의 λ²”μœ„λŠ” λͺ¨λ“  경우의 수 0<=i<=2^n , j의 λ²”μœ„λŠ” 0<=j<=5이닀. 

 

μ™Όμͺ½ 그림을 DP λ©”λͺ¨μ œμ΄μ…˜ 기법을 ν™œμš©ν•΄λ³΄λ©΄ 1->2->3->5->4 순으둜 λ„μ‹œλ₯Ό μ§€λ‚  λ•Œ, DP[00001][1], DP[00011][2], DP[00111][3] , DP[10111][5] , DP[11111][4] 순으둜 κ°±μ‹ λœλ‹€. 

1->3->2->5->4 순으둜 λ„μ‹œλ₯Ό μ§€λ‚  λ•ŒλŠ” DP[00001][1], DP[000101][3], DP[00111][2] , DP[10111][5], DP[11111][4] 순으둜 κ°±μ‹ λ˜λŠ”λ°, 5번 λ„μ°©ν–ˆμ„ μ‹œ [10111][5]에 κ°’(=3)이 이미 μžˆμœΌλ―€λ‘œ κ·Έ 이후λ₯Ό ꡬ할 ν•„μš” 없이 ν•΄λ‹Ή λ°°μ—΄μ˜ 값을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.

 

이렇듯 DPλ©”λͺ¨μ œμ΄μ…˜ 기법과 λΉ„νŠΈλ§ˆμŠ€ν‚Ήμ„ μ‚¬μš©ν•˜μ—¬ μ΅œμ†Œ λΉ„μš©μ„ κ΅¬ν•˜λŠ” 방법이 μ™ΈνŒμ› 순회 λ¬Έμ œμ— μ΅œμ ν™”λœ μ•Œκ³ λ¦¬μ¦˜ 탐색 기법이닀. 

 

 

 

 

λ°±μ€€ μ™ΈνŒμ› 순회 문제 풀어보기 : https://www.acmicpc.net/problem/2098

 

2098번: μ™ΈνŒμ› 순회

첫째 쀄에 λ„μ‹œμ˜ 수 N이 μ£Όμ–΄μ§„λ‹€. (2 ≤ N ≤ 16) λ‹€μŒ N개의 μ€„μ—λŠ” λΉ„μš© 행렬이 μ£Όμ–΄μ§„λ‹€. 각 ν–‰λ ¬μ˜ 성뢄은 1,000,000 μ΄ν•˜μ˜ μ–‘μ˜ μ •μˆ˜μ΄λ©°, 갈 수 μ—†λŠ” κ²½μš°λŠ” 0이 μ£Όμ–΄μ§„λ‹€. W[i][j]λŠ” λ„μ‹œ iμ—μ„œ j

www.acmicpc.net