์ž๋ฃŒ๊ตฌ์กฐ/๐Ÿ‘‰์•Œ๊ณ ๋ฆฌ์ฆ˜ - 20

์˜ค๋Š˜ ๋“ค์€ ๊ฐ•์˜ ๋ชฉ๋ก

  1. ๊ทธ๋ฆฌ๋”” - 2
  2. ๊ทธ๋ž˜ํ”„ ์ตœ๋‹จ๊ฒฝ๋กœ - 1

๊ทธ๋ฆฌ๋””(๋ถ€๋ถ„ ๋ฐฐ๋‚ญ ๋ฌธ์ œ, fractional knapsack problem)

๋ฌด๊ฒŒ์ œํ•œ์ด $k$์ธ ๋ฐฐ๋‚ญ์— ์ตœ๋Œ€ ๊ฐ€์น˜๋ฅผ ๊ฐ€์ง€๋„๋ก ๋ฌผ๊ฑด์„ ๋„ฃ๋Š” ๋ฌธ์ œ
๋ฌผ๊ฑด์€ ๋ฌด๊ฒŒ $w$์™€ ๊ฐ€์น˜ $v$๋ฅผ ๊ฐ€์ง
๋ฌผ๊ฑด์„ ์ชผ๊ฐœ์„œ ๋„ฃ๊ธฐ ๊ฐ€๋Šฅํ•˜๋‹ค. (์ชผ๊ฐœ์„œ ๋ชป๋„ฃ๋Š” ๊ฒฝ์šฐ์˜ ๋ฌธ์ œ๋ฅผ 0/1)

stuffs = [
    {"weight": 10, "value": 10},
    {"weight": 15, "value": 12},
    {"weight": 20, "value": 10},
    {"weight": 25, "value": 8},
    {"weight": 30, "value": 5},
]
def FractionalKnapsack(maxweight, stuffs):
    stuffs = sorted(stuffs, key=lambda x:x["weight"]/x["value"])
    value = 0
    for stuff in stuffs:
        if maxweight - stuff['weight'] < 0:
            value += stuff['value'] / stuff['weight'] * maxweight
            break
        else:
            value += stuff['value']
            maxweight -= stuff['weight']
    return value
FractionalKnapsack(30, stuffs)

๋ƒ…์ƒ‰

์ œํ•œ๋œ ๋ฌด๊ฒŒ๋กœ ์ตœ๊ณ ์˜ ๊ฐ€์น˜๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์€
โ€œ๋ฌด๊ฒŒ 1๋‹น ๊ฐ€์น˜โ€๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ฒƒ๋“ค์„ ๊ณ ๋ฅด๋ฉด ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฌด๊ฒŒ/๊ฐ€์น˜์— ๋”ฐ๋ผ์„œ ๋ฌผ๊ฑด๋“ค์„ ์ •๋ ฌํ•˜๊ณ 
์•ž์—์„œ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ๊ฐ€๋ฐฉ์— ์ฑ„์›Œ๋‚˜๊ฐ„๋‹ค.
๋‹ค์Œ์œผ๋กœ ๋„ฃ์„ ๋ฌผ๊ฑด์ด ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ๋ณด๋‹ค ์ ์œผ๋ฉด, ๋ฌผ๊ฑด์„ ์ชผ๊ฐœ์„œ ๋„ฃ๋Š”๋‹ค.

๊ทธ๋ฆฌ๋””์˜ ์ž˜๋ชป๋œ ์‚ฌ์šฉ(?)

๊ทธ๋ฆฌ๋””

ํŠธ๋ฆฌ์—์„œ ์ตœ์†Œ๊ฐ€ ๋˜๋„๋ก ๊ณ ๋ฅด๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ
์œ„ ๊ทธ๋ฆผ์—์„œ ๋งค ์ˆœ๊ฐ„ ์„ ํƒ์ง€ ์ค‘ ๊ฐ€์žฅ ์ตœ์ ์˜ ๋‹ต์„ ๊ณจ๋ž์„ ๋•Œ,
$7 + 12 = 19$๊ฐ€ ๋˜๋Š”๋ฐ
์˜ฌ๋ฐ”๋ฅธ ๋‹ต์€ $10 + 5 = 15$๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋œ๋‹ค.

๋‹จ์ˆœํ•˜๊ฒŒ ์™„์ „ํƒ์ƒ‰์„ ํ†ตํ•ด์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์œผ๋กœ ์„ ํƒํ–ˆ์„ ๋•Œ,
๊ฒฐ๊ณผ๊ฐ’๋“ค์„ ๋น„๊ตํ•ด์„œ ์ตœ์†Œ์˜ ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋‘ ๋…ธ๋“œ๋ฅผ ์ž‡๋Š” ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•

๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜ ํ•ฉ์ด ์ตœ์†Œ๊ฐ€ ๋˜๋„๋ก ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•

๋ฌธ์ œ ์ข…๋ฅ˜

  1. ๋‹จ์ผ ์ถœ๋ฐœ ๋‹จ์ผ ๋„์ฐฉ
    ํŠน์ • ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•ด์„œ ํŠน์ • ๋…ธ๋“œ์— ๋„์ฐฉํ•˜๋Š” ๋ฌธ์ œ. (u -> v)
  2. ๋‹จ์ผ ์ถœ๋ฐœ
    ํŠน์ • ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ (u -> ๋ชจ๋“  ๋…ธ๋“œ)
  3. ์ „์ฒด ์Œ ๋ชจ๋“  ์Œ์— ๋Œ€ํ•œ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ (๋ชจ๋“  ๋…ธ๋“œ -> ๋ชจ๋“  ๋…ธ๋“œ)

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Dijkstra)

์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ๋…ธ๋“œ๋“ค์„ ํƒ์ƒ‰ํ•˜๋ฉฐ, ์‹œ์ž‘ ๋…ธ๋“œ์—์„œ ๊ฐ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์‹ 

์ฒ˜์Œ์— ์‹œ์ž‘ ๋…ธ๋“œ๊นŒ์ง€ ๊ฐ€๋Š” ๋น„์šฉ์„ 0, ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๋“ค๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๋ฌดํ•œ๋Œ€๋กœ ์ดˆ๊ธฐํ™”
์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ˜„์žฌ๋…ธ๋“œ๋กœ ํ•ด์„œ ์‹œ์ž‘.
ํ˜„์žฌ๋…ธ๋“œ์˜ ์ธ์ ‘๋…ธ๋“œ๋“ค์„ ํƒ์ƒ‰ํ•ด์„œ, ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ์ธ์ ‘๋…ธ๋“œ์— ๋„๋‹ฌํ•˜๋Š” ๋น„์šฉ์ด ๊ธฐ์กด์— ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ ์ธ์ ‘๋…ธ๋“œ์— ๋„๋‹ฌํ•˜๋Š”๋ฐ ๋“œ๋Š” ๋น„์šฉ๋ณด๋‹ค ์ ๋‹ค๋ฉด, ๋น„์šฉ์„ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค. ์ด๋ฅผ ๊ณ„์† ๋ฐ˜๋ณตํ•˜๋ฉด ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๋งˆ์ง€๋ง‰

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ธฐ์–ตํ•˜๋Š”๋Œ€๋กœ ์จ๋ดค๋Š”๋ฐ, ๋‹ค์Œ ๊ฐ•์˜ ๋“ค์„ ๋•Œ ํ™•์ธํ•ด๋ด์•ผ๊ฒ ๋‹ค.
-๋-

์ˆ˜๊ฐ•

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