Страницы: 1 2 След.
RSS
Перебор всех возможных вариантов, VBA для этой задачи
 
Здравствуйте! Необходим код для перебора всех возможных вариантов - 15 событий по 3 исхода в каждом. Как такое сделать? Пытаюсь вникнуть в VBA, но пока что до такого мне самостоятельно еще далеко, знаю лишь несколько операторов...
 
Kara_100, здравия. Конкретизируйте.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, у нас есть 15 параметров и три возможных варианта их развития (негативный, нейтральный и позитивный). Хочется создать код, который будет выдавать общее кол-во возможных переборов (3^15) исходов эти параметров. Естественно на экран выводить их не нужно, потому что такое кол-во в лист не вместится, код нужен для дальнейшей селекции этих вариантов, первый шаг так сказать.
                негатив       нейтрал    позитив
пар 1            
пар 2
пар 3
...
пар 15
 
Kara_100, на Ваш вопрос только достаточно абстрактны ответ: события и исходы  - в массивы, перебор с комбинацией вариантов - вложенными циклами
 
Это?
Код
Sub jjj()
Dim arr()
Const sob = 15, ish = 3
ReDim arr(sob - 1, ish - 1)
End Sub
---
Забыл, что нумерация с нуля. Исправил код.
Изменено: JayBhagavan - 16.10.2015 16:00:06

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan,возможно, а как посмотреть результат? По коду сложно понять... Логика вывода результата должна быть такой, прикрепляю пример с меньшим кол-вом переборов (для удобства). (Для 3^15 вывод результатов не потребуется, потребуется дальнейших их отсев опять же с помощью кода, но вот для начала отсева этот набор все же необходимо (по моей логике))
 
Kara_100, для Вашего примера.
Код
Sub jjj()
Dim arr(), arr_sob(), arr_ish()
    arr() = Range("B4:AB6")
    arr_sob() = Range("A4:A6")
    arr_ish() = Range("B3:AB3")
    For r = 1 To UBound(arr, 1)
        For c = 1 To UBound(arr, 2)
            Debug.Print arr(r, c), arr_sob(r, 1), arr_ish(1, c)
        Next c
    Next r
End Sub

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Спасибо большое, буду разбираться! Но вот попробовала подставить этот код в пример и ничего не происходит, хотелось бы потыкаться именно с рабочим макросом, можно это сделать? Я прикрепляю "бланк" и нужно чтобы по запуску макроса заполнилась табличка (ниже я приписала как бы дано, возможно оно и не нужно). Просто с работающим макросом будет понятнее... Спасибо!
 
Код
Sub jjj()
Dim arr(), arr_sob(), arr_ish()
    arr() = Range("B4:AB6")
    arr_sob() = Range("A9:A11")
    arr_ish() = Range("B8:D8")
    r_n = UBound(arr, 1)
    c_n = UBound(arr, 2)
    For r = 1 To r_n
        For c = 1 To c_n
            i_sum = (r - 1) * c_n + c
            arr(r, c) = arr_ish(1, ((i_sum - 1) Mod 3) + 1)
        Next c
    Next r
    Range("B4:AB6") = arr
End Sub

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan,мне вот такое выдал, три варианта повторяющихся все время...
 
Kara_100, какую последовательность Вы задали, так и заполнил массив. Вы же никакого конкретного алгоритма не предоставляли.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan,ну как же... я же хотела как в примере, где представлен полный перебор вариантов... а макрос выдает только три варианта, которые повторяются... (прикрепляю скрин желаемого, это было в примере ранее, который я заполнила от руки)
 
Kara_100, откуда мне знать по какому алгоритму у Вас заполнялась эта таблица?
---
Дошло. Код с ходу не реализую.
Изменено: JayBhagavan - 16.10.2015 17:37:05

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, да, я наверное плохо описала, прошу прощение.. Посижу, потыкаюсь, различные видео уже мало помогают на таком уровне... Спасибо большое за помощь, как никак, а продвигаюсь потихоньку! Может кто еще чем сможет помочь, подсказать..
 
Формула:
=ИНДЕКС($B$9:$XFD$9;0;ОСТАТ(ЦЕЛОЕ((СТОЛБЕЦ()-СТОЛБЕЦ($A:$A)-1)/(СЧЁТЗ($B$9:$XFD$9)^(СЧЁТЗ($A$10:$A$1048576)+СТРОКА($3:$3)-СТРОКА())));СЧЁТЗ($B$9:$XFD$9))+1)
---
Исправил формулу.
Изменено: JayBhagavan - 16.10.2015 18:04:54

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, ого!! ничего себе решение! Спасибо! Попробую с формулой поработать, вдруг и без VBA обойдусь! Надеюсь на это! Вы мне помогли очень!
 
