実際のビジネス上の問題における組み合わせの列挙について可能な限りシンプルに

組み合わせの列挙に関する資料を探し始めると、すべての文字またはすべての数字のすべての組み合わせを整理する方法の例がたくさんあります。 しかし、ジョセフ・ロマノフスキーと彼の離散分析を詳しく調べることなく、次元が事前にわからないマトリックス要素のすべての組み合わせを作成する方法は、そのような資料を見つけられなかったので、ここに書くことにしました。 突然誰かが必要になります。



OOPではなくOffice、Excel、Visual Basicを使用する理由 上記のこれらの質問にはすでに部分的に回答しています。 また、この選択は、このアルゴリズムが記述されている会社の詳細と、Officeが社内のすべての研究マネージャーが使用するメインソフトウェアであるという事実によって決定されると言うこともできます。



このようなタスクは純粋に適用され、データ分析の方法の1つを使用するときに常に発生します。



与えられた



  1. 「データ」シートには、要素数が不明な不定次元のマトリックスがあります。
  2. マトリックスの各列の長さ(つまり、列内の要素の数)は事前にわかりません。
  3. 確率の高い列Nの長さは、列N + 1の長さと列N-1の長さと一致しません。
  4. すでに形成されたマトリックスの特定の列の長さは時間とともに変化しないことが知られています。
  5. 行列の行の長さは常に同じであることが知られています。
  6. マトリックスの各要素が要素の値を持つ1つのセルに対応するように、マトリックスはExcelテーブルに表示されます。 このような行列を「初期条件の行列」と呼びます。


タスク: 「res」シートに、初期条件のマトリックスの要素の組み合わせのすべてのバリアントを相互に作成します。 マトリックスの値の1つは、 X回以上繰り返されるべきではありません。



さて、アルゴリズム自体はExcell 2010でテストされた作業スクリプトであり、できるだけシンプルで明快に記述しようとしました。



Dim RangeArray() As Integer Dim PositionArray() As Integer Dim ResultArray() As Integer MaxCombination = 3 '   . PresentValue = 1 ' ,     ,  ,        . MaxYSize = 0 '     . IterationCounter = 1 '        res. CombinationCounter = 0 '      . MaxIterationCoutner = 1 '       . PreviousIterationCounter = 0 '     ,   . WorkAreaXSize = Selection.Columns.Count '    . ReDim RangeArray(WorkAreaXSize) ReDim PositionArray(WorkAreaXSize + 1) ReDim ResultArray(WorkAreaXSize) RangeArray(0) = 1 '   .             For Each Column In Selection.Columns '    RangeArray,         . Column.SpecialCells(xlCellTypeConstants).Select WorkAreaYSize = Selection.Cells.Count If WorkAreaYSize > MaxYSize Then MaxYSize = WorkAreaYSize End If RangeArray(Column.Column) = WorkAreaYSize Next '       RangeArray Range(Cells(1, 1), Cells(MaxYSize, WorkAreaXSize)).Select ValueArray = Selection '   ,   . ,    ,       PositionArray ,   RangeArray  ,       . '    ,  ,       .   - ,    - . For i = 1 To WorkAreaXSize PositionArray(i) = 1 Next i For i = 1 To WorkAreaXSize ' ,  ,    i  . For e = 1 To i '       ,   -     . MaxIterationCoutner = MaxIterationCoutner * RangeArray(e) '                . Next e For y = 1 To MaxIterationCoutner '    ResultArray()     PositionArray() If PreviousIterationCounter < y Then '         ,    . For j = 1 To WorkAreaXSize ResultArray(j) = ValueArray(PositionArray(j), j) '    ResultArray()     PositionArray() If ResultArray(j) = PresentValue Then CombinationCounter = CombinationCounter + 1 '     PresentValue,       MaxCombination  End If Next j '  ResultArray(),   '  ResultArray()   res     IterationCounter       If CombinationCounter <= MaxCombination Then For d = 1 To WorkAreaXSize Sheets("res").Cells(IterationCounter, d).Value = ResultArray(d) Next d IterationCounter = IterationCounter + 1 '        End If End If CombinationCounter = 0 '   .  if   . PositionArray(1) = PositionArray(1) + 1 '      PositionArray,   .           ,      RangeArray()      PositionArray() For ErrorCorrections = 1 To WorkAreaXSize If PositionArray(ErrorCorrections) > RangeArray(ErrorCorrections) Then PositionArray(ErrorCorrections) = 1 'If IterationCounter <= MaxIterationCoutner Then ' ,         PositionArray        . ToDo   ,      ,     PositionArray  1,        ,    . PositionArray(ErrorCorrections + 1) = PositionArray(ErrorCorrections + 1) + 1 ' End If End If Next ErrorCorrections Next y PreviousIterationCounter = MaxIterationCoutner ',      . MaxIterationCoutner = 1 '      For s = 1 To WorkAreaXSize PositionArray(s) = 1 Next s Next i '  
      
      





マクロと初期条件のマトリックスのバリアントを含むスクリプト:



どんなコメントや建設的な批判も歓迎します。



All Articles