2017-04-21 18 views
-1

私が解決しようとしている問題は、各グループの重みをできるだけ均等にしてn個の重みをk個のグループに分けなければならないパーティショニングの問題です。VBA - エラー2042

私は最初の解決策に何らかの形のヒューリスティックを適用して、ランダムスタートを改善しようとしていますが、間違いを克服しようとしています。

私の初期解決アルゴリズムの基本は次のとおりです。次の最大のソートされていない要素を選択し、最小の重みを持つグループに配置します。注:私は要素をサイズ順に並べ替えています。

私は次のコードから始めました。 S()は、現在、私は後で投入します1からnまでの空の配列であり、nは重みの数であり、kはグループの数、およびW(ある

Sub initialsolution(s() As Integer, n As Integer, k As Integer, w() As Long) 
    Dim i As Long, j As Long, l As long 
    ReDim mass(1 To k) As Long 

    For i = 1 To n 
     j = WorksheetFunction.Min(mass) 
     l = Application.Match(j, mass) 
     mass(l) = mass(l) + w(i) 
    Next i 

End Sub 

)のソートされた配列であります私の試行の場合、n = 8、k = 3、w =(5,4,3,3,2,2,1,1)である。

私の問題は、i = 6のときに発生し、質量2を考えています。質量に(6,6,5)の値があるため、質量の最小値jは5です。しかし、次の行では、 lの値が形成される。 lを変種に変更すると、エラー2042の値を3にする必要があります。これにより、エラー・コード「ランタイム・エラー '13':タイプの不一致」が発生します。インデックス。

ありがとうございました

+0

あなたはバックグラウンドについて多くのことを書いていますが、エラーの原因となったコード行を実際に投稿していないようです... VBAエラーは比較的一般的な傾向がありますので、[検証可能な例] (https://stackoverflow.com/help/mcve)。特定のエラーで簡単に回答できるように、質問を編集してみてください。 – Wolfie

+0

あなたはどのように引数を渡していますか? – SJR

+0

これはサブピュメントを実行する大きな部分のコード行です "initialsolution s、n、k、w"すべてのパラメータが事前に定義されています –

答えて

0

私は答えを見つけました。私は

l = Application.Match(j, mass, 0) 

代わりの

l = Application.Match(j, mass) 

を使用している場合は動作します。私は以前のバグが何だったのか分かりませんが、この新しいメソッドはマッチ値を最初に考慮してこのインデックスを返します。