

python 実践データ分析100本ノック ノック61に関する質問です。

上記のコードを実行すると、総輸送コストが1450になり、書籍の1298とは違った結果になってしまいます。

実行環境はjupiter notebook でpulpとortoolpyはどちらもconda promptでインストール済みです。

コードに問題があれば教えて頂きたいです。

[code]

    import numpy as np
    import pandas as pd
    from itertools import product
    from pulp import LpVariable,lpSum,value
    from ortoolpy import model_min,addvars,addvals
    
    df_tc = pd.read_csv("trans_cost.csv",index_col="工場")
    df_demand = pd.read_csv("demand.csv")
    df_supply= pd.read_csv("supply.csv")
    
    np.random.seed(1)
    nw=len(df_tc.index)
    nf=len(df_tc.columns)
    pr=list(product(range(nw),range(nf)))
    
    m1=model_min()
    v1={(i,j):LpVariable("v%d_%d"%(i,j), lowBound=0) for i,j in pr}
    
    m1 +=lpSum(df_tc.iloc[i][j]*v1[i,j] for i,j in pr)
    for i in range(nw):
        m1 += lpSum(v1[i,j] for j in range(nf)) <= df_supply.iloc[0][i]
    for j in range(nf):
        m1 += lpSum(v1[i,j] for i in range(nw)) >= df_demand.iloc[0][i]
    m1.solve()
    
    df_tr_sol = df_tc.copy()
    total_cost=0
    for k,x in v1.items():
        i,j = k[0],k[1]
        df_tr_sol.iloc[i][j]=value(x)
        total_cost +=df_tc.iloc[i][j]*value(x)
    
    print(df_tr_sol)
    print("総輸送コスト:"+str(total_cost))
    
[/code]


CC BY-SA 4.0
2022-01-13T12:00:33.247
85669
2022-01-14T01:28:40.763
2022-01-13T12:05:31.260
32986
49477
question
python
実践データ分析100本ノック61 について


配布されている`sample_100knocks.zip`中の該当`answer`と比べると、23行目末尾`df_demand.iloc[0][i]`のインデックスが間違っているようです。

正しくは`i`ではなく`j`であり、`df_demand.iloc[0][j]`となっています。

ちなみにAnaconda環境ではなくjupyter notebookでもない、Windows10の素のPython 3.10.1
では総輸送コストが1296というまた少し違った値になったので、何か他のモジュールの版数とかあるいはCSVデータとかに違いがあるのかもしれません。

* * *

@ほーりー
さんのコメントとか以下記事に総輸送コストは1296と書かれていて特に注釈とか無いため1296が正しいようなので、質問に「書籍の1298」とあるのはtypoのようですね。

[『Python実践データ分析100本ノック』ノック61](https://note.com/toshiyamiyazaki/n/nd1010d6ce73d)  
[Python実践データ分析100本ノックを読む](https://bitop.hatenablog.com/entry/2019/11/04/090327)


CC BY-SA 4.0
2022-01-14T00:18:52.710
85675
2022-01-14T01:28:40.763
2022-01-14T01:28:40.763
26370
26370
85669
answer