これなに
需要を満たしつつ輸送費と生産費の和が最小となるように、どこで何をどれだけ生産し、どう輸送するかを求める。
Pythonで試す
諸元
python
製品 = list('AB')
需要地 = list('PQ')
工場 = list('XY')
レーン = (2, 2)
輸送費表
python
import numpy as np, pandas as pd
tbdi = pd.DataFrame(((j, k) for j in 需要地 for k in 工場), columns=['需要地', '工場'])
tbdi['輸送費'] = [1,2,3,1]
tbdi
需要地 | 工場 | 輸送費 | |
---|---|---|---|
0 | P | X | 1 |
1 | P | Y | 2 |
2 | Q | X | 3 |
3 | Q | Y | 1 |
需要表
python
tbde = pd.DataFrame(((j, i) for j in 需要地 for i in 製品), columns=['需要地', '製品'])
tbde['需要'] = [10, 10, 20, 20]
tbde
需要地 | 製品 | 需要 | |
---|---|---|---|
0 | P | A | 10 |
1 | P | B | 10 |
2 | Q | A | 20 |
3 | Q | B | 20 |
生産表
python
tbfa = pd.DataFrame(((k, l, i, 0, np.inf) for k, nl in zip(工場, レーン)
for l in range(nl) for i in 製品), columns=['工場', 'レーン', '製品', '下限', '上限'])
tbfa['生産費'] = [1, np.nan, np.nan, 1, 3, np.nan, 5, 3]
tbfa.dropna(inplace=True)
tbfa.ix[4, '上限'] = 10
tbfa
工場 | レーン | 製品 | 下限 | 上限 | 生産費 | |
---|---|---|---|---|---|---|
0 | X | 0 | A | 0 | inf | 1.0 |
3 | X | 1 | B | 0 | inf | 1.0 |
4 | Y | 0 | A | 0 | 10.000000 | 3.0 |
6 | Y | 1 | A | 0 | inf | 5.0 |
7 | Y | 1 | B | 0 | inf | 3.0 |
解く
python
from ortoolpy import logistics_network
_, tbdi2, _ = logistics_network(tbde, tbdi, tbfa)
結果:生産量(ValY)
python
tbfa
工場 | レーン | 製品 | 下限 | 上限 | 生産費 | VarY | ValY | |
---|---|---|---|---|---|---|---|---|
0 | X | 0 | A | 0 | inf | 1.0 | v9 | 20.0 |
3 | X | 1 | B | 0 | inf | 1.0 | v10 | 10.0 |
4 | Y | 0 | A | 0 | 10.000000 | 3.0 | v11 | 10.0 |
6 | Y | 1 | A | 0 | inf | 5.0 | v12 | 0.0 |
7 | Y | 1 | B | 0 | inf | 3.0 | v13 | 20.0 |
結果:輸送量(ValX)
python
tbdi2
需要地 | 工場 | 輸送費 | 製品 | VarX | ValX | |
---|---|---|---|---|---|---|
0 | P | X | 1 | A | v1 | 10.0 |
1 | P | X | 1 | B | v2 | 10.0 |
2 | Q | X | 3 | A | v3 | 10.0 |
3 | Q | X | 3 | B | v4 | 0.0 |
4 | P | Y | 2 | A | v5 | 0.0 |
5 | P | Y | 2 | B | v6 | 0.0 |
6 | Q | Y | 1 | A | v7 | 10.0 |
7 | Q | Y | 1 | B | v8 | 20.0 |
以上