Python

自作PCのパーツをグラフ理論とDFSで求める4

Python

[PR]当サイトはアフィリエイト広告を利用しています。

前回の記事でDFSを作成したので、これを利用して初めに作ったPCパーツのグラフからすべてのパターンを求めていきたいと思います。

PCパーツのグラフは以下。

これを隣接行列で表すと以下。

プログラムは以下。

graph = [[0,0,0,1,1,1,0,0,0],[0,0,0,1,1,1,0,0,0],[0,0,0,1,0,1,0,0,0],[0,0,0,0,0,0,1,1,0],[0,0,0,0,0,0,1,1,0],[0,0,0,0,0,0,0,0,1],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0]]
costTable = [3000,4000,5000,6000,8000,9000,8500,13000,20000]
partsName = ['caseA','caseB','caseC','motherA','motherB','motherC','cpuA','cpuB','cpuC']
startVerNum = 3
vnum = 9
pathTable = []
def dfs(vertex, path):
    connectFlag = False
    pathIn = path.copy()
    for i in range(vnum):
        if(graph[vertex][i] == 1):
            connectFlag = True
            pathInTemp = pathIn.copy()
            pathInTemp.append(i)
            dfs(i, pathInTemp.copy())
    if(connectFlag == False):
        pathTable.append(pathIn.copy())
for i in range(startVerNum):
    dfs(i,[i])
for i in range(len(pathTable)):
    print(pathTable[i])
for path in pathTable:
    sum = 0
    for i in range(3):
        sum += costTable[path[i]]
    print(partsName[path[0]] + ',' + partsName[path[1]] + ',' + partsName[path[2]] + ':' + str(sum))

1行目で隣接行列をリストとして入力しています。

2行目はそれぞれのパーツの価格を入力しています。要素0番目がノード0に対応しています。

3行目はそれぞれのパーツの名前を入力しています。

4行目でDFSを始めるノードの数を入力しています。今回は開始ノードが0,1,2と3つ必要なので3が入力されています。

5行目はノード数9が入力されています。

6行目から17行目は前回の記事で紹介したDFSです。

for i in range(startVerNum):
     dfs(i,[i])

18行目と19行目でDFSを3回実行しています。開始ノードと開始時のパスを引数に関数dfsを実行しています。dfs(0, [0])、dfs(1, [1])、dfs(2, [2])が実行されます。

20行目と21行目で求めた経路を表示しています。

for path in pathTable:
    sum = 0
    for i in range(3):
        sum += costTable[path[i]]
    print(partsName[path[0]] + ',' + partsName[path[1]] + ',' + partsName[path[2]] + ':' + str(sum))

22行目から26行目で求めた経路をパーツの名前とその合計金額の形で出力しています。

22行目のfor文は2次元リストから行を一つずつ取り出して変数pathに代入する命令です。

path[0]にはPCケースのノード番号、path[1]にはマザーボードのノード番号、path[2]にはCPUのノード番号が入っています。

path[0]に0が入っているときcostTable[path[0]]はcostTable[0]となり、ノード0の価格がsumに加算されます。それをマザーボードとCPUでも実施します。

26行目でpathの名前と求めた合計を出力しています。

出力は以下となります。

[0, 3, 6]

[0, 3, 7]

[0, 4, 6]

[0, 4, 7]

[0, 5, 8]

[1, 3, 6]

[1, 3, 7]

[1, 4, 6]

[1, 4, 7]

[1, 5, 8]

[2, 3, 6]

[2, 3, 7]

[2, 5, 8]

caseA,motherA,cpuA:17500

caseA,motherA,cpuB:22000

caseA,motherB,cpuA:19500

caseA,motherB,cpuB:24000

caseA,motherC,cpuC:32000

caseB,motherA,cpuA:18500

caseB,motherA,cpuB:23000

caseB,motherB,cpuA:20500

caseB,motherB,cpuB:25000

caseB,motherC,cpuC:33000

caseC,motherA,cpuA:19500

caseC,motherA,cpuB:24000

caseC,motherC,cpuC:34000

このデータをどう使うかは使う人次第ですね。

この価格帯の構成は全部でどれほどか、このパーツを使った組み合わせは全部でどれほどかとか求めると少しは役に立つ?かな。

GPUやメモリなどは隣接行列が巨大になるだけなのでこれ以上は踏み込まないことにします。

またCPUとメモリ、CPUとGPUに依存関係がある場合、プログラムはより複雑になり、上記の単純なdfsでは求めるのが難しくなります。

しかしここではこれ以上踏み込まないことにします。

こういう組み合わせの求め方があるということの勉強になったということで。

以上「自作PCのパーツをグラフ理論とDFSで求める」でした。




※ココナラに出品しています。
お気軽にご相談ください。
小規模なPythonプログラム作成します 自分でプログラミングするのが面倒なあなたに