проверьте, вдруг оно...) у самого в глазах рябит от позитивных негативов уже..)
 
yoozhik,да, выглядит правильно! Спасибо!! Но адаптировать этот код под 15 условий будет сложно (3^15 вместо 3^3)? (Пытаюсь разглядеть, что в нем можно поменять для этого).

P.S.: прошу прощение за "негативы", хотела для удобства обозначить как 1,2,3, но потом решила оставить условие задачи с такими параметрами :)
 
адаптировать да, сложновато будет..) если по предложенному алгоритму, то вместо трех переменных прописывать 15 придется и отслеживать когда какую изменить
 
yoozhik,примерно поняла логику, что же, попробую "потыкаться"!  Спасибо..!
 
пример с алгоритмом попроще на 4 варианта. Добавлять проще, чем в первом примере, но 15 условий все равно добавить не выйдет - нет у экселя столько столбцов
 
yoozhik,так сейчас буду разбираться, я очень благодарна за помощь! По поводу 15 условий у меня задача не вывести на экран эти 3^15 переборов, а поработать с ними отсеивая ограничениями ненужные и вывести уже отфильтрованные, поэтому я все же надеюсь задав кодом эти 3^15 вариантов потом кодом же их отсеять (то есть вывода на экран не будет на промежуточном этапе) и получить вполне вменяемую табличку из 300-400 вариантов... Задумка такая....
 
как смог - упростил...) может кто попроще предложит чего...
 
yoozhik,огромное спасибо! на вечер мне работка нашлась уж точно! очень помогли мне! А по поводу 15... даже совету какому то, подсказке буду очень благодарна..
 
в последнем примере для увеличения количества вариантов надо изменить переменную, в которой количество условий, и вместо вывода в ячейки прописать запись в массив
 
yoozhik,имеется ввиду переменная us? вторую часть фразы не совсем поняла... наверное мне было бы понятнее сравнить этот код для трех и для четырех условий, что и как меняется, тогда уже по логике пойму как расширить для других вариантов...
 
для четырех уже готов. для пяти - us=5, x=5+3. (это последняя строка. +3 - первые три пустые). Должно вроде на любом количестве условий сработать. если места хватит.
Вместо вывода - в массив, если возможен массив на 15 строк и 3^14 столбцов
 
yoozhik,ура, для 5 работает!!! Теперь буду пробовать с массивом, сначала посмотрю в интернете материалы на эту тему! вы мне очень помогаете!
 
нужна помощь
вышло следующее:
Код
Sub usl4()
k = 3 'негатив-нейтрал-позитив
Dim arr()
Dim a()
ReDim a(1 To k)
a(1) = "negative"
a(2) = "neutral"
a(3) = "positive"
us = Val(InputBox("сколько вариантов?"))
ReDim arr(1 To us, 1 To k ^ us + 1)
'x = 4 + 3
q = 1

For y = 1 To us
For i = 2 To k ^ us + 1

arr(y, 1) = "усл" & y

For j = i To i + k ^ (us - y) - 1
arr(y, j) = a(q)
Next
If q = 3 Then q = 1 Else q = q + 1
i = i + k ^ (us - y) - 1
Next
Next
v = MsgBox("массив вариантов сформирован. Выгрузить на лист?", vbYesNo)

Select Case v
    Case vbNo: Exit Sub
    Case vbYes
    If k ^ us > Columns.Count Then MsgBox "недостаточно места": Exit Sub
    For l = 1 To us
    For x = 1 To k ^ us + 1
        Cells(l, x).Value = arr(l, x)
    Next
    Next
End Select

End Sub

при количестве варианов 14 - Out of memory на 2003-м. Это без вариантов? или может как-то по другому можно массив записать?
 
Цитата
Kara_100 написал:
выдавать общее кол-во возможных переборов (3^15) исходов эти параметров
Откуда такая формула? Если есть 15 независимых параметров с 3-мя состояниями, то число комбинаций будет 15*3 = 45. Если параметры зависимы, например, составляют последовательность из 15 любых состояний, то число комбинаций такой системы д.б. 15*45.
Или я не прав?
Изменено: TheBestOfTheBest - 17.10.2015 00:08:41 (добавлен файл)
Неизлечимых болезней нет, есть неизлечимые люди.
Страницы: 1 2 След.
Наверх