Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Поиск максимального числа комбинаций пар чисел - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск максимального числа комбинаций пар чисел (Макросы/Sub)
Поиск максимального числа комбинаций пар чисел
Rakhot Дата: Среда, 08.10.2014, 21:04 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый вечер!
На работе возникла следующая задача: имеется набор тиглей и крышек с разными массами. Для выполнения анализа необходимо из этих наборов найти 2 пары "тигель-крышка", такие что суммарная масса пар отличается не более чем на величину допуска (скажем 0,2 мг). Точнее для более эффективной работы требуется найти максимальное количество таких пар, которое можно образовать из предоставленного набора тиглей и крышек.
Как я попытался решить задачу:
1. складываю массы тигля и крышки для всех сочетаний "тигель-крышка"
2. формирую массив с данными о номерах тигля и крышки, их массах и суммарной массе
3. пробегаюсь по массиву и сравниваю разницу между суммарными массами "тигель-крышка" с допуском, при этом ввожу условие, что в найденных парах должны быть разные тигли и крышки
4. получаю итоговый массив из всех возможных комбинаций. Но остается проблема выбора максимального числа строк из этого массива, таких, что они не содержат одинаковых номеров тиглей и крышек.
Попытался решить данную проблему путем рекурсивной функции, но Excel зависает по причине переполнения стека - либо не хватает памяти либо я что-то коряво написал (VBA только начал изучать, сам я не программист). Помогите, пожалуйста, решить данную проблему или предложите другой метод решения.
К сообщению приложен файл: TA-couples_calc.xls (62.0 Kb)


Сообщение отредактировал Rakhot - Среда, 08.10.2014, 21:05
 
Ответить
СообщениеДобрый вечер!
На работе возникла следующая задача: имеется набор тиглей и крышек с разными массами. Для выполнения анализа необходимо из этих наборов найти 2 пары "тигель-крышка", такие что суммарная масса пар отличается не более чем на величину допуска (скажем 0,2 мг). Точнее для более эффективной работы требуется найти максимальное количество таких пар, которое можно образовать из предоставленного набора тиглей и крышек.
Как я попытался решить задачу:
1. складываю массы тигля и крышки для всех сочетаний "тигель-крышка"
2. формирую массив с данными о номерах тигля и крышки, их массах и суммарной массе
3. пробегаюсь по массиву и сравниваю разницу между суммарными массами "тигель-крышка" с допуском, при этом ввожу условие, что в найденных парах должны быть разные тигли и крышки
4. получаю итоговый массив из всех возможных комбинаций. Но остается проблема выбора максимального числа строк из этого массива, таких, что они не содержат одинаковых номеров тиглей и крышек.
Попытался решить данную проблему путем рекурсивной функции, но Excel зависает по причине переполнения стека - либо не хватает памяти либо я что-то коряво написал (VBA только начал изучать, сам я не программист). Помогите, пожалуйста, решить данную проблему или предложите другой метод решения.

Автор - Rakhot
Дата добавления - 08.10.2014 в 21:04
doober Дата: Четверг, 09.10.2014, 02:25 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Какой порядок количества крышек и тиглей?
От этого зависит алгоритм и инструмент обработки


 
Ответить
СообщениеКакой порядок количества крышек и тиглей?
От этого зависит алгоритм и инструмент обработки

Автор - doober
Дата добавления - 09.10.2014 в 02:25
Rakhot Дата: Четверг, 09.10.2014, 04:40 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Какой порядок количества крышек и тиглей?

В данный момент 10 тиглей и 5 крышек, будет порядка нескольких десятков тиглей и в районе 10 крышек.
 
Ответить
Сообщение
Какой порядок количества крышек и тиглей?

В данный момент 10 тиглей и 5 крышек, будет порядка нескольких десятков тиглей и в районе 10 крышек.

