• 계산 모델(Computation Model)
  • 최적화 모델(Optimization Model)
  • 탐욕 알고리즘(Greedy algorithm)
  • 파이썬 람다(lambda)


Chapter 1. Introduction and Optimization Problems 강의를 듣고 정리한 내용입니다.



계산 모델(Computation Model)

  • 이제까지 일어났던 무언가를 이해하거나 매일 보는 현상들을 설명하는 모델
  • 아직 일어나지않은 미래를 예측할 수 있게 해주는 모델
    • 예) 날씨 변화 모델 : 천 년동안 날씨가 어떻게 변했는지에 대해 모델과 미래에 어떻게 될지 예측하는 모델을 만들 수 있음


최적화 모델(Optimization Model)

  • 제한 조건을 가지며 목적 함수를 최대화 또는 최소화 하는 모델
  • 목적함수 : 최대화 또는 최소화 해야하는 것, 제한조건들은 몇몇 해를 제거하는 것
  • 냅색(=옛날 배낭)문제
    • 목적함수 : 매매할때 값이 최대한 많이 나가도록 하는 것
    • 제한조건 : 냅색안에 들어갈 수 있는 양
    • 도둑이 가장 값비싼 물건을 훔쳐야하는 최적화 문제
    • 연속 냅색 문제
      • 일부분만 가져갈 수 있는 문제(금괴가 아닌 금모래로 가져갈 수 있는 경우)
      • 탐욕 알고리즘으로도 풀 수 있고, 풀기 쉬운 편
    • 0/1 냅색 문제
      • 금괴를 가져가거나 아예 못 가져가는 경우
      • 한번 결정하면 그 결정이 다음 결정에 영향을 미침


최적화 문제를 푸는 방법

  • 무차별 대입 알고리즘
    • 모든 경우의 수를 고려해 승자를 선택
    • 그러나 실용적이지 않음
  • 탐욕 알고리즘(Greedy algorithm)
    • 여러가지 경우 중 하나를 결정할 때 그 순간 best라고 생각되는 것을 선택해나가는 방식
    • 가장좋은것의 의미는 정의에 따라 달라짐 → 가장 좋은것을 정의하기 위해 keyFunction을 사용
    • 탐욕 알고리즘은 좋은 해를 구할수는 있어도 최적 해를 구할수는 없음
class Food(object):
    def __init__(self, n, v, w):
        self.name = n
        self.value = v
        self.calories = w

    def getValue(self):
        return self.value

    def getCost(self):
        return self.calories
   
    def density(self):
        return self.getValue()/self.getCost()

    def __str__(self):
        return self.name + ':<' + str(self.value)\
                + ',' + str(self.calories) +
 '>'
-- 가장 좋은것의 의미를 어떻게 정의했는지 알려주는 함수
def greedy(items, maxCost, keyFunction):
    itemsCopy = sorted(items, key = keyFunction,
											 reverse = True)
    result = []
    totalValue, totalCost = 0.0, 0.0
   
    for i in range(len(itemsCopy)):
        if (totalCost + itemCopy[i].getCost()) <= maxCost:
            result.append(itemsCopy[i])
            totalCost += itemsCopy[i].getCost()
            totalValue += itemsCopy[i].getValue()
  
    return (result, totalValue)
  • 복사해서 사용하는 것은 좋은 습관
  • 시간소요
    • 모든 물건을 정렬 → 시간복잡도 : n log n (n은 물건의 개수)
    • for loop : n번
    • 최종 시간복잡도 : O(n log n) → 매우 효율적 !


파이썬 람다(lambda)

  • 익명의 함수를 만들 때 사용
  • (lambda 식별자 배열 : 원하는 식)
  • 이 파라미터들로 표현된 식을 계산하고 결과를 반환하는 함수를 만듦
  • def를 쓰는 대신에 인라인 함수로 정의
  • apply 나 map을 쓸 때 주로 사용.



다음강의 : Chapter 2. Optimization Problems