210 likes | 600 Views
최적화 문제 해결. 생산 계획 및 통제 부산대학교 산업공학과 2012 년 2 학기 하병현. 목차. 서론 공정별 배치 : 물량 거리 모형 근사해 탐색 방법 발견적 기법 최적해 방법 모든 대안 검토 상용 소프트웨어 사용 근사해 탐색 방법 상용 소프트웨어 사용 메타 휴리스틱 방법 간 비교 실험 상용 소프트웨어 자동화. 서론. 최적화 문제 주어진 대안들 중 목적을 고려하여 가장 나은 것 선택 예제 공정별 배치 문제 -- 물량 - 거리 모형 입력 : 부서 간 물량 및 단위 이송 비용
E N D
최적화 문제 해결 생산 계획 및 통제 부산대학교 산업공학과 2012년 2학기 하병현
목차 • 서론 • 공정별 배치: 물량 거리 모형 • 근사해 탐색 방법 • 발견적 기법 • 최적해 방법 • 모든 대안 검토 • 상용 소프트웨어 사용 • 근사해 탐색 방법 • 상용 소프트웨어 사용 • 메타 휴리스틱 • 방법 간 비교 실험 • 상용 소프트웨어 자동화
서론 • 최적화 문제 • 주어진 대안들 중 목적을 고려하여 가장 나은 것 선택 • 예제 • 공정별 배치 문제 -- 물량-거리 모형 • 입력: 부서 간 물량 및 단위 이송 비용 • 대안 집합: 모든 가능한 배치 형태 • 목적: 총 이송 비용 최소화 • 배정 문제 • 입력: 각 작업자 별 과업 처리 비용 • 대안 집합: 모든 가능한 작업자-과업 배정 방법 • 목적: 총 비용의 최소화 • 문제의 난이도 • 쉬운 문제 • e.g., 배정 문제, 표준 수송 계획 • 어려운 문제(NP-hard problems) • e.g., 물량-거리 모형, traveling salesman problems
서론 • 해결 방안(일부만 나열) • 최적화 방법 • 모든 대안 검토 • 문제에 특화된 최적화 알고리즘 • e.g., 배정 문제: Hungarian method, 최단거리 문제: Dijkstra algorithm • 범용 최적화 알고리즘 • e.g., simplex, transportation simplex, network simplex • e.g., branch and cut • 상용 최적화 소프트웨어(CPLEX, LINDO, Xpress 등) • (범용) 최적화 방법론 • e.g., branch and bound, dynamic programming, A* algorithm • 근사해 탐색 방법 • 발견적 기법(heuristic algorithms) • e.g., 물량-거리 모형의 최대 비용 부서 인접화 • 메타 휴리스틱(meta-heuristics) • e.g., simulated annealing, tabu search, genetic algorithms 상용 근사해 탐색 소프트웨어(Excel solver, OptQuest 등)
공정별 배치: 물량 거리 모형 • 예제 문제 • 부서 간 이동 물량 • 부서 간 단위 물량 당 이동 비용(DijCij) • 물량 한 단위 당, 인접 부서의 경우 1원, 한 부서를 건너뛸 때마다 1원이 추가 • 대각선의 경우 인접 부서로 봄 • 배치 가능 형태 • Quadratic assignment problem • NP-hard
근사해 탐색 방법: 발견적 기법 • Gradient-descent 또는 greedy approach 1. 최초 배치 도출 • e.g., 순서대로 배치, 임의로 배치 2. 총비용을 감소시킬 수 있는 새로운 배치 도출 • 모든 인접 부서를 서로 교환해본 후 총비용을 가장 감소시키는 배치 선택 3. 비용이 개선되었다면 단계 2 반복, 아니면 종료 2 3 5 7 1 4 6 8 3 1 5 7 3 1 5 7 1 3 5 7 2 4 6 8 2 4 8 6 2 4 6 8 4 3 5 7 2 1 6 8
근사해 탐색 방법: 발견적 기법 • 구현(Python) • z = 2,778, X = [1, 1, 3, 2, 3, 2, 4, 4] X[i]: 부서 i가 위치한 열 1 4 3 7 2 6 5 8 L = [[0, 175, 50, 0, 30, 200, 20, 25], [0, 0, 0, 100, 75, 90, 80, 90], [0, 0, 0, 17, 88, 125, 99, 180], [0, 0, 0, 0, 20, 5, 0, 25], [0, 0, 0, 0, 0, 0, 180, 187], [0, 0, 0, 0, 0, 0, 80, 70], [0, 0, 0, 0, 0, 0, 0, 7], [0, 0, 0, 0, 0, 0, 0, 0]] defC(x1, x2): return max(1, abs(x1 - x2)) deftotal_cost(X): return sum(L[i][j] * C(X[i], X[j]) for i in xrange(7) for j in xrange(i + 1, 8)) (뒤에서 계속)
근사해 탐색 방법: 발견적 기법 • 구현(Python) (계속) • 결과인 2,778원이 최적? (앞에서 계속) X0 = X = [1,1,2,2,3,3,4,4] z0 = total_cost(X) whileTrue: updated = False for i in xrange(7): for j in xrange(i + 1, 8): X1 = X[:] X1[i], X1[j] = X1[j], X1[i] z1 = total_cost(X1) if z1 < z0: z0, X0 = z1, X1 updated = True ifnot updated: break print"z = %d, X = %s" % (z0, X0)
최적해 방법: 모든 대안 검토 • 모든 대안 • [1,1,2,2,3,3,4,4], [1,1,2,2,3,4,3,4], [1,1,2,2,4,4,3,3], ... • 모두 몇 개? 대략 87654321 = 8! = 40320 • 구현(Python) • z* = 2,510, X* = [1, 2, 3, 1, 4, 2, 4, 3] • 문제? • 12! = 479,001,600 • 30! = 265,252,859,812,191,058,636,308,480,000,000 1 2 3 5 4 6 8 7 ... from itertools import permutations z0 = 10**10 for X in permutations([1,1,2,2,3,3,4,4]): z = total_cost(X) if z < z0: z0, X0 = z, X print"z* = %d, X* = %s" % (z0, X0)
최적해 방법: 상용 소프트웨어 사용 • 최적화 수리 모형(문제를 기술하는 한 가지 방법) 정수 계획 모형 • 입력 변수 • Lij : 부서 i에서 j로의 이동 물량 • 결정 변수 • yik : 부서 i가 k 번째 열에 있으면 1, 아니면 0 부서 i가 위치한 열: k=1..4 kyik 부서 i와 j가 떨어진 정도: max(1, |k=1..4 kyik – k=1..4 kyjk|) • Objective • min. i=1..7 j=(i+1)..8 Lijmax(1, |k=1..4 kyik – k=1..4 kyjk|) • Constraints • k=1..4 yik = 1 for i=1,...,8 • i=1..8 yik = 2 for k=1,...,4
최적해 방법: 상용 소프트웨어 사용 • 구현(CPLEX) • z* = 2,510, y*14 = y*23 = y*32 = y*44 = y*51 = y*63 = y*71 = y*82 = 1 floatL[1..8][1..8] = [ [0,175,50,0,30,200,20,25], [0,0,0,100,75,90,80,90], ... [0, 0, 0, 0, 0, 0, 0, 0] ]; dvarinty[1..8][1..4]in0..1; minimizesum(iin1..7)sum(jin(i+1)..8) L[i][j] *maxl(1,abs(sum(kin1..4)k*y[i][k] - sum(kin1..4)k*y[j][k])); subjectto{ forall(iin1..8)sum(kin1..4)y[i][k] ==1; forall(kin1..4)sum(iin1..8)y[i][k] ==2; }
근사해 탐색 방법: 상용 소프트웨어 사용 • 구현(MS Excel) • z = 3,147 엑셀은 이 문제는 제대로 해결하지 못하는 것으로 보임 참고: Google에서 “엑셀 해찾기,” “excel solver” 등으로 검색
근사해 탐색 방법: 상용 소프트웨어 사용 • 구현(Open Solver for Excel) • http://opensolver.org/ • z = 3,107
근사해 탐색 방법: 메타 휴리스틱 • Simulated annealing • 구현(Python) • z = 2,510 / 2,510 / 2,510 / 2,510 / 2,510 / 2,510 / 2,510 / 2,510 / 2,510 / 2,510 ... from random import shuffle, randrange, random from math import exp for _ in xrange(10): X = [1, 1, 2, 2, 3, 3, 4, 4] shuffle(X) X0 = X[:] z = z0 = total_cost(X) t, pi, EPSILON = 100, 0.999, 0.001 while t > EPSILON: X1 = list(X) i, j = randrange(8), randrange(8) X1[i], X1[j] = X1[j], X1[i] z1 = total_cost(X1) if z1 <= z or random() < exp((z - z1) / t): X, z = X1, z1 if z < z0: X0, z0 = X[:], z t *= pi print"z = %d, X = %s" % (z0, X0)
방법 간 비교 실험 • Medium-size problem (16개의 부서) • 실험 결과 Gap = (z – z*) / z* 100% L = [[0, 166, 147, 72, 37, 92, 69, 153, 47, 85, 108, 180, 91, 42, 147, 116], [0, 0, 35, 181, 197, 159, 179, 48, 141, 178, 131, 84, 2, 75, 115, 181], [0, 0, 0, 193, 85, 171, 37, 157, 101, 0, 139, 68, 162, 127, 0, 89], [0, 0, 0, 0, 171, 33, 51, 172, 22, 105, 32, 193, 157, 79, 0, 50], [0, 0, 0, 0, 0, 92, 186, 4, 101, 136, 100, 159, 99, 193, 113, 109], [0, 0, 0, 0, 0, 0, 78, 111, 65, 107, 44, 21, 21, 115, 125, 85], [0, 0, 0, 0, 0, 0, 0, 0, 147, 173, 184, 166, 178, 184, 99, 66], [0, 0, 0, 0, 0, 0, 0, 0, 135, 40, 159, 167, 177, 110, 189, 108], [0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 125, 200, 182, 155, 0, 115], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 119, 166, 33, 141, 5], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 155, 53, 160, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 134, 0, 106], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181, 98, 130], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
상용 소프트웨어 자동화 • Excel automation L = [[0, 175, 50, 0, 30, 200, 20, 25], [0, 0, 0, 100, 75, 90, 80, 90], [0, 0, 0, 17, 88, 125, 99, 180], [0, 0, 0, 0, 20, 5, 0, 25], [0, 0, 0, 0, 0, 0, 180, 187], [0, 0, 0, 0, 0, 0, 80, 70], [0, 0, 0, 0, 0, 0, 0, 7], [0, 0, 0, 0, 0, 0, 0, 0]] import win32com.client as win32 xl = win32.gencache.EnsureDispatch('Excel.Application') xl.Visible = True ss = xl.Workbooks.Add() sh = ss.ActiveSheet n = len(L) for i in xrange(n): for j in xrange(n): sh.Cells(i + 1,j + 1).Value = L[i][j]
상용 소프트웨어 자동화 • CPLEX interfacing ... model = cplex.Cplex() model.objective.set_sense(model.objective.sense.minimize) model.variables.add(names = sources) model.variables.set_upper_bounds("Ingots", 100000) model.objective.set_linear(zip(sources, costs)) model.variables.add(names = ["Element1", "Element2", "Element3"], lb = [min * alloy for min in min_spec], ub = [max * alloy for max in max_spec]) model.linear_constraints.add(lin_expr = [cplex.SparsePair(ind = ["Element1", "Element2", "Element3"], val = [1.0] * 3)], senses = ["E"], rhs = [alloy]) mixed_sources = sources[3:] for i in range(1, 4): lhs = cplex.SparsePair(["Element" + str(i), "Pure" + str(i)] + mixed_sources, [-1.0, 1.0] + composition["Element" + str(i)]) model.linear_constraints.add(lin_expr = [lhs], senses = ["E"], rhs = [0.0]) model.solve()