알고리즘 분석 | Greedy 알고리즘 쉽게 이해하기 | Fractional Knapsack Problem(분수 배낭 문제)

2023. 3. 27. 16:35·Algorithm
목차
  1. 이전 포스팅
  2. 탐욕 알고리즘(Greedy 알고리즘)이란?
  3. 그리디 알고리즘의 활용
  4. Fractional Knapsack Problem(FKP)

이전 포스팅

이전 포스팅을 공부하고 오시는 것이 이번 포스팅을 이해하는 데, 도움을 줍니다

2023.03.20 - [알고리즘 분석 및 데이터 구조] - 알고리즘 분석 | The Master Method | 마스터 정리

 

알고리즘 분석 | The Master Method | 마스터 정리

이전 포스팅 알고리즘 분석 | 힙 정렬 | 분할 정복 Divide & Conquer | 병합 정렬 Merge sort 이전 포스팅 알고리즘 분석 | Heap 힙 데이터 구조 | Heap 삽입과 삭제 이전 포스팅 https://jelong.tistory.com/entry/%EC%95%

jelong.tistory.com


탐욕 알고리즘(Greedy 알고리즘)이란?

탐욕적 방법은 문제 해결을 위해 매 순간 최적이라고 생각되는 선택을 하는 방법입니다. 

Fig. 1. 5가지 맛 아이스크림

예를 들어, 친구들과 아이스크림 가게에 갔다고 해요. 이 가게에서는 많은 종류의 아이스크림을 팔고 있고, 여러분은 5가지 맛을 한번에 먹을 수 있는 세트를 고를 수 있어요.

하지만, 한번에 고를 수 있는 맛이 제한되어 있기 때문에, 최고의 조합을 찾는 것이 목표예요. 탐욕적 방법을 사용하면, 여러분은 가장 좋아하는 맛부터 차례대로 고르게 될 거예요. 예를 들어, 첫 번째 맛은 초코렛, 두 번째 맛은 바닐라, 세 번째 맛은 딸기, 네 번째 맛은 민트, 그리고 다섯 번째 맛은 쿠키를 고를 수 있겠죠.

이렇게 가장 좋아하는 맛을 차례대로 골라 최고의 조합을 찾는 것이 탐욕적 방법입니다. 하지만 이 방법은 항상 최적의 해결책을 찾아내지는 못할 수도 있어요. 예를 들어, 세트가 다양한 맛들이 조화롭게 어우러진 조합이 최고일 수도 있지만, 여러분은 단순히 좋아하는 맛 순서로 고르게 될 수도 있죠.

 

요약하면, 탐욕적 방법은 문제 해결을 위해 매 순간 최적이라 생각되는 선택을 하는 방법입니다. 이 방법은 때때로 빠르게 해결책을 찾아낼 수 있지만, 항상 최고의 해결책을 찾아내지는 못할 수도 있습니다.

시간 복잡도는 O(nlogn)입니다.


 

그리디 알고리즘의 활용

그리디 알고리은 우리의 일상생활에서 다양한 상황에서 사용할 수 있어요. 몇 가지 예를 들어 볼게요:

 

동전 거스름돈: 상점에서 물건을 산 후 거스름돈을 받을 때, 가장 적은 개수의 동전으로 거슬러주려면 큰 액면가의 동전부터 줍니다. 예를 들어 500원, 100원, 50원, 10원 동전이 있다면, 500원부터 최대한 많이 사용하고, 그 다음 100원, 50원, 10원 순서로 거슬러 줄 수 있죠.

시간 관리: 하루 일과를 계획할 때, 가장 중요한 일부터 처리하고, 남은 시간에 차례대로 덜 중요한 일을 처리하는 방법을 사용할 수 있어요. 이렇게 하면 시간을 효율적으로 활용할 수 있죠.

여행 경로 계획: 여행지를 방문할 때, 가장 가까운 관광지부터 차례대로 방문하는 것이 시간과 에너지를 절약할 수 있어요. 이 경우, 가장 가까운 관광지를 찾아내는 것이 탐욕적 방법인 셈이죠.

할인 상품 구매: 쇼핑을 할 때, 할인율이 가장 높은 상품부터 구매하여 예산을 절약하는 것도 탐욕적 방법을 사용한 사례입니다.


 

Fractional Knapsack Problem(FKP)

목표: 총 무게 W를 초과하지 않으면서 최대 이익을 갖는 부분 집합을 찾기:


분할 가능 배낭 문제(FKP)에서는 각 항목의 임의의 비율, xi를 취할 수 있습니다.

