Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Анализ зависимостей, последовательность выполнения, подход к решению задачи, алгоритмы 
:(
    Опции темы
Maksym
Дата 3.7.2009, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: нет
Всего: 62



Есть множество задач вида
interface Тask{
    execute();
}

, связанных набором зависимостей:
@Before(Task[]) -- задача должна быть гарантированно выполнена до выполениня всех задач из массива;
@After(Task[]) -- задача может быть выполнена только после выполнения всех задач из массива;
@If(contextParameter = <someValue>) -- задача может быть выполнена только если некая переменная (из доступного всех задачам контекста) равна <someValue>;
@IfNot(contextParameter = <someValue>) -- задача может быть выполнена только если некая переменная (из доступного всех задачам контекста) не равна <someValue>;
и т.д. и т.п. самые разные условия.

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

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

Есть ли какой-то общий подход к решению таких проблем? готовые алгоритмы? возможно, построение графа или матрицы зависимостей? 
Вообщем нужен совет, как бы вы это делали?  smile

Это сообщение отредактировал(а) Maksym - 3.7.2009, 12:06
PM MAIL   Вверх
AntonSaburov
Дата 3.7.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Выглядит как построение графа. Копать туда
PM MAIL WWW ICQ   Вверх
maxdiver
Дата 3.7.2009, 18:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Если рассматривать только связи Before и After, то получается просто граф зависимостей, и на нём это - задача топологической сортировки, решается довольно просто обходом в глубину.

А связи If я не очень понял - эти переменные меняются в результате выполнения задач что ли?
PM MAIL WWW ICQ   Вверх
AntonSaburov
Дата 3.7.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Я думаю, что переменные известны перед построением. Таким образом можно просто отбросить те задачи, которые на данный момент не будут использованы.
PM MAIL WWW ICQ   Вверх
nworm
Дата 5.7.2009, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: 4
Всего: 8



Формулировка напоминает задачи, связанные с сетевыми графиками.
Там надо повышать скорость выполнения работ.
Там есть разнообразные методы решения.
Я бы шёл от них.

Это сообщение отредактировал(а) nworm - 5.7.2009, 00:09
PM MAIL WWW   Вверх
AVA12
Дата 5.7.2009, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 4.5.2008

Репутация: 1
Всего: 4



Считаем, что все дополнительные условия (переменные contextParameter) заранее известны, и задачи эти условия не изменяют.

Нужно слегка изменить данные. Для каждой задачи оставить только список After[]. Если у задачи есть список Before[], то эта задача добавляется в списки After[] каждой зависимой задачи. В результате получается орграф. Для каждой задачи храним статус - не выполнена, ожидает выполнения или выполнена.

В цикле перебираем все задачи со статусом "не выполнена". Для каждой такой задачи выполняем следующую процедуру:

1. Для выбранной задачи проверяем дополнительные условия (If, IfNot), если задача не может быть выполнена (условия не соблюдаются), то помечаем задачу, как выполненную. Выходим из процедуры.

2. Помечаем задачу, как ожидающую выполнения.

3. Если у задачи нет зависимостей (список After[] пуст), то переходим к шагу 8.

4. Выбираем очередную задачу из списка After[].

5. Если статус задачи из списка - "не выполнена", то рекурсивно вызываем процедуру для нее. Переходим к шагу 7.

6. Если статус задачи из списка - "ожидает выполнения", значит, в орграфе обнаружился цикл (присутствует циклическая зависимость задач), и выстроить нужную последовательность невозможно. Сигнализируем об ошибке и выходим из процедуры.

7. Если в списке After[] еще есть непроверенные элементы, то переходим к шагу 4.

8. Выполняем задачу (либо добавляем в очередь выполнения), помечаем ее, как выполненную. Выходим из процедуры.
PM ICQ Jabber   Вверх
Maksym
Дата 6.7.2009, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: нет
Всего: 62



Цитата(maxdiver @  3.7.2009,  17:05 Найти цитируемый пост)
А связи If я не очень понял - эти переменные меняются в результате выполнения задач что ли? 

Да, задачи могут менять контекст. То есть после выполнения каждой задачи нужен пересчет с учетом точки выполнения (чтобы продолжать со следующей по очереди задачи и не выполнить ничего повторно). Кстати именно это условие заставляет меня искать алгоритм, а не реализовывать какую-нибудь тупую сортировку перебором в лоб (это я уже сделал smile ) -- много задач, нагрузка растет по экспоненте.

Цитата(AVA12 @  5.7.2009,  00:54 Найти цитируемый пост)
Считаем, что все дополнительные условия (переменные contextParameter) заранее известны, и задачи эти условия не изменяют.

Изменяют, см.выше. В любом случае, спасибо за подробный ответ: подумаю, попытаюсь использовать.

Цитата(AntonSaburov @  3.7.2009,  14:37 Найти цитируемый пост)
Выглядит как построение графа. Копать туда 

Это я и сам понял smile но как-то мелко копнул видимо -- ниче не выкопалось.

PM MAIL   Вверх
AVA12
Дата 6.7.2009, 20:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 4.5.2008

Репутация: 1
Всего: 4



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

Плюс надо убедиться, что действительно существует необходимость решать эту проблему. Возможно, существуют обходные пути.
PM ICQ Jabber   Вверх
rimidal
Дата 6.7.2009, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 25.9.2007

Репутация: нет
Всего: 1



Самое простое и верное (точно будет правильно работать) что приходит на ум это перебор с возвратом. 
Этот алгоритм не только скажет есть ли решение или нет но и скажет сколько их и все покажет.
Вопрос только в том как строить дерево полного перебора и как по нему ходить.

Некоторые оптимизации выше уже подсказали. 

P.S.
Хочешь или нет а этот алгоритм придеться реализовывать.
Иначе как ты будешь проверять правильность работы другого алгоритма?
ИМХО: другого алгоритма для решения этой задачи нет , т.к. выполнение task-a ведет к изменению контекста, который может влиять на  условия выполнения других task-ов.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1208 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.