私は、K
に金のN
鉱山を最小コストで統合するアルゴリズムを実装することで問題がどのようなものか把握しようとしています。金を1つの鉱山から他の鉱山へと金銭を交換するコストは距離彼らの間に源鉱山の金の重量を倍にする。私のアルゴリズムのこのアルゴリズムの欠陥は何ですか?
例:
のは、我々は以下のN=3
鉱山
A = { Distance = 10, Gold = 2 }
B = { Distance = 12, Gold = 1 }
C = { Distance = 15, Gold = 1 }
を持っていると我々はK=1
鉱山に金を統合したいとしましょう。最初に金を統合するコストは次のとおりです。
Cost(B,A) = |12 - 10| * 1 = 2
Cost(B,C) = |12 - 15| * 1 = 3
Cost(C,B) = |15 - 12| * 1 = 3
Cost(A,B) = |10 - 12| * 2 = 4
Cost(C,A) = |15 - 10| * 1 = 5
Cost(A,C) = |10 - 15| * 2 = 10
それではA
にB
から金を移動するように私たちの最初の統合を作ってみよう。
当社の総コストは2
で、私たちの鉱山は
A = { Distance = 10, Gold = 3 }
C = { Distance = 15, Gold = 1 }
のように見えるし、順番に私たちのコストは(
Cost(C,A) = |15 - 10| * 1 = 5
Cost(A,C) = |10 - 15| * 3 = 15
ている私たちは以来、B
を伴うコストの任意の私たちのリストから削除する方法に注意してくださいそれは今消えています。)
次回の統合は、順序付きコストリストの最初の要素です。
C
からA
に折り目を移動すると、その統合を行った後、私たちの総コストは今2 + 5 = 7
あり、そのグループが大きK=1
であるので、私たちの鉱山が
A = { Distance = 10, Gold = 4 }
あり、我々は完了です。
汎化擬似コード:それが動作しない理由を
Mines = list of mines,
K = desired number mines,
sum = 0
while(Mines.Count != K)
{
Find m1,m2 in Mines such that Cost(m1,m2) is minimized
sum += Cost(m1,m2)
m2.Gold += m1.Gold
Mines.Remove(m1)
}
誰かが私に言うことはできますか?
関連(followup?):http://stackoverflow.com/questions/38711479/where-is-the-flaw-in-my-algorithm-for-consolidating-gold-mines – Thilo