Transportation Model


輸送モデルについてお話しします.
転送モデルは、次の特性を持つ問題を解決するために使用されます.
・製品を出発地から到着地まで輸送し、できるだけ少ない費用で輸送する.
.出発地ごとに一定数の供給がある.
例として、以下のように説明することができる.
農用機械を生産する工場P 0,P 1,P 2が3社ある.
この機械が必要な農場はW 0,W 1,W 2の3箇所です.
1台の機械を工場から各目的地に輸送する費用は距離や状況によって異なる.
総輸送費用を最小化するために、輸送モデルの目的は、工場ごとに農場まで何台の機械を輸送するかを決定することである.


#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()