Задача мин-ции пути сверлильного станка с чпу или ЗК[РЕШЕНО]

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
Сообщения: 423
Зарегистрирован: 24 апр 2011, 09:14
Репутация: 72
Откуда: планета Земля
Контактная информация:

Задача мин-ции пути сверлильного станка с чпу или ЗК[РЕШЕНО]

Сообщение Гармонист »

по следам темы оптимизации

Помогите решить задачу минимизации пути сверлильного станка с чпу или Задачу Комивояжера.

Зачем это нужно и как это связано с чпу

Сейчас написал новый функционал в image2gcode который:
находит узкие и глубокие места в рельефе,
в которые не пролезла толстая фреза при черновом проходе,
и делает по этим местам ж-код для тонкой фрезы с постепенным заглублением,
чтобы при чистовом проходе в этих местах не поломалась фреза(у меня уже одна сломалась).
Альтернативой этому режиму это послойно пройти весь рисунок, но это так много лишних движений, что терпения никакого не хватит.
получилось вот что:
места где не пролазит черновая фреза более чем на 3мм.png (2025 просмотров) <a class='original' href='./download/file.php?id=14412&mode=view' target=_blank>Загрузить оригинал (12.06 КБ)</a>
фреза 5мм прямая, отступ 1мм, шаг 5 строк, размер точки 0.35мм, участки где фреза не дошла более 3мм
рисунок:
рамка GrayScale.jpg (2022 просмотра) <a class='original' href='./download/file.php?id=14415&mode=view' target=_blank>Загрузить оригинал (110.54 КБ)</a>

Как вы видите: много узких мест, которые нужно обработать.
Каждое узкое место(участок) имеет точку входа(фреза входит в заготовку) и точку выхода(фреза выходит из заготовки, чтобы переместиться к следующему участку) и синии линии перемещениями между участами.

Описание задачи:

как вы видите: перемещения между участами - не оптимальные. Если сложить длины всех синих линии в единый путь - получится суммарный путь холостого хода.
Этот путь нужно уменьшить.

Для упрошения предлагаю строить путь холостого хода используя лишь точки входа, а точки выхода опустить.

Перефразируя: имеется БОЛЬШОЙ массив точек, заданных координатами x и y. Все точки последовательно соединяются отрезками. Нужно минимизировать общую длину отрезков.

Еще перефразирую: турист решил обойти 100 городов и перед этим решил нарисовать маршрут. Перед туристом стоит задача - минимизировать общий путь.
Очевидно что чтобы построить одщий минимальный путь. нужно от текущей точки сначала найти длины от неё до всех точек!!!. а потом из этих длин найти минимальный. Перейти в точку №2. Повторить цикл.

Очевидно. что этот алгоритм будет работать оооочень долго!
Кто может предложить более оптимальный алгоритм?

PS: не нужно слать меня в гугл, т.к. я только оттуда.
Решение: (для просмотра содержимого нажмите на ссылку)
mas_p - словарь хранящий доступные точки.
"Жадный" алгоритм при помощи квадратной волны ищет ближайшую точку на картинке размером max_y, max_x среди доступных точек(mas_p).

Код: Выделить всё

    def find_next_e(self, mas_p,y1,x1,max_y,max_x):
        max_ = max(max_y,max_x)

        i = 0
        if prn_detal > 1: print("start the search next entry from [",y1,x1,"]")

        while True:

            if i > max_:
                if prn_detal > -1: print("BREAK: LOGIK ERROR(0): ",i)
                break

            ww2 = {}
            i = i + 1

            #  _____
            # |     |
            # |  *  |
            # |_____|
            xrang_r  = xrange(max(x1-i  ,0),     min(x1+i+1,max_x+1)     )
            xrang_l  = xrange(min(x1+i,max_x),   max(x1-i-1,-1),       -1)
            yrang_up = xrange(max(y1-i+1,0),     min(y1+i  ,max_y+1)     )
            yrang_dn = xrange(min(y1+i-1,max_y), max(y1-i  ,-1),       -1)

            num = 0
            if y1-i >= 0:
                for m in xrang_r:
                    num = num + 1
                    ww2[num] = (y1-i,m)
            if x1+i <= max_x:
                for m in yrang_up:
                    num = num + 1
                    ww2[num] = (m,x1+i)
            if y1+i <= max_y:
                for m in xrang_l:
                    num = num + 1
                    ww2[num] = (y1+i,m)
            if x1-i >= 0:
                for m in yrang_dn:
                    num = num + 1
                    ww2[num] = (m,x1-i)


            if len(ww2) == 0:
                if prn_detal > -1: 
                    print("BREEEEEAK: LOGIK ERROR(!): ",i,len(mas_p),max_x,max_y,y1-i,y1+i,x1-i,x1+i)
                    print(mas_p)
                    #print(ww2)                
                break

            # cheking
            tmm = ww2.keys()
            tmm.sort()
            for num in tmm:
                y,x = ww2[num]
                try:
                    m = mas_p[y,x]
                    if prn_detal > 2: print(" find next entry in [",y,x,"] obj: ",m," iter: ",i)
                    return y,x    #УРА НАШЛИ!
                except KeyError:
                    m = 0

        return y1,x1
