Друзья! Доброе время суток! Долго думал, как правильно задать вопрос, но пока родился только такой вариант. Наверняка я Вас уже задолбил своим научным проектом, но очень нужна Ваша помощь. Как Вы помните из некоторых моих тем (здесь, здесь), я пытался осуществлять перебор множества параметров модели, чтобы отыскать такую комбинацию параметров (значений факторов), чтобы комплексная оценка соответствовала требуемому значению.
Реализация удалась, однако требуется попробовать и предлагаемый Вами вариант - декомпозиция модели. Но ведь, как обычно, хочется сделать красиво и просто в обращении и максимально автоматизировать.
В чём суть проблемы и вопрос. Пользователь в таблице указывает лишь 1 значение (ссылку на свёртку верхнего уровня). Примерно таблица выгладит так: В столбце "Свёртка" пользователь указывает ячейку со значением свёртки, а дальше Excel определяет, правильно ли он указал и допускает эту строку для расчёта в макросе. Пользователь указывает Свёртку интересующего его верхнего уровня. Я должен разложить всю модель до критериев и как-то записать эту информацию для дальнейшей работы с ней.
Вот в этом самом месте у меня возник вопрос. Как мне хранить в коде столько разнообразной информации о составе модели и её значениях. Модель представляет собой разложение свёртки всегда на 2 компонента. А вот компоненты могут быть как другими свёртками, так и уже критериями. Если свёртка, то она раскладывается на 2 части далее. Структура может получаться весьма сложной. Попробовал от рисовать пример сложной структуры: (надо пояснить, что квадратик - критерий, круг - свёртка)
Попытался ввести как бы кодирование, чтобы было понятно что и зачем и как идёт: Код расшифровывается примерно так: [4.1.к.3.4.с.л.7] Первые три значения описывают положение элемента на картинке Первое значение ([4.1.к.3.4.с.л.7] указывает номер уровня, на котором находится элемент. Уровни на картинке размечены пунктиром и начинаются с 0; Второе значение [4.1.к.3.4.с.л.7] отображает порядковый номер элемента на данном уровне; Третье значение [4.1.к.3.4.с.л.7] указывает тип элемента (к-критерий, с-свёртка (критерий дальше не может раскладываться - крайнее положение по данной ветке)); Вторые три значения описывают привязку элемента к предыдущему: Четвёртое значение [4.1.к.3.4.с.л.7] описывает положение связанного элемента более верхнего уровня на карте; Пятое значение [4.1.к.3.4.с.л.7] указывает порядковый номер в уровне более верхнего элемента; Шестое значение [4.1.к.3.4.с.л.7] указывает тип более верхнего элемента;
Седьмое значение ("л" или "п") указывает на расположение элемента по отношению к верхнему (левый, правый) - [4.1.к.3.4.с.л.7] Восьмое и последнее значение - [4.1.к.3.4.с.л.7] указывает порядковый номер типа элемента среди аналогичных типов. Например, порядковый номер обнаруженной свёртки среди всех свёрток (это необходимо для того, чтобы заносить в отдельные таблицы для критериев и свёрток, предварительно проверяя, есть ли они уже там).
После создания данного классификатора я и повис с двумя вопросами, ответы на которые связаны: 1) Как хранить данные значения. Я полагал, что это должен быть двумерный массив строкового типа, где элемент массива хранит этот сложный код. Тогда возникает вопрос, наверное, что нужен ещё и девятый символ 0/1, который отвечает за указание на то, заполнен ли элемент массива. Правильно ли я мыслю? (поскольку двумерный массив представляет собой квадрат) 2) Как без сложных манипуляций считывать значение между токами в строке. Можно конечно отсекать, наверное, написав предварительно общую функцию... но вот её структуру сообразить не могу... Имеется ввиду, некая функция, в которую будет просто потом вставляться число, описывающее номер позиции в классификаторе и будет выводиться значение. Например, для mass(4, 1) вывести 6 = ответом будет "c". Вывести 8, ответом будет 7, вывести 4, ответом будет 3.
Kirill Gureev написал: чтобы комплексная оценка соответствовала требуемому значению.
не вникаю - звучит, как "подгонометрия"
Цитата
Kirill Gureev написал: 1) Как хранить данные значения.
не понимаю, чем не подходит обыкновенная таблица - верхний уровень - столбец A, два пониже - столбец B и т д (вложенный файл, номера нужные элементы)... и обращаться с ними, как удобно - хоть sql, хоть по ключам словаря или коллекции (не забывать, что ключи бывают составные - состоящие из нескольких полей таблицы), хоть по элементам массива...
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
А как это... подскажите, пожалуйста, где прочитать, вообще, о том, что такое словарь и как с ним работать? Несколько раз здесь встречал такой термин, а дальше не понял ничего. Если бы ещё понять разницу между массивом и словарём - вообще отлично было бы... Спасибо.
CreateObject("Scripting.Dictionary") - в Поиск и разбирать примеры или здесь в общем и целом
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Kirill Gureev написал: понять разницу между массивом и словарём
обращение к значению (Item), по ключу (Key) , а не по номеру элемента в массиве (a(i,1))... ключ может представлять из себя значение поля или нескольких полей таблицы вне зависимости от его месторасположения в массиве - вытягивание из словаря по этому значению (поля или нескольких полей), т.е. по ключу
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Ссылка хорошая, но там есть одно упущение и в связи с этим возможна ошибка - Microsoft не гарантирует соответствие индексов ключей и значений! Всюду в описании встречается такая строка: "Порядок возвращения элементов не определен." Поэтому выгружать лучше ключи и рядом с каждым значение по этому ключу. Хотя бычно работает и так как написано по ссылке - но без гарантий!
P.S. Вот этого не знал... Правда пока не поятно где применить, но может сгодится
Код
XVII Change the key of an item
You can also consider this as a 'replacement' of an item in the Dictionary.
With CreateObject("scripting.dictionary")
.Item("aa") = "this is the first item"
MsgBox .Item("aa")
.Key("aa") = "bb"
MsgBox .Item("bb")
End With
1. Зачем хранить тип элемента верхнего уровня, если это всегда свёртка? 2. Зачем ссылки формировать на основании уровень/позиция_в_уровне? Предлагаю уходить на Dictionary или Collection и работать просто с порядковыми номерами. 3. На что влияет "правый" или "левый"? Нужна ли эта информация? 4. В дополнение к Dictionary и Collection можно ещё освоить классы. После этого каждый узел представить объектом и хранить в словаре/коллекции ссылки на эти объекты. При правильной организации данных и связей между ними Вы можете реально ускорить работу программы.
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)