Автор - Rakhot
Дата добавления - 09.10.2014 в 04:40
AndreTM Дата: Четверг, 09.10.2014, 12:51 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Можно, например, так, как в примере.
Там, по идее, именно ваш алгоритм (п. 1-3 (берем полный набор пар, сортируем по массе, проверяем каждую массу, сравнивая со всеми соседними массами в дельта-окрестности, пишем нужные наборы в результат)), только в массив-результат сразу пишутся именно разные наборы пар (вернее, их номера-ссылки), причем сразу же исключается дублирование наборов (н1~=н2 <=> н2~=н1). Ну и затем ещё дополнительно выполняется сортировка результата уже по номерам самих вещей... Также, можно было бы в результат aR() писать не ссылки на номера в aM(), а сами наборы пар, - но так сделано в целях экономии ресурсов :)
К сообщению приложен файл: 10-13463-1-2.xls (98.0 Kb)


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Четверг, 09.10.2014, 14:17
 
Ответить
СообщениеМожно, например, так, как в примере.
Там, по идее, именно ваш алгоритм (п. 1-3 (берем полный набор пар, сортируем по массе, проверяем каждую массу, сравнивая со всеми соседними массами в дельта-окрестности, пишем нужные наборы в результат)), только в массив-результат сразу пишутся именно разные наборы пар (вернее, их номера-ссылки), причем сразу же исключается дублирование наборов (н1~=н2 <=> н2~=н1). Ну и затем ещё дополнительно выполняется сортировка результата уже по номерам самих вещей... Также, можно было бы в результат aR() писать не ссылки на номера в aM(), а сами наборы пар, - но так сделано в целях экономии ресурсов :)

Автор - AndreTM
Дата добавления - 09.10.2014 в 12:51
Rakhot Дата: Четверг, 09.10.2014, 18:26 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Спасибо за алгоритм, он компактнее моего, но функционал один и тот же - у меня также стоит исключение дублей крышек и тиглей в наборе. Изменение допуска на дельту (расчет плюс-дельты) в вашем алгоритме действительно полезно, я об этом и не задумывался, исправлю у себя.
Но основной вопрос - как из полученного набора всех возможных пар выбрать максимальное количество, такое, что в этом оставшемся наборе каждый из тиглей и крышек будет встречаться не более одного раза.
Может я не совсем понятно объясняю, я имею в виду следующее: и ваш и мой код производят некий набор всех подходящих пар. Берем, к примеру, первую пару (1тигель+1крышка и 2тигель+5крышка). Затем мы должны удалить из набора все пары, в которых встречаются 1 и/или 2 тигель и 1 и/или 5 крышка. Затем из оставшегося набора фиксируем опять какую-нибудь пару и удаляем все пары, содержащие тигли и крышки выбранной нами пары. И так до тех пор, пока в оставшемся наборе каждый из тиглей и крышек будет встречаться не более одного раза.
Если на каждом этапе проверки набора фиксировать, например, первую пару, не факт, что найденное количество пар будет максимально возможным. Надо видимо как-то либо проверить все возможные варианты либо искать другой путь. В этом, собственно, мое затруднение, не знаю, как даже и подступиться к ней.
 
Ответить
СообщениеСпасибо за алгоритм, он компактнее моего, но функционал один и тот же - у меня также стоит исключение дублей крышек и тиглей в наборе. Изменение допуска на дельту (расчет плюс-дельты) в вашем алгоритме действительно полезно, я об этом и не задумывался, исправлю у себя.
Но основной вопрос - как из полученного набора всех возможных пар выбрать максимальное количество, такое, что в этом оставшемся наборе каждый из тиглей и крышек будет встречаться не более одного раза.
Может я не совсем понятно объясняю, я имею в виду следующее: и ваш и мой код производят некий набор всех подходящих пар. Берем, к примеру, первую пару (1тигель+1крышка и 2тигель+5крышка). Затем мы должны удалить из набора все пары, в которых встречаются 1 и/или 2 тигель и 1 и/или 5 крышка. Затем из оставшегося набора фиксируем опять какую-нибудь пару и удаляем все пары, содержащие тигли и крышки выбранной нами пары. И так до тех пор, пока в оставшемся наборе каждый из тиглей и крышек будет встречаться не более одного раза.
Если на каждом этапе проверки набора фиксировать, например, первую пару, не факт, что найденное количество пар будет максимально возможным. Надо видимо как-то либо проверить все возможные варианты либо искать другой путь. В этом, собственно, мое затруднение, не знаю, как даже и подступиться к ней.

