Страницы: 1
RSS
Вопрос, скорее, организации данных и хранения их в массиве(ах) текстового типа и вытаскивания отдельных значений из текстовых значений
 
Друзья! Доброе время суток!
Долго думал, как правильно задать вопрос, но пока родился только такой вариант.
Наверняка я Вас уже задолбил своим научным проектом, но очень нужна Ваша помощь.
Как Вы помните из некоторых моих тем (здесь, здесь), я пытался осуществлять перебор множества параметров модели, чтобы отыскать такую комбинацию параметров (значений факторов), чтобы комплексная оценка соответствовала требуемому значению.

Реализация удалась, однако требуется попробовать и предлагаемый Вами вариант - декомпозиция модели.
Но ведь, как обычно, хочется сделать красиво и просто в обращении и максимально автоматизировать.


В чём суть проблемы и вопрос.
Пользователь в таблице указывает лишь 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 - 20.07.2016 21:52:37
 
Цитата
Kirill Gureev написал: чтобы комплексная оценка соответствовала требуемому значению.
не вникаю - звучит, как "подгонометрия"  8)
Цитата
Kirill Gureev написал: 1) Как хранить данные значения.
не понимаю, чем не подходит обыкновенная таблица - верхний уровень - столбец A, два пониже - столбец B и т д (вложенный файл, номера нужные элементы)... и обращаться с ними, как удобно - хоть sql, хоть по ключам словаря или коллекции (не забывать, что ключи бывают составные - состоящие из нескольких полей таблицы), хоть по элементам массива...
Изменено: JeyCi - 20.07.2016 21:58:37
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал: не понимаю, чем не подходит обыкновенная таблица
Предложенная таблица не отражает всей той информации, которую я попытался описать.
Цитата
JeyCi написал: хоть по ключам словаря
А как это... подскажите, пожалуйста, где прочитать, вообще, о том, что такое словарь и как с ним работать?
Несколько раз здесь встречал такой термин, а дальше не понял ничего.
Если бы ещё понять разницу между массивом и словарём - вообще отлично было бы...
Спасибо.
 
Цитата
Kirill Gureev написал: о том, что такое словарь
CreateObject("Scripting.Dictionary") - в Поиск и разбирать примеры
или здесь в общем и целом
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
Kirill Gureev написал: понять разницу между массивом и словарём
обращение к значению (Item), по ключу (Key) , а не по номеру элемента в массиве (a(i,1))... ключ может представлять из себя значение поля или нескольких полей таблицы вне зависимости от его месторасположения в массиве - вытягивание из словаря по этому значению (поля или нескольких полей), т.е. по ключу
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Тут есть четырёхэтажный словарь (пример в файле):
http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=79868&TITLE_SEO=79868-mozhet-li-...
 
Видимо нужно почитать.... возможно возникнут дополнительные вопросы.
Спасибо.
 
Сохраняю для себя ссылку или кому это ещё понадобится о подробном изложении на данную тему.
 
Ссылка хорошая, но там есть одно упущение и в связи с этим возможна ошибка - 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

Взял тут: http://www.snb-vba.eu/VBA_Dictionary_en.html
Изменено: Hugo - 20.07.2016 23:30:25
 
Цитата
Kirill Gureev написал:
Дайте, пожалуйста, какие-то свежие мысли!
1. Зачем хранить тип элемента верхнего уровня, если это всегда свёртка?
2. Зачем ссылки формировать на основании уровень/позиция_в_уровне? Предлагаю уходить на Dictionary или Collection и работать просто с порядковыми номерами.
3. На что влияет "правый" или "левый"? Нужна ли эта информация?
4. В дополнение к Dictionary и Collection можно ещё освоить классы. После этого каждый узел представить объектом и хранить в словаре/коллекции ссылки на эти объекты. При правильной организации данных и связей между ними Вы можете реально ускорить работу программы.
 
Цитата
Skif-F написал: можно ещё освоить классы
Тогда сразу вопрос... а где весьма подробно изучить эту тему?
Спасибо.
 
Где-нибудь там
 
Kirill Gureev. возможно, вас заинтересуют статьи подобного рода... просто случайно наткнулась... вникать не готова... оставляю линк (можете, наверно, и в google подобный запрос делать - если ваша ситуация требует таких усложнений)... или просто для инфо...
Подходы к обработке больших потоков информации при проектировании информационных систем
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1
Наверх