Добрый вечер. Может кто знает как получить или рассчитать формулами(макросом) комбинацию зная ее порядковый номер. Т.е есть номер комбинации, и количество цифр(например 8) - нужно рассчитать комбинацию которая "скрывается" под этим номером (номер = 32000 а комбинация: 7 3 4 6 2 1 8 5). Комбинации могут быть любыми без повторений одинаковых чисел в ряду. Что-то похожее было здесь: [http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=35378] , но там комбинации только по возрастанию. В приложенном примере есть перечень комбинаций для примера(ниже 7-й строки) и в 4-й строке формула для перепроверки результата. Результат нужно получить без использования данных ниже 7-й строки. Макрос для генерации комбинаций взял из соседней темы
Добрый вечер. Может кто знает как получить или рассчитать формулами(макросом) комбинацию зная ее порядковый номер. Т.е есть номер комбинации, и количество цифр(например 8) - нужно рассчитать комбинацию которая "скрывается" под этим номером (номер = 32000 а комбинация: 7 3 4 6 2 1 8 5). Комбинации могут быть любыми без повторений одинаковых чисел в ряду. Что-то похожее было здесь: [http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=35378] , но там комбинации только по возрастанию. В приложенном примере есть перечень комбинаций для примера(ниже 7-й строки) и в 4-й строке формула для перепроверки результата. Результат нужно получить без использования данных ниже 7-й строки. Макрос для генерации комбинаций взял из соседней темы SLAVICK
пробую написать UDF ... пока получилось просчитать номер последовательности . т.е. порядковые номера групп(столбец S) + Частично сами комбинации. но пока по моему алгоритму строится меньше половины(правильно) чувствую что где-то что-то пропустил... не могу найти
пробую написать UDF ... пока получилось просчитать номер последовательности . т.е. порядковые номера групп(столбец S) + Частично сами комбинации. но пока по моему алгоритму строится меньше половины(правильно) чувствую что где-то что-то пропустил... не могу найти SLAVICK
детально файл посмотреть не могу, пишу с телефона. но на вид классические перестановки. по порядковому номеру перестановки можно получить последовательность чисел без вычисления предыдущих перестановок. мое формульное решение было на планете в "избушке формулистов 2". поищите там. если не найдете, то подготовлю пример через неделю
детально файл посмотреть не могу, пишу с телефона. но на вид классические перестановки. по порядковому номеру перестановки можно получить последовательность чисел без вычисления предыдущих перестановок. мое формульное решение было на планете в "избушке формулистов 2". поищите там. если не найдете, то подготовлю пример через неделюMCH
Спасибо Не пришлось изобретать велосипед, но принцип работы такой же как и в моей функции - просто с логическим завершением Есть один недостаток в том файле он создает комбинации перепутано т.е. не в такой последовательности, как мне нужно. т.е. там идет первый столбец :66665666 а должно быть: сначала все 1, потом 2 ...(ну или в обратной последовательности) ... думаю разберусь
Спасибо Не пришлось изобретать велосипед, но принцип работы такой же как и в моей функции - просто с логическим завершением Есть один недостаток в том файле он создает комбинации перепутано т.е. не в такой последовательности, как мне нужно. т.е. там идет первый столбец :66665666 а должно быть: сначала все 1, потом 2 ...(ну или в обратной последовательности) ... думаю разберусь SLAVICK
Т.е. для 6-ти цифр у нас есть 6 уровней (для каждой цифры по уровню): 1.Самый крупный меняется раз в 120 строк и после того как поменялся больше обратно не меняется 2.меняется внутри 1-го каждые 24 строки(т.е по 5 раз) 3.меняется внутри 2-го каждые 6 строки(т.е по 4 раза) 4.меняется внутри 3-го каждые 2 строки(т.е по 3 раза) 5. - 6.й меняется внутри 4-го на каждую строку(чередуются между собой) получается когда исчерпывается "подуровень" - меняется уровень, потом "подуровень" снова изменяется так же как и в предыдущем уровне...
Объяснил как мог Посмотрите файл из моего поста выше - там под 7-й строкой массив данных.(смоделированный Вашим макросом из другой темы) - там четко видна структура. А в файлах, о которых Вы написали немного другая логика... хотя итоговый набор данных будет одинаковый, но для конкретных строк будет разнится. например для строки 351: формулой : 5 6 3 1 2 4 в массиве: 3 6 4 2 1 5
Т.е. для 6-ти цифр у нас есть 6 уровней (для каждой цифры по уровню): 1.Самый крупный меняется раз в 120 строк и после того как поменялся больше обратно не меняется 2.меняется внутри 1-го каждые 24 строки(т.е по 5 раз) 3.меняется внутри 2-го каждые 6 строки(т.е по 4 раза) 4.меняется внутри 3-го каждые 2 строки(т.е по 3 раза) 5. - 6.й меняется внутри 4-го на каждую строку(чередуются между собой) получается когда исчерпывается "подуровень" - меняется уровень, потом "подуровень" снова изменяется так же как и в предыдущем уровне...
Объяснил как мог Посмотрите файл из моего поста выше - там под 7-й строкой массив данных.(смоделированный Вашим макросом из другой темы) - там четко видна структура. А в файлах, о которых Вы написали немного другая логика... хотя итоговый набор данных будет одинаковый, но для конкретных строк будет разнится. например для строки 351: формулой : 5 6 3 1 2 4 в массиве: 3 6 4 2 1 5SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Вторник, 19.08.2014, 23:15
можно написать udf, которая будет перебирать числа в лексиграфическом порядке, т.е. как Вам нужно. если чисел не много (не более 10-11) то можно сгенерировать достаточно быстро все перестановки в нужном порядке. формулой реализован немного другой алгоритм
можно написать udf, которая будет перебирать числа в лексиграфическом порядке, т.е. как Вам нужно. если чисел не много (не более 10-11) то можно сгенерировать достаточно быстро все перестановки в нужном порядке. формулой реализован немного другой алгоритмMCH
Я как раз это и делаю . Вы, наверное, не поняли сути этой затеи. Мне не нужно получить массив итоговых данных(он у меня есть), мне нужно зная номер строки и количество цифр получить комбинацию(не обращаясь к готовому массиву), причем без перебора.С перебором не интересно
Я как раз это и делаю . Вы, наверное, не поняли сути этой затеи. Мне не нужно получить массив итоговых данных(он у меня есть), мне нужно зная номер строки и количество цифр получить комбинацию(не обращаясь к готовому массиву), причем без перебора.С перебором не интересно SLAVICK
Посмотрите пример по определению перестановки чисел по порядковому номеру сделанный на фрмулах, реализовать данный алгоритм в виде UDF не составит труда.
Посмотрите пример по определению перестановки чисел по порядковому номеру сделанный на фрмулах, реализовать данный алгоритм в виде UDF не составит труда.MCH
Ваш код куда меньше того что получился у меня Но у Вас в коде недостаток в том, что есть ограничение на 12 цифр... а у меня нет Просто (объясняю не для Вас, а для тех кто не знает) VBA не очень дружит с функцией mod.... и лучше присваивать цифрам "Double" впрочем это легко исправить.
В моей функции есть 2 режима вывода - текст строка + массив(для формул массива) + можно вывести номер комбинации(также в строке и в массиве).
Правда Ваша формула меньше и шустрее. Моя немного корявая(я ее начал писать до того как увидел файл с формулой), но вроде работает
Ваш код куда меньше того что получился у меня Но у Вас в коде недостаток в том, что есть ограничение на 12 цифр... а у меня нет Просто (объясняю не для Вас, а для тех кто не знает) VBA не очень дружит с функцией mod.... и лучше присваивать цифрам "Double" впрочем это легко исправить.
В моей функции есть 2 режима вывода - текст строка + массив(для формул массива) + можно вывести номер комбинации(также в строке и в массиве).
Правда Ваша формула меньше и шустрее. Моя немного корявая(я ее начал писать до того как увидел файл с формулой), но вроде работает SLAVICK
Но у Вас в коде недостаток в том, что есть ограничение на 12 цифр... а у меня нет
Это ограничение связано с тем, что я использовал у переменных тип Long, поэтому 13! уже не помещается в данный тип переменной, это легко обходится изменением типов.
Для больших чисел это тоже не будет решением проблемы. Так для 18 чисел сможете получить комбинацию № 2432902008176639999, соответствующую числам: 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 1, 2?
Но у Вас в коде недостаток в том, что есть ограничение на 12 цифр... а у меня нет
Это ограничение связано с тем, что я использовал у переменных тип Long, поэтому 13! уже не помещается в данный тип переменной, это легко обходится изменением типов.
Для больших чисел это тоже не будет решением проблемы. Так для 18 чисел сможете получить комбинацию № 2432902008176639999, соответствующую числам: 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 1, 2?MCH
Так для 18 чисел сможете получить комбинацию № 2432902008176639999,
Мой Эксель для фактр(18) выдает "6 402 373 705 728 000", что на порядок меньше чем " 2432902008176639999" (это ближе к 20!). Для числа 20 № 2432902008176639999 = 20|19|18|17|16|15|14|13|12|11|10|9|6|8|5|4|2|1|7|3
Моя функция(и Ваша если сделать то о чем я и Вы написали... т.е. поменять тип переменной) вполне корректно работает с 18!. А вот с более 18 возникают некоторые проблемы... т.е комбинацию выдает, но она почему-то меняется не на каждую единицу . Что же делать с такими цифрами?
Я знаю. Я с этим уже сталкивался, просто написал обо что Ваша функция "спотыкалась" при вводе больших чисел (не для Вас, а для тех, кто захотел бы ее использовать) . Я например использовал Int(или WorksheetFunction.RoundDown) вместо Fix
О форме вывода даже не заморачивался, сделал самое простое. Думаю, что в данной задаче более важен алгоритм, а не форма вывода.
Вы правы - это не важно. Я не хотел сказать, что Ваша функция хуже или лучше ... просто я писал свою функцию(не видя Вашей) для себя, и выложил как второй вариант решения проблемы.
Тогда, тема не закрыта... Как же сделать так чтобы правильно работало и с цифрами более 20!?
Так для 18 чисел сможете получить комбинацию № 2432902008176639999,
Мой Эксель для фактр(18) выдает "6 402 373 705 728 000", что на порядок меньше чем " 2432902008176639999" (это ближе к 20!). Для числа 20 № 2432902008176639999 = 20|19|18|17|16|15|14|13|12|11|10|9|6|8|5|4|2|1|7|3
Моя функция(и Ваша если сделать то о чем я и Вы написали... т.е. поменять тип переменной) вполне корректно работает с 18!. А вот с более 18 возникают некоторые проблемы... т.е комбинацию выдает, но она почему-то меняется не на каждую единицу . Что же делать с такими цифрами?
Я знаю. Я с этим уже сталкивался, просто написал обо что Ваша функция "спотыкалась" при вводе больших чисел (не для Вас, а для тех, кто захотел бы ее использовать) . Я например использовал Int(или WorksheetFunction.RoundDown) вместо Fix
О форме вывода даже не заморачивался, сделал самое простое. Думаю, что в данной задаче более важен алгоритм, а не форма вывода.
Вы правы - это не важно. Я не хотел сказать, что Ваша функция хуже или лучше ... просто я писал свою функцию(не видя Вашей) для себя, и выложил как второй вариант решения проблемы.
Тогда, тема не закрыта... Как же сделать так чтобы правильно работало и с цифрами более 20!?SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Вторник, 26.08.2014, 00:59
На стандартных типах можно расчитать до 27! Для бОльших чисел нужно использовать длинную арифметику. Только возникает вопрос, зачем нужны такие большие числа?
На стандартных типах можно расчитать до 27! Для бОльших чисел нужно использовать длинную арифметику. Только возникает вопрос, зачем нужны такие большие числа?MCH
Спасибо. Мы с Вами общались в другой теме. по оптимизации маршрута. У меня возникла мысль делать не просто перебор, а обращаться к комбинации... Я уже немного изменил там код... прохожу сначала по большим секциям... потом там где было найдено найменьшее значение - прохожу по меньшей секции и +- одна секция ... и.т.д. Результат получается не всегда 100% попадание, но маршрут уменьшает почти до минимума(из 12149 до 8138 против 8041) Больше описывать не буду - модераторы забанят Напишу только что у меня уже получается работать там с количеством больше 20 точек... достаточно быстро(менее минуты.)
Спасибо. Мы с Вами общались в другой теме. по оптимизации маршрута. У меня возникла мысль делать не просто перебор, а обращаться к комбинации... Я уже немного изменил там код... прохожу сначала по большим секциям... потом там где было найдено найменьшее значение - прохожу по меньшей секции и +- одна секция ... и.т.д. Результат получается не всегда 100% попадание, но маршрут уменьшает почти до минимума(из 12149 до 8138 против 8041) Больше описывать не буду - модераторы забанят Напишу только что у меня уже получается работать там с количеством больше 20 точек... достаточно быстро(менее минуты.)SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Вторник, 26.08.2014, 16:07
но маршрут уменьшает почти до минимума(из 12149 до 8138 против 8041)
Дайте пример данных, интересно самому потестировать
Думаю, что решение через перебор - тупиковое. Нужно рассмотреть другие алгоритмы решения задачи коммивояжера, например метод ветвей и границ (метод Литтла).
но маршрут уменьшает почти до минимума(из 12149 до 8138 против 8041)
Дайте пример данных, интересно самому потестировать
Думаю, что решение через перебор - тупиковое. Нужно рассмотреть другие алгоритмы решения задачи коммивояжера, например метод ветвей и границ (метод Литтла).MCH