результат Изображение
Последний раз редактировалось Гармонист 23 июл 2015, 12:19, всего редактировалось 2 раза.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Задача минимизации пути

Сообщение Serg »

Думаю этот алгоритм будет работать всё-же меньше, чем фреза носится над столом. :)

Можно оптимизировать так: Всё поле разбить на полосы (горизонтальные или вертикальные - можно выбирать в зависимости от детали) некторой ширины (которую тоже можно задавать) и применять твой алгоритм только в пределах полосы, т.е. предварительно 1 раз отобрав точки, у которых одна координата попадает в текущую полосу.
Или даже можно попробовать разбить не на полосы, а на квадраты...

В терминах языков программирования рассказывать или так понятно?
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
Сообщения: 423
Зарегистрирован: 24 апр 2011, 09:14
Репутация: 72
Откуда: планета Земля
Контактная информация:

Re: Задача минимизации пути

Сообщение Гармонист »

UAVpilot писал(а):Или даже можно попробовать разбить не на полосы, а на квадраты...
это алгоритм разбиения на квардаты и делается так чтобы квадраты накладывались друг на друга - называется "с перекрытиями", что то такое учил в универе, но сейчас уже не помню как там дальше...
http://cnc-club.ru/forum/viewtopic.php?t=1064 - домашний станок типа "рука"
http://cnc-club.ru/forum/viewtopic.php?t=1107 - быстро создать 3d образ без сканера по фоткам
http://cnc-club.ru/forum/viewtopic.php?t=1073 - прогноз станко-строения
http://livehistory.ru - мозаика складывается
http://www.economics.kiev.ua - почему все так в нашем мире
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Задача минимизации пути

Сообщение Serg »

Не, накладывать не надо.
Задача - уменьшить количество итераций сравнения. Допустим есть массив из 10 точек. Чтобы их рассортировать потребуется 9+8+7+6+5+4+3+2+1=45 итераций. А если этот массив разбить на две полосы, то для случая равномерного распределения получится (4+3+2+1) * 2 = 20 итераций.

Программируем так:
Имеем массив в N точек.
Всю поверхность условно разбиваем на M квадратов и для каждого квадрата создаём массив под точки.
Один раз пробегаем последовательно по всем точкам и рассовываем их в массив соотв. квадрата.
Далее для каждого массива квадрата делаем итерации с сортировкой.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
_taras_
Мастер
Сообщения: 546
Зарегистрирован: 16 мар 2011, 15:19
Репутация: 69
Контактная информация:

Re: Задача минимизации пути

Сообщение _taras_ »

Гармонист писал(а):Нужно минимизировать общую длину отрезков
Может влезу ногами в жир, но вроде это рассматривается в комбинаторной оптимизации, классикой которого является задача маршрутизации транспорта (я женушке такую задачу решал).
Может это поможет?
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
Сообщения: 423
Зарегистрирован: 24 апр 2011, 09:14
Репутация: 72
Откуда: планета Земля
Контактная информация:

Re: Задача минимизации пути

Сообщение Гармонист »

спасибо за помощь. Когда реализую - напишу алгоритм.

