2017-04-12 17 views
5

私はグループバランシングの問題の初期解決策を作成しようとしていますが、私は非常に単純なように聞こえるものに固執しているようです。最小から最大までの要素のインデックス

基本的に私は重みの配列(ランダムな整数)を持っています。

W() = [1, 4, 3, 2, 5, 3, 2, 1] 

そして、私は、例えば、それぞれ最大の番号への最小の代わりに、配列のサイズに番号1と同じ長さの別の配列を作成したいです

S() = [1, 7, 5, 3, 8, 6, 4, 2] 

重複の場合、最初のオカレンスはインデックスの小さい方と見なされます。

私はもともとBubbleSortアルゴリズムを使用していましたが、残念ながらこれは私に必要な形式の出力を与えることはできません。

私はこれが非常に具体的な問題であることを理解していますが、助けていただければ幸いです。

+1

は、この必要性は、メモリ内で行われるようにしていますか?そうでない場合は、値をスプレッドシートにドロップし、組み込み関数を使用してこれを行うことをお勧めします。 – User632716

答えて

0

助けてくれた皆様、どうもありがとうございました!

私はあなたの提案を受け取り、私の全体的なプロジェクトとはほとんど関係がないことに一日を費やしていたにもかかわらず、何とか自分のソリューションを作り上げました。ここで

は、私が使用し、次のコードです:

Sub InitialSol(S() As Integer, n As Integer, k As Integer, W() As Long) 
Dim i As Integer, c As Integer 
Dim min As Long, max As Long, temp As Long 

min = W(1) 
max = W(1) 
For i = 2 To n 
    If W(i) <= min Then 
     min = W(i) 
    End If 
    If W(i) >= max Then 
     max = W(i) 
    End If 
Next i 

c = 1 
Do While c <= n 
    temp = max 
    For i = 1 To n 
     If W(i) = min Then 
      S(i) = c 
      c = c + 1 
     End If 
    Next i 
    For i = 1 To n 
     If W(i) > min And W(i) <= temp Then 
      temp = W(i) 
     End If 
    Next i 
    min = temp 
Loop 

End Sub 
1

値(コンテンツ)とインデックスを結合する方法を見つける必要があります。 excel-vbaにフラグを立てたので、シートにデータを書き込んで、最初に値を、2番目の列にインデックスを付けて、range.sortを使用して並べ替えることをお勧めします。その後、2列目にあなたの注文が格納されます

Excelを使用しない場合は、Scripting.Dictionary(インデックスをキーとして)を作成し、これをソートすることが考えられます。ソートする機能はありませんそれが、あなたはいくつかの例を見つけることができ、それをグーグル。

それとも、小数部分はあなたのインデックス [1.001, 4.002, 3.003, 2.004, 5.005, 3.006, 2.007, 1.008]を保持し、あなたからのデータをdoubleの配列を作成し、これを並べ替えるような醜い何かを小数を取得し、背中にそれらを掛けることができ整数。

2

これを試してみて、それがあなたのためにどのように働くか教えてください:

Option Base 0 
Option Explicit 
Option Compare Text 

Sub tmpSO() 

Dim tmp As Double 
Dim strJoin As String 
Dim i As Long, j As Long 
Dim W As Variant, S() As Double, X() As Long 

'Load W 
W = Array(1, 4, 3, 2, 5, 3, 2, 1) 

'Set the dimensions for the other arrays 
ReDim S(LBound(W) To UBound(W)) 
ReDim X(LBound(W) To UBound(W)) 

'Copy W into S 
For i = LBound(W) To UBound(W) 
    S(i) = W(i) 
Next i 

'Sort S 
For i = LBound(S) To UBound(S) - 1 
    For j = i + 1 To UBound(S) 
     If S(i) > S(j) Then 
      tmp = S(j) 
      S(j) = S(i) 
      S(i) = tmp 
     End If 
    Next j 
Next i 

'Get the results into X 
For i = LBound(S) To UBound(S) 
    X(i) = WorksheetFunction.Match(W(i), S, 0) 
    S(WorksheetFunction.Match(W(i), S, 0) - 1) = vbEmpty 
Next i 

'Print out W (original array) 
Debug.Print Join(W, ",") 

'Print out x (result array) 
For i = LBound(X) To UBound(X) 
    strJoin = strJoin & "," & X(i) 
Next i 
Debug.Print mid(strJoin, 2) 

End Sub 
+0

ニースの回答@Ralph –

関連する問題