Автор - Rakhot
Дата добавления - 09.10.2014 в 18:26
doober Дата: Четверг, 09.10.2014, 18:30 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Отобрал руками.
Правильно ли я выделил то,что надо из набора удалить?
Если правильно понял,то напишу макрос.
К сообщению приложен файл: 3909855.xls (61.5 Kb)




Сообщение отредактировал doober - Четверг, 09.10.2014, 18:31
 
Ответить
СообщениеОтобрал руками.
Правильно ли я выделил то,что надо из набора удалить?
Если правильно понял,то напишу макрос.

Автор - doober
Дата добавления - 09.10.2014 в 18:30
Rakhot Дата: Четверг, 09.10.2014, 19:03 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Нет, не то. В файле пометил красным те пары, которые из набора надо удалить на первом этапе, т.к. они содержат тигли и крышки из первого найденного набора (первой строки). Желтым - те пары, ктотрые надо удалить на 2 этапе, т.к. они содержат тигли и крышки из второго найденного набора (из тех элементов, которые остались не помеченными красным).
Причем это весьма условно, что мы отбираем изначально первую пару, возможно в каких-то случаях (при других количествах тиглей и крышек) таким путем не получим максимальное количество пар.
Возникла некоторая путаница - под "парой" подразумевался набор "пара№1"+"пара№2" (в терминах моего файла), я неверно выбрал название.
К сообщению приложен файл: 9861515.xls (56.5 Kb)


Сообщение отредактировал Rakhot - Четверг, 09.10.2014, 19:04
 
Ответить
СообщениеНет, не то. В файле пометил красным те пары, которые из набора надо удалить на первом этапе, т.к. они содержат тигли и крышки из первого найденного набора (первой строки). Желтым - те пары, ктотрые надо удалить на 2 этапе, т.к. они содержат тигли и крышки из второго найденного набора (из тех элементов, которые остались не помеченными красным).
Причем это весьма условно, что мы отбираем изначально первую пару, возможно в каких-то случаях (при других количествах тиглей и крышек) таким путем не получим максимальное количество пар.
Возникла некоторая путаница - под "парой" подразумевался набор "пара№1"+"пара№2" (в терминах моего файла), я неверно выбрал название.

Автор - Rakhot
Дата добавления - 09.10.2014 в 19:03
AndreTM Дата: Четверг, 09.10.2014, 20:06 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
получим максимальное количество пар
А, теперь понял, что вы пытались донести до нас в п.4 :)
Счас подумаем над математикой...

Дополнено...
Пример прилагаю. Привираю немного в алгоритме, конечно, :) - на нетипичных наборах данных может начать глючить.
По идее, правильнее было бы второй этап анализа сделать рекурсией - но я снова пожалел ресурсы :)

По ходу возник вопрос - надо найти хотя бы одно решение (максимальный набор пар), или же все возможные решения?
К сообщению приложен файл: 10-13463-1-3.xls (91.0 Kb)


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Четверг, 09.10.2014, 22:30
 
Ответить
Сообщение
получим максимальное количество пар
А, теперь понял, что вы пытались донести до нас в п.4 :)
Счас подумаем над математикой...

Дополнено...
Пример прилагаю. Привираю немного в алгоритме, конечно, :) - на нетипичных наборах данных может начать глючить.
По идее, правильнее было бы второй этап анализа сделать рекурсией - но я снова пожалел ресурсы :)