На этом сайте встретил интересный текст:
Еще одно применение задачи коммивояжера – это задача о сверлильном станке. Данное применение задачи является сугубо специализированным приложением, которое заключается в оптимизации движений сверлильного станка ЧПУ для создания большого количества нерегулярно расположенных отверстий или сварочного робота. Сверлильный станок изготавливает металлические листы с некоторым количеством отверстий. Координаты отверстий известны. Необходимо найти кратчайший путь через все отверстия, а значит, и наименьшее время, затрачиваемое на изготовление одной детали. В данном случае, если такой станок делает миллион деталей в год, то даже миллиметровая выгода может сэкономить приличные средства. Этим объясняется стремление развитых стран затрачивать огромные финансовые ресурсы на инвестиции в информационные технологии.
http://cnc-club.ru/forum/viewtopic.php?t=1064 - домашний станок типа "рука"
http://cnc-club.ru/forum/viewtopic.php?t=1107 - быстро создать 3d образ без сканера по фоткам
http://cnc-club.ru/forum/viewtopic.php?t=1073 - прогноз станко-строения
http://livehistory.ru - мозаика складывается
http://www.economics.kiev.ua - почему все так в нашем мире
Аватара пользователя
michael-yurov
Почётный участник
Почётный участник
Сообщения: 11731
Зарегистрирован: 26 июл 2012, 00:10
Репутация: 4703
Настоящее имя: Михаил Львович
Откуда: Новоуральск
Контактная информация:

Re: Задача минимизации пути

Сообщение michael-yurov »

Подобная задача решается, как нефиг делать.
Удивительно, что какой нибудь арткам этого не делает.
Аватара пользователя
vovafed
Мастер
Сообщения: 1822
Зарегистрирован: 08 фев 2013, 16:19
Репутация: 325
Настоящее имя: Владимир
Откуда: башкортостан
Контактная информация:

Re: Задача минимизации пути

Сообщение vovafed »

в арткаме можно надо разбить на зоны.
зоны сгрупировать в нужной последовательности и считать программу.
но трудоемко получается надо векторами обрисовать так чтобы минимизировать нагрузку на фрезу
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Задача минимизации пути

Сообщение Nick »

Это называется Задача коммивояжёра. https://ru.wikipedia.org/wiki/Задача_коммивояжёра
Классика жанра. Если мне не изменяет память, то это Np полная задача. (не спрашивайте, что это такое :) ). Решения сильно оптимальнее полного перебора нет.

простейший и довольно эффективный метод ближайшего соседа: (в большинстве случаев дает не оптимальный математически результат, но достаточно близкий к нему)
https://ru.wikipedia.org/wiki/%D0%90%D0 ... 1%80%D0%B0

По времени выполнения O(n2). Что не так уж и долго, учитывая наши обстоятельства. Во сколько ты оценишь реальное максимальное количество островков?
Аватара пользователя
michael-yurov
Почётный участник
Почётный участник
Сообщения: 11731
Зарегистрирован: 26 июл 2012, 00:10
Репутация: 4703
Настоящее имя: Михаил Львович
Откуда: Новоуральск
Контактная информация:

Re: Задача минимизации пути

Сообщение michael-yurov »

Nick писал(а):Решения сильно оптимальнее полного перебора нет.
Так и не надо оптимальнее.
Сколько переходов обычно бывает при создании траектории? 10? 100? 1000? 10 000?
Даже для 10 000 переходов можно легко перебрать все варианты, это займет доли секунды. А станку терять время придется минутами, если не часами.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Задача минимизации пути

Сообщение Nick »

Если полный перебор - тогда там что-то порядка O( (n-1)! ) а это даже для 15 переходов уже будет дофига, посмотри в википедии есть картинка:
Оптимальный маршрут коммивояжёра через 15 крупнейших городов Германии. Указанный маршрут является самым коротким из всех возможных 43.589.145.600 .
Аватара пользователя
michael-yurov
Почётный участник
Почётный участник
Сообщения: 11731
Зарегистрирован: 26 июл 2012, 00:10
Репутация: 4703
Настоящее имя: Михаил Львович
Откуда: Новоуральск
Контактная информация:

Re: Задача минимизации пути

Сообщение michael-yurov »

ОЙ, и правда, что-то я все перепутал.
Я перепутал с задачей поиска кратчайшего маршрута.

Хотя, сейчас вот думаю - есть ведь множество способов оптимизации алгоритма.
Например, если найти более-менее сносный вариант, то можно сразу же отсеять очень большой процент неудачных вариантов.

