Transportation Model

Transportation Model에 대한 이야기를 하겠다

Transportation Model은 다음과 같은 특성을 갖는 문제를 해결하기 위해서 사용한다.

. 제품을 출발지에서 도착지까지 가능한 최소의 비용으로 수송한다.
. 각 출발지는 공급할 수 있는 수량이 고정되어 있다.

예를 들어서 설명하면 아래와 같이 설명 할 수 있겠다.

농업용기계를 생산하는 공장 P0, P1, P2의 3곳이 있다.
이 기계를 필요로 하는 농장은 W0, W1, W2의 3곳이다.

기계 1대를 공장에서 각 목적지까지 수송하는데 드는 비용은 거리와 상황에 따라 수송단가가 달라진다.

총 수송비용을 최소화하기 위해서 각각의 공장에서 농장까지 몇대의 기계를 수송할지를 결정 하는 것이 Transportation Model의 목적이다.

#Transportation Model
from ortools.linear_solver import pywraplp
import pandas as pd

def main():
    solver = pywraplp.Solver('', pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING)

    costInput = pd.read_excel('../input/transportationsample/Transportation.xls', sheet_name='Cost')
    supplyInput = pd.read_excel('../input/transportationsample/Transportation.xls', sheet_name='Supply')
    demandInput = pd.read_excel('../input/transportationsample/Transportation.xls', sheet_name='Demand')

    supplyIdList = supplyInput.ID.tolist()
    demandIdList = demandInput.ID.tolist()

    maxDemand = 0
    supplyList = supplyInput.SUPPLY.tolist()
    demandList = demandInput.DEMAND.tolist()

    for i in demandList:
        maxDemand = maxDemand + i

    costArray = [[0]*len(demandIdList) for i in range(len(supplyIdList))]

    for i in range(len(supplyIdList)):
        for j in range(len(demandIdList)):
            cost = costInput[costInput.PLANT == supplyIdList[i]][demandIdList[j]].tolist()[0]
            costArray[i][j] = cost

    #Solution X initialization
    X = [[solver.IntVar(0, maxDemand,'') for i in range(len(supplyIdList))] for j in range(len(demandIdList))]

    for j in range(len(demandIdList)):
        demandSum = 0
        for i in range(len(supplyIdList)):
            demandSum = demandSum + X[i][j]
        solver.Add(demandSum == demandList[j])

    for i in range(len(supplyIdList)):
        supplySum = 0
        for j in range(len(demandIdList)):
            supplySum = supplySum + X[i][j]
        solver.Add(supplySum <= supplyList[i])

    costSum = 0
    for i in range(len(supplyIdList)):
        for j in range(len(demandIdList)):
            costSum = costSum + X[i][j]*costArray[i][j]

    solver.Minimize(costSum)

    solver.Solve()

    for i in X:
        print("")
        for j in i:
            print(int(j.SolutionValue()), end=' ')

if __name__ == '__main__':
    main()

좋은 웹페이지 즐겨찾기