無向グラフ上でのクラスタリング結果をまとめる方法についてコードの書き方についてご教授いただきたいです。
背景
私は現在、無向グラフ上でのクラスタリングのコードを書いています。
クラスタリングは問題なくできたのですが、その出力結果が上手くまとめられないので、上手い出力方法がないかと思い質問に至りました。
やりたいこと
今の出力結果では、残った枝を愚直に出力しているため
x_01_
x_04_
x_14_
x_23_
となっていますが、これを[x_01_, x_04_ ,x_14_], [x_23_]
のように、クラスタごとにまとめたいです。
ソースコードの最後の #クラスタの出力 の部分だけ変更したいと考えております。
x_01_というのは、ノード0とノード1の間の枝を示しています。
コードの説明
x[i,j]は枝がある時1, ない時0を表す01決定変数です。
現段階での私なりの着想
i,jに
Python
1import pandas as pd 2import numpy as np 3import pulp 4 5#問題定義 6problem = pulp.LpProblem(name="Test", sense=pulp.LpMaximize) 7 8 9#距離行列(一例) 10cc = [ 11 [0, 3, 0, 0, 3], 12 [0, 0, 1, -3, -1], 13 [0, 0, 0, 3, 0], 14 [0, 0, 0, 0, -1], 15 [0, 0, 0, 0, 0] 16 ] 17 18w ={} 19for i in range(len(cc)): 20 for j in range(len(cc)): 21 w[i,j] = cc[i][j] 22 23#xを決定変数として定義 24x = {} 25for i in range(len(cc)) : 26 for j in range(len(cc)): 27 x[i,j] = pulp.LpVariable("x[{0}{1}]".format(i,j), 0, 1, pulp.LpInteger) 28 29 30 31 32#目的関数の宣言 33problem += pulp.lpSum(w[i,j] * (x[i,j] + y[i,j]) for i in range(len(cc)) for j in range(len(cc))), "TotalValue" 34 35#制約式 36for i in range(len(cc)): 37 for j in range(len(cc)): 38 #problem += x[i,j] <= y[i,j] 39 for k in range(len(cc)): 40 problem += x[i,j] + x[j,k] - x[i,k] <= 1 41 problem += x[i,j] + x[i,k] - x[j,k] <= 1 42 problem += x[i,k] + x[j,k] - x[i,j] <= 1 43 44 45#最適解の結果 46status = problem.solve() 47print(pulp.LpStatus[status]) 48 49print(pulp.value(problem.objective), end=" ") 50 51 52 53#クラスタの出力 54for i in range(len(cc)): 55 for j in range(len(cc)): 56 if x[i,j].value() == 1 and i < j: 57 print(x[i,j]) 58
Optimal 16.0 x_01_ x_04_ x_14_ x_23_
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/21 10:02