А можно не искать лучший маршрут, а лишь перебрать несколько тысяч / миллионов и выбрать из них наиболее удачные.
А можно потом попробовать оптимизировать наиболее удачные.
Я более чем уверен, что вопрос вполне решаемый.
dpss
Мастер
Сообщения: 265
Зарегистрирован: 23 фев 2012, 13:40
Репутация: 27
Контактная информация:

Re: Задача минимизации пути

Сообщение dpss »

Если решать по простому, то в 2-3 прохода. На первом проходе делаем по "жадному алгоритму". На втором начинаем смотреть результаты первого похода с конца и рабочие фрагменты с длинными пустыми переходами, которые получились в конце подключаем к ближайшей по расположению группе.
Аватара пользователя
michael-yurov
Почётный участник
Почётный участник
Сообщения: 11731
Зарегистрирован: 26 июл 2012, 00:10
Репутация: 4703
Настоящее имя: Михаил Львович
Откуда: Новоуральск
Контактная информация:

Re: Задача минимизации пути

Сообщение michael-yurov »

В общем то - отличный вариант.
Можно еще несколько сотен вариантов с полученным удачным результатом сравнить, например, рассчитав движение по "жадному алгоритму" из всех точек в обе стороны.
Тогда, возможно, получится найти еще более удачный вариант и это почти не займет машинного времени.

И, еще - хорошей была бы идея расчета небольших островков с замкнутыми проходами без оставшихся внутри незадействованных точек,
которые потом можно было бы разорвав в любом удобном месте, объединить в общий путь, так же, как отдельные точки.
Т.е. сделать масштабируемый алгоритм. Если точек мало - то перебираем все варианты, если много - создаем островки и потом объединяем их, если еще больше - разбиваем расчет не на 2, а на 3, 4, 5... проходов.
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
Сообщения: 423
Зарегистрирован: 24 апр 2011, 09:14
Репутация: 72
Откуда: планета Земля
Контактная информация:

Re: Задача минимизации пути

Сообщение Гармонист »

Перечитав множество сайтов по этой задаче, везде предлагают решать ее жадным алгоритмом,
но после всех поисков я так и не понял: "как в жадном алгоритме находится следующая точка?"
В статье википедии нет четкого определения человеческим языком.
Часто вообще сразу дают примеры, а ты по формулам должен прочитать и понять(пример).
vovafed писал(а):в арткаме можно надо разбить на зоны.
зоны сгрупировать в нужной последовательности и считать программу.
но трудоемко получается надо векторами обрисовать так чтобы минимизировать нагрузку на фрезу
т.е. в арткаме нужно вручную задавать последовательность обхода зон?
Nick писал(а):Во сколько ты оценишь реальное максимальное количество островков?
michael-yurov писал(а):Сколько переходов обычно бывает при создании траектории? 10? 100? 1000? 10 000?
у каждого по разному. У меня выходит около сотни.
michael-yurov писал(а):Я перепутал с задачей поиска кратчайшего маршрута.
вообще-то "задача комивояжера" это и есть "задача комивояжера по нахождению катчайшего маршрута". Нет?
michael-yurov писал(а):Даже для 10 000 переходов можно легко перебрать все варианты, это займет доли секунды.
michael-yurov писал(а):А можно не искать лучший маршрут, а лишь перебрать несколько тысяч / миллионов и выбрать из них наиболее удачные.
В этой статье под названием "Задача комивояжера" говорится:
Метод полного перебора (иногда говорят Метод перебора, подразумевая при этом полный перебор - это не совсем правильно, так как перебор может быть и не полным) заключается в том, что выполняется перебор всех возможных комбинаций точек (пунктов назначения). Как известно из математики, число таких перестановок равно n!, где n – количество точек. Так как в задаче коммивояжера исходный пункт обычно принимается одним и тем же (первая точка), то нам достаточно перебрать оставшиеся, т.е. количество перестановок будет равно (n–1)!. Этот алгоритм почти всегда дает точное решение задачи коммивояжера, однако продолжительность таких вычислений может занять непозволительно много времени. Известно, что при значениях n > 12, современный(?) компьютер не смог бы решить задачу коммивояжера даже за все время существования вселенной.

Нашел "красивое" решение задаче о сверлильном станке на сайте rusnauka.com.

