Алгоритм для того, чтобы оптимально выбрать действия для выполнения задачи

Существует два типа данных: задачи и действия. Действие стоит определенного времени для завершения, и ряд задач это, действия состоят из. Задача имеет ряд действий, и наше задание состоит в том, чтобы выбрать одного из них. Так:

class Task { Set<Action> choices; }
class Action { float time; Set<Task> dependencies; }

Например, основная задача могла быть, "Получают дом". Возможные действия для этой задачи: "Купите дом", или "Создают дом". Действие "Сборка дом" стоит 10 часов и имеет зависимости, "Получают кирпичи" (который может стоить 6 часов), и "Получают цемент" (который стоит 9 часов), и так далее.

Общее время является суммой всех времен действий, требуемых работать (в этом случае 10+6+9 часов). Мы хотим выбрать действия, таким образом, что общее время минимально.

Обратите внимание, что зависимости могут быть ромбовидной формы. Например, "Добираются, кирпичи" могли потребовать, "Получают автомобиль" (для переноса кирпичей), и "Добираются, цемент" также потребовал бы автомобиля. Даже если Вы действительно "Получаете кирпичи", и "Получают цемент", только необходимо считать время, которое требуется для получения автомобиля однажды.

Обратите внимание также, что зависимости могут быть круговыми. Например, "Деньги"-> "Задание"-> "Автомобиль"-> "Деньги". Это не проблема для нас, мы просто выбираем все "Деньги", "Задание" и "Автомобиль". Общее время является просто суммой времени этих 3 вещей.

Математическое описание:

Позволить actions будьте выбранными действиями.

valid(task) = ∃action ∈ task.choices. (action ∈ actions ∧ ∀tasks ∈ action.dependencies. valid(task))
time = sum {action.time | action ∈ actions}
minimize time subject to valid(primaryTask)

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

alt text

Поля представляют задачи, и круги представляют действия (время для выполнения, действие находится в кругу). Действие имеет строку к задаче, если той задачей является зависимость для действия. Вот описание проблемы снова с точки зрения изображений: если прямоугольник (=task) выбран, то один из кругов (=actions) внутри должен быть выбран. Если круг выбран, то все связанные прямоугольники должны быть выбраны. Цель состоит в том, чтобы минимизировать сумму чисел в выбранных кругах.

Оптимальное решение в этом случае состоит в том, чтобы выбрать действие со временем 2 в главной задаче и действиях со временем 1 в нижних задачах. Общее время 2+1+1=4. В этом случае существует 2 оптимальных решения. Второе решение состоит в том, чтобы выбрать действие со временем 3 в главной задаче и действии со временем 1 в нижней правой задаче. Общее время 3+1=4 снова. Если мы выбираем действие со временем 3 в главной задаче, мы не должны выполнять задачу левой нижней части, потому что нет никакой строки между действием со временем 3 и задачей левой нижней части.

Я приношу извинения за дрянной рисунок ;) И еще два примера (оптимальное решение для каждого было обозначено с синим и основной задачей, были обозначены с серым): alt text

7
задан Jules 7 June 2010 в 00:50
поделиться

6 ответов

Возможно, вы ищете алгоритм частичного планирования заказа: http://blackcat.brynmawr.edu/~dkumar/UGAI/planning.html#algorithms

1
ответ дан 7 December 2019 в 07:40
поделиться

Вы можете смоделировать это как график и использовать алгоритм кратчайшего пути , чтобы найти решение. Каждая из Задач будет узлом, а Действия - ребрами в графе.

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

Если вы рассматриваете задачу как просто совокупность действий и моделируете узлы как состояния, а действия как переходы между этими действиями. Вместо того чтобы думать о «Получить дом» как о первоочередной задаче, рассмотрите «Начать» и «Иметь дом» как 2 узла, а «Получить дом» как переход между ними. Действие перехода «Получить дом» можно разложить на граф, который представляет промежуточные состояния и действия (то есть узлы и ребра). У вас должна быть возможность разложить проблему до необходимого уровня и вычислить кратчайший путь по полученному графику.

4
ответ дан 7 December 2019 в 07:40
поделиться

Рискуя проявить чрезмерную разборчивость, это может показаться классической проблемой метода критического пути (CPM), а не PERT. PERT предполагает худшее, лучшее и среднее время завершения для каждой задачи, в то время как Жюль указал только один раз для каждой задачи. Тем не менее, вы можете использовать линейное программирование, чтобы найти критический путь и определить самое раннее время начала, самое позднее время окончания и т. Д. Для каждого действия. Вот полезное одностраничное описание подхода.

1
ответ дан 7 December 2019 в 07:40
поделиться

Я считаю, что каждый возможный путь выполнения должен заканчиваться Задачей, набор вариантов выбора которой полностью состоит из Действия без зависимостей.

Если это так, то вы можете легко определить минимальное время для каждой такой Задачи.

Затем вернитесь к Действиям, которые зависят только от Задач, которые вы «решили», и подсчитайте их общее время.

Пройдите в обратном направлении по всем возможным путям, пока не дойдете до начала.

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

0
ответ дан 7 December 2019 в 07:40
поделиться

Думаю, я сделал это много лет назад в контексте диаграмм PERT.

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

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

1
ответ дан 7 December 2019 в 07:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: