2013-07-03 7 views
10

これはアルゴリズム的/数学的な問題ですが、私はC++でソリューションを実装したいと考えています。マトリックスに数値を追加して最小結果を得るにはどうすればよいですか?

は、私はドットが整数を表すので、どこのような行列があるとします。

私はから最大1つの番号が存在するように、各列から数字を1つ選ぶとした場合、私は最低限の結果をもたらすであろうどのように
W X Y Z 
A . . . . 
B . . . . 
C . . . . 
D . . . . 

各列?例えば

、私はAW BX CY DZまたはAZ BX CY DWではなくAW BW CZ DZ

を選ぶことができるブルートフォースアプローチは、nを取るように見えるでしょう!計算。より速い方法がありますか?最終的にはサイズ〜60の行列に数値を追加したいと思います。

また、すべての数値は0から256

+0

n実際に階乗。私の間違い。 – Tarik

+1

AW、BX、BW、AXで始まっているとしましょう。どちらの場合も、A、B行、W、X列は出力されます。それらの行に沿って再帰的に考え、結果をキャッシュすることはそのトリックを行うべきです。 http://en.wikipedia.org/wiki/Dynamic_programming – Tarik

+9

http://en.wikipedia.org/wiki/Hungarian_algorithm あなたの質問はこの問題と似ています。 – user2548103

答えて

1

の範囲であり、あなたは、むしろそれを自分でコーディングしたくない場合、あなたは常に他人のハードワークと種類の出版物を使用することができます。ハスケルのこの1つは、古いラップトップで2秒未満で60×60のランダムマトリックスを解きます。どのような素晴らしいアルゴリズム!

import Data.Algorithm.Munkres 
import Data.Array.Unboxed 
import Data.List (transpose) 

solve n matrix = 
    hungarianMethodInt (listArray ((1,1),(n,n)) $ concat $ transpose matrix) 
関連する問題