Друзья. Я что-то растерялся и не знаю в какую сторону копать. Прошу Вас подсказать, возможно с примерами.
У меня есть лист, на котором очень сложными формулами и хитростями многоуровнево производится расчёт конечного значения модели (это не суть, но значимый элемент, как мне кажется, в постановке проблемы). Т.е. я не могу произвести обратный расчёт по этим формула. Я лишь могу подставлять данные в модель, смотреть результат и определять устраивает ли он меня или нет.
Теперь сама история:
Бинарный поиск в n-мерном массиве
Пусть модель рассчитывается на основе n числа факторов, определяющих значение комплексной оценки. Каждый фактор изменяется в диапазоне min(n) и max(n). Причём для каждого из факторов данные значения индивидуальный. Таким образом массив имеет вид array(min(1):max(1);…;min(n):max(n)). Массивы отсортированы в порядке возрастания. Шаг изменения отдельного фактора также отличается для каждого (step n).
Простой перебор всех значений модели и поиск нужного значения – весьма ресурсоёмкая и затратная по времени операция, поскольку, например:
- min и max не ограничены;
- step может достигать 0,01;
- количество факторов n также не ограничено.
Что я пытался сделать и что не получилось
Сначала я хотел последовательно перебрать все значения модели, отследить значение комплексной оценки и, если оно меня удовлетворяет, занести его в таблицу подходящих для меня комбинаций значений факторов. (МНЕ, в конечном счёте, НУЖНО ВЫВЕСТИ ВСЕ ВОЗМОЖНЫЕ КОМБИНАЦИИ ФАКТОРОВ, ПРИ КОТОРЫХ КОМПЛЕКСНАЯ ОЦЕНКА БУДЕТ УДОВЛЕТВОРЯТЬ ЗАДАННОМУ УСЛОВИЮ).
Когда я просчитал количество возможных комбинаций и запустил макрос, то мой копм несчастно заныл и повис.
Количество комбинаций весьма значительно. Например, если принять, что модели задействовано всего 5 факторов, а их минимальные и максимальные значения совпадают и равны, соответственно 1 и 4, а также у них совпадает шаг расчёта и равен 0,01, то примерный подсчёт количества возможных комбинаций просто ошеломляет. Потому вариант последовательного перебора в моём случае, просто не выполним.
Какой мне видится вариант решения и я не знаю как его реализовать
Или в школе или в ВУЗе ещё при изучении pascal делали мы в качестве курсовой работы "метод половинного деления" (так его препод называла). Насколько я прочитал в сети - "метод бинарного поиска". Суть, как я помню, в том, что мы проверяем интервалы и если конечное значение функции в проверяемом интервале лежит между полученными интервальными значениями функции, то мы начинаем сужать диапазон и уточнять значения. Когда диапазон становился совсем небольшим, то мы просто перебирали в пределах этого маленького диапазона.
Как мне кажется, в моей проблеме этот вариант подходит.
Необходимо отметить, что для решения задачи мы предполагаем, что рост отдельного фактора на фоне остальных, может вызывать как рост комплексной оценки, так и не влиять на неё, так и уменьшать её.
Чего мне надо (чем помочь)
Если любезная публика не откажется, то мне бы хотелось увидеть алгоритм и код (или что-то), которые позволили бы мне решить эту страшную задачку и при этом, чтобы моя машина выжила...
Вот как-то так... прошу Вашей подсказки и помощи.
У меня есть лист, на котором очень сложными формулами и хитростями многоуровнево производится расчёт конечного значения модели (это не суть, но значимый элемент, как мне кажется, в постановке проблемы). Т.е. я не могу произвести обратный расчёт по этим формула. Я лишь могу подставлять данные в модель, смотреть результат и определять устраивает ли он меня или нет.
Теперь сама история:
Бинарный поиск в n-мерном массиве
Пусть модель рассчитывается на основе n числа факторов, определяющих значение комплексной оценки. Каждый фактор изменяется в диапазоне min(n) и max(n). Причём для каждого из факторов данные значения индивидуальный. Таким образом массив имеет вид array(min(1):max(1);…;min(n):max(n)). Массивы отсортированы в порядке возрастания. Шаг изменения отдельного фактора также отличается для каждого (step n).
Простой перебор всех значений модели и поиск нужного значения – весьма ресурсоёмкая и затратная по времени операция, поскольку, например:
- min и max не ограничены;
- step может достигать 0,01;
- количество факторов n также не ограничено.
Что я пытался сделать и что не получилось
Сначала я хотел последовательно перебрать все значения модели, отследить значение комплексной оценки и, если оно меня удовлетворяет, занести его в таблицу подходящих для меня комбинаций значений факторов. (МНЕ, в конечном счёте, НУЖНО ВЫВЕСТИ ВСЕ ВОЗМОЖНЫЕ КОМБИНАЦИИ ФАКТОРОВ, ПРИ КОТОРЫХ КОМПЛЕКСНАЯ ОЦЕНКА БУДЕТ УДОВЛЕТВОРЯТЬ ЗАДАННОМУ УСЛОВИЮ).
Когда я просчитал количество возможных комбинаций и запустил макрос, то мой копм несчастно заныл и повис.
Количество комбинаций весьма значительно. Например, если принять, что модели задействовано всего 5 факторов, а их минимальные и максимальные значения совпадают и равны, соответственно 1 и 4, а также у них совпадает шаг расчёта и равен 0,01, то примерный подсчёт количества возможных комбинаций просто ошеломляет. Потому вариант последовательного перебора в моём случае, просто не выполним.
Какой мне видится вариант решения и я не знаю как его реализовать
Или в школе или в ВУЗе ещё при изучении pascal делали мы в качестве курсовой работы "метод половинного деления" (так его препод называла). Насколько я прочитал в сети - "метод бинарного поиска". Суть, как я помню, в том, что мы проверяем интервалы и если конечное значение функции в проверяемом интервале лежит между полученными интервальными значениями функции, то мы начинаем сужать диапазон и уточнять значения. Когда диапазон становился совсем небольшим, то мы просто перебирали в пределах этого маленького диапазона.
Как мне кажется, в моей проблеме этот вариант подходит.
Необходимо отметить, что для решения задачи мы предполагаем, что рост отдельного фактора на фоне остальных, может вызывать как рост комплексной оценки, так и не влиять на неё, так и уменьшать её.
Чего мне надо (чем помочь)
Если любезная публика не откажется, то мне бы хотелось увидеть алгоритм и код (или что-то), которые позволили бы мне решить эту страшную задачку и при этом, чтобы моя машина выжила...
Вот как-то так... прошу Вашей подсказки и помощи.