Во первых автор Петричкович Александр Анатольевич сам придумал этот алгоритм,
который как оказалось позже - уже существовал под названием "Волновой алгоритм (Алгоритм Ли)",
что говорит о том, что из всех вариантов решений он один из наиболее оптимальных.
во 2х - он решал как раз нашу задачу о сверлильном станке и оптимизации пути.
в 3-х - он пробовал решать нашу задачу и жадным алгоритмом и волновым, но остановился на волновом.
в 4-х он не теоретик, а практически еще и написал программу на дэлфях,
да и сам алгоритм достаточно прост как в реализации так и в понимании принципа работы.
Буду делать волновым алгоритмом.

Описание:
Волновой алгоритм является одним из самых уникальных алгоритмов трассировки. Он позволяет построить трассу (путь) между двумя элементами в любом лабиринте.
волновой алгоритм, первая волна.gif
волновой алгоритм, первая волна.gif (447 байт) 1948 просмотров
Из начального элемента распространяется в 4-х(?) направлениях волна. Элемент, в который пришла волна образует фронт волны. На рисунках цифрами обозначены номера фронтов волны.
Каждый элемент первого фронта волны является источником вторичной волны.
волновой алгоритм, вторая волна.gif
волновой алгоритм, вторая волна.gif (811 байт) 1948 просмотров
Элементы второго фронта волны генерируют волну третьего фронта и т.д. Процесс продолжается до тех пор, пока не будет достигнут конечный элемент.
Перефразируя: берем текущую позицию станка(точку) в качестве текущей волны(массив точек №1).
Проверяем есть ли в текущей волне(массиве точек) соседняя точка.
Если есть - эта точка ближайшая - берем ее и останавливаемся и переходим в неё, иначе продолжаем.
Вокруг(?еще не придумал как реализовать :thinking: ?) текущей волны запоминаются все соседние точки в качестве следующей волны(массив точек №2).
Текущей волной становится волная №2, волну №1 - забываем.
Возвращаемся в начало цикла.
http://cnc-club.ru/forum/viewtopic.php?t=1064 - домашний станок типа "рука"
http://cnc-club.ru/forum/viewtopic.php?t=1107 - быстро создать 3d образ без сканера по фоткам
http://cnc-club.ru/forum/viewtopic.php?t=1073 - прогноз станко-строения
http://livehistory.ru - мозаика складывается
http://www.economics.kiev.ua - почему все так в нашем мире
Аватара пользователя
vovafed
Мастер
Сообщения: 1822
Зарегистрирован: 08 фев 2013, 16:19
Репутация: 325
Настоящее имя: Владимир
Откуда: башкортостан
Контактная информация:

Re: Задача минимизации пути сверлильного станка с чпу или ЗК

Сообщение vovafed »

Гармонист писал(а):т.е. в арткаме нужно вручную задавать последовательность обхода зон?
да в ручную и желательно зоны обработки делать такие чтобы в каждой зоне был один вход и чтобы фреза постепенно расширяла зону
тоесть если взять за зону обработки треугольник начинаем обрабатывать с вершины до основания треугольника. берем ведь за основу реальный станок с люфтами, недостатком жесткости и тп. если фреза сходу будет врезаться в матерьял получим полосы на стыках зон обработки
Аватара пользователя
tooshka
Почётный участник
Почётный участник
Сообщения: 1803
Зарегистрирован: 24 окт 2012, 14:26
Репутация: 209
Настоящее имя: Андрей
Откуда: Нижний Новгород
Контактная информация:

Re: Задача минимизации пути сверлильного станка с чпу или ЗК

Сообщение tooshka »

Гармонист писал(а):т.е. в арткаме нужно вручную задавать последовательность обхода зон?
Вроде в Арткаме есть адаптивный режим, когда много зон обработки он просчитывает оптимальный путь.
Милая, ты услышь меня
под окном стою со своим я ЧПУ! (Протяжно; с надрывом; форте)
Внимание!!! Чрезмерное увлечение ЧПУ приводит к проблемам в семейных отношениях!
Аватара пользователя
michael-yurov
Почётный участник
Почётный участник
Сообщения: 11731
Зарегистрирован: 26 июл 2012, 00:10
Репутация: 4703
Настоящее имя: Михаил Львович
Откуда: Новоуральск
Контактная информация:

Re: Задача минимизации пути сверлильного станка с чпу или ЗК

Сообщение michael-yurov »

Про арткам не понял. Он сам выбирает последовательность холостых переходов.
Вроде бы есть возможность задать принудительно, но как-то по дурацки этот режим работает.
У него, вообще, режимы сверху вниз, слева на право и т.п. работают по принципу движения змейкой по полю,
т.е. все поле разбивается на квадраты, и змейкой он обходит их. Мне очень не нравится этот вариант, т.к. тогда, когда действительно нужно двигаться строго сверху-вниз или слева на право (например, чтобы детали вырезались последовательно и заготовка не разделилась бы на части, как поеденный крысами сыр) - он начинает своевольничать.

Про "перебрать все варианты" - это я ошибся, это я перепутал с поиском кратчайшего пути (как навигатор работает). Это намного, намного проще вычислить полным перебором.

"Жадный алгоритм" - это когда ты движешься каждый раз к ближайшей из оставшихся точек.

Волновой алгоритм в случае одной волны и получится "жадным" (как я понимаю). А вот если сделать 2 - 5 отражений волн это уже будет намного более продуманный алгоритм. Т.е. делать не n! расчетов, а ограничить каждую цепочку, например, 5 шагами.



Я вот что придумал...

Проводим расчет ценностей всех точек (чем больше точек есть рядом с каждой - тем менее ценной она становится [1]).
Затем движемся к наиболее ценной, но по возможности менее удаленной точке
(т.е. рассматриваем все варианты движения, для этого делим ценность точки к которой мы направляемся на расстояние до нее [2], выбираем наиболее удачный вариант и переходим туда)
Снова делаем перерасчет ценностей точек, но уже без тех, что пройдены.
[1] грубо говоря, для расчета ценности точки мы считаем, сколько точек есть рядом [1.1], складываем это все и делим 1/результат. Как при параллельном включении разных сопротивлений.
[1.1] не просто складываем количество всех точек, а производим расчет так - 1/расстояние до первой точки + 1/расстояние до второй точки + ... + 1/расстояние до последней точки.
[2] Чтобы не пришлось делить на ноль (например, если точки находятся на нулевом расстоянии друг от друга) стоит учесть эту ситуацию.

Я поразмышлял, и пришел к выводу, что этот алгоритм даст очень хороший результат, и я бы посоревновался бы с волновым.
При чем мой алгоритм будет намного быстрее волнового даже при учете всего лишь 3-х отражений в волновом.
Последний раз редактировалось michael-yurov 09 май 2013, 14:50, всего редактировалось 1 раз.
dpss
Мастер
Сообщения: 265
Зарегистрирован: 23 фев 2012, 13:40
Репутация: 27
Контактная информация:

Re: Задача минимизации пути сверлильного станка с чпу или ЗК

Сообщение dpss »

Волновой алгоритм исключительно ресурсоемкий. На нем работали первые автоматические трассировщики печатных плат - пикад, спектра и т.д. У меня нередко бывают задачи, где количество объектов может достигать 100000. Тут с волной даже пробовать не стоит. Если объекты расположены не равномерно по рабочему полю, а такое бывает почти всегда, то наверное в первую очередь нужно выделить сгущения - кластеры. Вот несколько вариантов, как это сделать
http://habrahabr.ru/post/101338/
http://www.ccas.ru/voron/download/Clustering.pdf
http://life-prog.ru/view_zam.php?id=89&cat=5&page=4
http://logic.pdmi.ras.ru/~sergey/teachi ... luster.pdf
http://www.dea-analysis.ru/clustering-5.htm
http://www.yourcmc.ru/wiki/images/0/09/ ... tering.pdf
http://technet.microsoft.com/ru-ru/libr ... 80445.aspx
Сортируем оставшийся после выделения "диффузный газ" из разрозненных объектов и при этом каждый кластер считается единым объектом. При сортировке элементов внутри кластера нужно учитывать предпочтение по расположению точек входа и выхода в кластер по минимальной суммарной длине пустого перехода.
Аватара пользователя
michael-yurov
Почётный участник
Почётный участник
Сообщения: 11731
Зарегистрирован: 26 июл 2012, 00:10
Репутация: 4703
Настоящее имя: Михаил Львович
Откуда: Новоуральск
Контактная информация:

Re: Задача минимизации пути сверлильного станка с чпу или ЗК

Сообщение michael-yurov »

Собственно то, что я предложил в 14 сообщении и развил в 18.
Упростив расчеты именно для этой задачи получил простой и понятный алгоритм с учетом кластеризации.
Ответить

Вернуться в «LinuxCNC»