Что такое эффективный способ выйти за рамки жадного алгоритма

голоса
2

Домен этого вопроса планирование операций на стесненном оборудовании. Разрешение результата число тактов график вписывается. Пространство поиска растет очень быстро, где ранние решения ограничивают будущие решения и общее число возможных графиков быстро и экспоненциально растет. Многие из возможных графиков эквивалентны, так как только замена порядка двух команд, как правило, приводят к одной и той же ограничение временной привязки.

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

Текущий жадный алгоритм, как правило, делает глупые решения на ранних стадиях иногда и попытку ветвей и границ были вне медленно.

Edit: Хочу отметить, что результат очень двоичная с, возможно, жадный алгоритм заканчиваясь с использованием 8 циклов в то время как существует решение, используя только 7 циклов с использованием ветвей и границ.

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

Разъяснение: В каждом цикле есть ограничение на количество операций каждого типа и некоторые операции имеют два возможных типа. Есть множество ограничений маршрутизации, которые могут быть изменены, чтобы быть достаточно жесткими или довольно снисходительны и предел зависит от маршрутизации заторы.

Задан 19/05/2009 в 13:15
источник пользователем
На других языках...                            


4 ответов

голоса
0

Попытка имитации отжига, CFR. http://en.wikipedia.org/wiki/Simulated_annealing .

Ответил 19/05/2009 в 13:19
источник пользователем

голоса
1

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

Ответил 19/05/2009 в 13:25
источник пользователем

голоса
1

Если вы можете сопоставить вашу проблему с «коммивояжером» (как: Найти оптимальную последовательность для выполнения всех операций в минимальных сроках), то у вас есть NP-полная задача.

Очень быстрый способ решить , что это муравей алгоритм (или оптимизация колонии муравьев).

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

Ответил 19/05/2009 в 13:37
источник пользователем

голоса
3

Integer линейной оптимизации для NP-трудных задач

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

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

Этот подход заключается в преобразовании задачи к задаче линейной оптимизации с целыми переменными. Есть свободно-пакеты программного обеспечения (например, ЛВ-решения), которые могут решить такие проблемы эффективно.

Преимущество такого подхода заключается в том, что он может дать вам точные ответы на NP-трудные задачи в приемлемое время. Я использовал этот подход в нескольких проектах.

Как ваше заявление проблема не включает в себя более подробную информацию о боковых ограничений, я не могу вдаваться в подробности, как применять этот метод.

Редактировать / дополнение: Пример реализации

Вот некоторые подробности о том, как реализовать этот метод в вашем случае (я, конечно, сделать некоторые предположения, которые не могут применяться к вашим конкретным проблемам --- Я знаю только детали формируют свой вопрос):

Предположим, что у вас есть 50 инструкции CMD (я) (я = 1..50) должен планироваться в 10 или меньше циклов цикла (т) (т = 1..10). Введем 500 двоичных переменных V (I, T) (I = 1..50; Т = 1..10), которые указывают ли CMD команд (I) выполняется в цикле (т) или нет. Это базовая настройка дает следующие линейные ограничения:

v_it integer variables
0<=v_it; v_it<=1;       # 1000 constraints: i=1..50; t=1..10
sum(v_it: t=1..10)==1   # 50 constraints:   i=1..50

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

sum(v_it: i=1..5)<=2    # 10 constraints: t=1..10

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

Кроме того, давайте предположим, что операция ЦМД (7) зависит от работы ЦМД (2) и должна быть выполнена после него. Для того, чтобы уравнение немного более интересным, позволяет также требует разрыва в два цикла между ними:

sum(t*v(2,t): t=1..10) + 3 <= sum(t*v(7,t): t=1..10)   # one constraint

Примечание: сумма (т * V (2, T): T = 1..10) является цикл т, где v (2, т) равен единице.

Наконец, мы хотим, чтобы свести к минимуму количество циклов. Это несколько сложнее, потому что вы получаете довольно большие цифры в пути, что я предлагаю: Дам присвоить каждый V (I, T) цену, которая растет экспоненциально со временем: оттеснение операции в будущее намного дороже, чем выполнение их раньше:

сумма (6 ^ т * v (я, т): я = 1..50; т = 1..10) -> минимум. # Одна целевая функция

Я выбираю 6, чтобы быть больше, чем 5, чтобы гарантировать, что добавление одного цикла к системе делает его более дорогим, чем выдавливание все в менее циклов. Побочным эффектом является то, что программа будет выходить из его способ планировать операции как можно раньше. Вы можете избежать этого, выполнив оптимизацию двухступенчатый: Во-первых, использовать эту целевую функцию, чтобы найти минимальное количество необходимых циклов. Затем попросите ту же проблему снова с другой целевой функцией --- ограничение числа доступных циклов в начале и навязывание более умеренную цена штрафа для последующих операций. Вы должны играть с этим, я надеюсь, что вы получили эту идею.

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

Затем передать вашу проблему прочь к ЛВ-решения или CPLEX и позволить им найти лучшее решение!

Ответил 19/05/2009 в 13:44
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more