По ходу возник вопрос - надо найти хотя бы одно решение (максимальный набор пар), или же все возможные решения?

Автор - AndreTM
Дата добавления - 09.10.2014 в 20:06
Rakhot Дата: Пятница, 10.10.2014, 04:47 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Вот и я попробовал сделать рекурсией - не хватило системных ресурсов :)
Необходимо найти хотя бы одно решение - максимально большой набор пар.
Проверил - все работает! На работе проверю на другом наборе тиглей и крышек, большего количества.
Спасибо огромное за помощь, теперь буду медитировать над кодом, чтобы осознать, как и что он делает :)


Сообщение отредактировал Rakhot - Пятница, 10.10.2014, 09:39
 
Ответить
СообщениеВот и я попробовал сделать рекурсией - не хватило системных ресурсов :)
Необходимо найти хотя бы одно решение - максимально большой набор пар.
Проверил - все работает! На работе проверю на другом наборе тиглей и крышек, большего количества.
Спасибо огромное за помощь, теперь буду медитировать над кодом, чтобы осознать, как и что он делает :)

Автор - Rakhot
Дата добавления - 10.10.2014 в 04:47
AndreTM Дата: Пятница, 10.10.2014, 14:19 | Сообщение № 10
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
буду медитировать над кодом, чтобы осознать, как и что он делает
Во второй части анализа тоже ничего особо сложного :)

К сообщению приложен файл: 10-13463-1-3a.xls (92.5 Kb)


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Пятница, 10.10.2014, 14:24
 
Ответить
Сообщение
буду медитировать над кодом, чтобы осознать, как и что он делает
Во второй части анализа тоже ничего особо сложного :)


Автор - AndreTM
Дата добавления - 10.10.2014 в 14:19
Rakhot Дата: Пятница, 10.10.2014, 16:42 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Спасибо за пояснения, логика понятна, сижу разбираю синтаксис, ибо я пока что в VBA чайник - только начал изучать, когда решил как-то упростить себе и коллегам жизнь на работе :)
 
Ответить
СообщениеСпасибо за пояснения, логика понятна, сижу разбираю синтаксис, ибо я пока что в VBA чайник - только начал изучать, когда решил как-то упростить себе и коллегам жизнь на работе :)

Автор - Rakhot
Дата добавления - 10.10.2014 в 16:42
MCH Дата: Пятница, 10.10.2014, 18:08 | Сообщение № 12
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

В решении AndreTM не разбирался, решил сам попробовать.
Сделал выборку руками, отметил желтым цветом.

Я правильно понял, что нужно примерно подобный выбор сделать?
Если да, то нужно подумать над алгоритмом.
К сообщению приложен файл: _TA-couples_cal.xls (58.0 Kb)
 
Ответить
СообщениеВ решении AndreTM не разбирался, решил сам попробовать.
Сделал выборку руками, отметил желтым цветом.

Я правильно понял, что нужно примерно подобный выбор сделать?
Если да, то нужно подумать над алгоритмом.

Автор - MCH
Дата добавления - 10.10.2014 в 18:08
Rakhot Дата: Пятница, 10.10.2014, 18:38 | Сообщение № 13
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Да, примерно то. Только у вас отмечен один набор, соответствующий критерию "разность масс не более дельта", а конечная цель - найти максимальное количество таких наборов, чтобы в них каждый тигель и крышка появлялись не более 1 раза. Т.е. для данного случая с 5 крышками таких наборов максимум 2.
 
Ответить
СообщениеДа, примерно то. Только у вас отмечен один набор, соответствующий критерию "разность масс не более дельта", а конечная цель - найти максимальное количество таких наборов, чтобы в них каждый тигель и крышка появлялись не более 1 раза. Т.е. для данного случая с 5 крышками таких наборов максимум 2.

Автор - Rakhot
Дата добавления - 10.10.2014 в 18:38
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск максимального числа комбинаций пар чисел (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!