Решение задачи коммивояжера, как готовое решение опубликовал здесь: http://www.excelworld.ru/forum/3-12090-1 Там есть решение полным перебором, для 12 городов и менее - подходит.
Решение задачи коммивояжера, как готовое решение опубликовал здесь: http://www.excelworld.ru/forum/3-12090-1 Там есть решение полным перебором, для 12 городов и менее - подходит.MCH
Пытаюсь разобраться в Вашем коде На сколько я понял - сначала создается массив с комбинациями, потом идет просчет расстояний. Я добавил в код вывод хода выполнения в статусбар. Получается что дольше всего создается этот самый массив комбинаций. Просчет расстояний в десятки раз быстрее - особенно если выбирать 11-12 городов.
У Вас в коде есть строка перескока по строкам общего массива :[vba]
Код
"i = i + f(n - 1 - j) - 1"
[/vba] Может можно обойтись без массива комбинаций и как-то создавать временный массив на основании текущего положения "I"(формулой)? Пока не нашел решения. Кроме того не будет грузится комп. У меня например на компе хватает оперативки для массива в 49 000 000стр., а на виртуалбоксе - не хватает.
Пытаюсь разобраться в Вашем коде На сколько я понял - сначала создается массив с комбинациями, потом идет просчет расстояний. Я добавил в код вывод хода выполнения в статусбар. Получается что дольше всего создается этот самый массив комбинаций. Просчет расстояний в десятки раз быстрее - особенно если выбирать 11-12 городов.
У Вас в коде есть строка перескока по строкам общего массива :[vba]
Код
"i = i + f(n - 1 - j) - 1"
[/vba] Может можно обойтись без массива комбинаций и как-то создавать временный массив на основании текущего положения "I"(формулой)? Пока не нашел решения. Кроме того не будет грузится комп. У меня например на компе хватает оперативки для массива в 49 000 000стр., а на виртуалбоксе - не хватает.SLAVICK
Нашел на форуме старую тему: [http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=35378] Там Вы делали похожий расчет, который на основании числа выдавал комбинацию... но не совсем то. Мне кажется так будет быстрее.
Нашел на форуме старую тему: [http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=35378] Там Вы делали похожий расчет, который на основании числа выдавал комбинацию... но не совсем то. Мне кажется так будет быстрее.SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Пятница, 15.08.2014, 01:02
Благодаря этой теме нашлось неплохое решение В приложении файл. В зеленой ячейке можно проставить ограничение количества повторений результата. Если число удалить цикл проход будет с 1 до конца комбинаций по большим блокам, потом рядом с большим блоком(в котором было найдено наименьшее расстояние) пробегает по меньшим блокам и т.д. пока не дойдет до наименьшего блока. Для количества комбинаций больше 20 - рекомендую ставить ограничение... можно 100 000 - 1000 000. Можно и больше.... чем больше число тем дольше будет работать функция. Дальше думаю можно было бы как-то подключить случайные числа... вот только не уверен что они помогут... да и с ними результат при повторном результате может быть другим.
Благодаря этой теме нашлось неплохое решение В приложении файл. В зеленой ячейке можно проставить ограничение количества повторений результата. Если число удалить цикл проход будет с 1 до конца комбинаций по большим блокам, потом рядом с большим блоком(в котором было найдено наименьшее расстояние) пробегает по меньшим блокам и т.д. пока не дойдет до наименьшего блока. Для количества комбинаций больше 20 - рекомендую ставить ограничение... можно 100 000 - 1000 000. Можно и больше.... чем больше число тем дольше будет работать функция. Дальше думаю можно было бы как-то подключить случайные числа... вот только не уверен что они помогут... да и с ними результат при повторном результате может быть другим. SLAVICK
Думаю оптимальным будет сделать просчет при помощи связки функций поиска мин расстояния по комбинации просчитанной графическим способом(который предложил МСН) - потом запустить с начальной комбинацией - макрос перебора... таким образом будет быстро и точное расстояние. Поскольку графический способ дает путь по прямой, а перебор берет расстояния из матрицы расстояний. Перебором можно быстро определить близкий к оптимальному маршрут уже сейчас... но так будет точнее... и для больших комбинаций(больше 20) - быстрее.
Думаю оптимальным будет сделать просчет при помощи связки функций поиска мин расстояния по комбинации просчитанной графическим способом(который предложил МСН) - потом запустить с начальной комбинацией - макрос перебора... таким образом будет быстро и точное расстояние. Поскольку графический способ дает путь по прямой, а перебор берет расстояния из матрицы расстояний. Перебором можно быстро определить близкий к оптимальному маршрут уже сейчас... но так будет точнее... и для больших комбинаций(больше 20) - быстрее.SLAVICK