知恵袋で見つけた数的処理の最大・最小の問題をPythonで解いてみた。

 知恵袋で見つけた数的処理の最大・最小の問題Pythonで解いてみました。(^_^;

 A〜D4つの都市がある。ある人が車である都市を出発し、他の都市に1度ずつ立ち寄って、再び最初の都市に戻る。ある人の運転する車で各都市間を移動する際の燃料消費量が以下のようになるとき最小となる燃料消費量はいくらか。
 移動経路(消費量L)
 A→B(20) C→A(15)
 A→C(15) C→B( 8)
 A→D(10) C→D( 6)
 B→A(14) D→A( 7)
 B→C( 4) D→B(12)
 B→D( 8) D→C( 4)

 ABCDとBCDAのように円順列で同じものとみなされる関係にあるものは、加法の交換法則から和が同じになるので、円順列を考えて、Aを起点に固定して考えます。すると、BCDの順列だけ考えて6通りだけ考えればよいことになります。
 ちなみに、A→B(20)、B→A(14)とあるように、逆順では和は同じになりません。
 プログラムでは、Aを固定して、BCDの順列で回して、取りうる経路のそれぞれの燃料消費量の合計を比較して最小値を求めました。

● FuelConsum1.py

# coding: UTF-8
# FuelConsum1.py

import itertools
from time import time

def toStr(lst):
    return '%s'%''.join(lst)

def main():
    tm = time()  # Timer Start
    fc = {  # 燃料消費量の辞書
        'AB':20, 'AC':15, 'AD':10, 'BC': 4, 'BD': 8, 'CD': 6,
        'BA':14, 'CA':15, 'DA': 7, 'CB': 8, 'DB':12, 'DC': 4
    }
    P = 'BCD'
    min,res = 1000,''
    for p in itertools.permutations(P):     # 'BCD'の順列で回す
        s = 'A'+toStr(p)    # 移動経路
        l = len(s)
        sum,expr = 0,''
        for i in range(l):
            t = fc[(s+'A')[i:i+2]]
            expr+='+%2s'%str(t)
            sum+=t
        expr = '%s: %s = %d'%(s,expr,sum)
##        print(expr)
        if sum< min:
            min,res = sum,expr
    print(res)  # 結果
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

ADCB: +10+ 4+ 8+14 = 36
Runtime : 0.000 [sec]