즉, 해결책은 xi 값들의 집합으로, 이들 값들이 다음 조건을 만족합니다.

0≤xi≤wi for all i, and

∑i∈Sxi≤W 

총 가치는 선택된 물건들의 가치의 합에 의해 결정됩니다:

∑i∈Sbi(xi/wi)


FKP 예시

Fig. 2. https://en.wikipedia.org/wiki/Knapsack_problem

분할 배낭 문제(Fractional Knapsack Problem, FKP)는 배낭 문제의 한 종류로, 물건을 쪼갤 수 있다는 가정 하에 최대 가치를 찾는 문제입니다. 

 

먼저, 여러분이 다음과 같은 물건들을 가지고 있다고 가정해봅시다:

 

ex ) wi=3, xi=7 는 무게 3, 가치 7를 뜻합니다

무게 3, 가치 7
무게 4, 가치 9
무게 5, 가치 9
무게 2, 가치 2


그리고 배낭의 최대 무게는 W=6입니다.

그리디 방법인 가치 대비 무게bi가 가장 높은 물건부터 선택하는 방법을 사용해봅시다.


(3, 7)의 가치 대비 무게: 7/3≈2.33
(4, 9)의 가치 대비 무게: 9/4≈2.25
(5, 9)의 가치 대비 무게: 9/5≈1.80
(2, 2)의 가치 대비 무게: 2/2=1.00


1. 가치 대비 무게가 가장 높은 물건은 (3, 7)이므로, 우선 이것을 선택합니다. 이제 배낭에 남은 공간은 6 - 3 = 3입니다.

2. 다음으로 가치 대비 무게가 높은 (4, 9)를 선택하려고 하지만, 배낭에 담을 수 있는 여유 무게가 3으로 부족합니다. 그러므로 이 물건은 선택할 수 없습니다.

3. 세 번째로 가치 대비 무게가 높은 (5, 9)도 마찬가지로 배낭에 담을 수 없습니다.

4. 마지막으로, (2, 2)를 선택할 수 있습니다. 배낭에 남은 공간은 3이므로, 이 물건을 담을 수 있습니다. 이제 배낭에 남은 공간은 3 - 2 = 1이며, 더 이상 담을 수 있는 물건이 없습니다.

 

결과적으로 그리디 방법을 사용하면 (3, 7)과 (2, 2)를 선택하게 되어, 총 가치는 7 + 2 = 9가 됩니다. 

이 문제에서 그리디 방법은 최적해를 찾아내지 못했습니다. 최적해는 (4, 9)와 (2, 2)를 선택하여 총 가치가 11이 되는 경우입니다.


저작자표시 비영리 변경금지
  1. 이전 포스팅
  2. 탐욕 알고리즘(Greedy 알고리즘)이란?
  3. 그리디 알고리즘의 활용
  4. Fractional Knapsack Problem(FKP)
'Algorithm' 카테고리의 다른 글
  • 알고리즘 분석 | Dynamic Programming | 0/1 배낭 문제 Knapsack Problem 쉽게 이해하기
  • 알고리즘 분석 | 간격 스케줄링(Interval Scheduling) | Task Scheduling
  • 알고리즘 분석 | The Master Method | 마스터 정리
  • 알고리즘 분석 | 힙 정렬 | 분할 정복 Divide & Conquer | 병합 정렬 Merge sort
Jelong
Jelong
커스텀 웹: https://jaehong-park.com Github: https://github.com/qkrwoghd04
  • Jelong
    24/7 Developer's Note
    Jelong
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Software Engineering
      • Ubuntu
      • Network
      • JavaScript
      • Web
      • Interaction Design
      • React Native
      • React
      • Algorithm
      • Java
      • Database design
      • IT Trend
      • TroubleShooting
      • AWS
      • Interview
      • LG CNS AM CAMP 1기
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Queues
    ChatGPT
    GPT-4
    알고리즘 분석
    티스토리챌린지
    javascript
    generic
    css
    typescript
    BST
    오블완
    frontend
    heap
    알고리즘
    자바
    화이트 박스 테스트
    java
    html
    이진트리
    expo
    JS
    미니넷
    자바스크립트
    블랙 박스 테스트
    데이터 구조
    AWS
    prototyping
    React
    mininet
    소프트웨어 공학
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
Jelong
알고리즘 분석 | Greedy 알고리즘 쉽게 이해하기 | Fractional Knapsack Problem(분수 배낭 문제)

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.