Планирование заданий проекта: параллельные задачи с несколькими заданиями

В одном проекте я не хочу, чтобы два задания выполнялись параллельно. Как мне его спроектировать? Есть ли в файле drl правило, которое не позволяет запускать два задания в одном проекте одновременно? Если такого нет, как два задания в одном проекте не могут выполняться одновременно?

rule "nonrenewableResourceCapacity"
    when
        $resource : Resource(renewable == false, $capacity : capacity)
        accumulate(
            ResourceRequirement(resource == $resource,
                    $executionMode : executionMode,
                    $requirement : requirement)
            and Allocation(executionMode == $executionMode);
            $used : sum($requirement);
            $used > $capacity
        )
    then
        scoreHolder.addHardConstraintMatch(kcontext, 0, $capacity - $used);
end

rule "renewableResourceUsedDay"
        salience 1 // Do these rules first (optional, for performance)
    when
        ResourceRequirement(resourceRenewable == true, $executionMode : executionMode, $resource : resource)
        Allocation(executionMode == $executionMode,
                $startDate : startDate, $endDate : endDate)
    then
        for (int i = $startDate; i < $endDate; i++) {
            insertLogical(new RenewableResourceUsedDay($resource, i));
        }
end

rule "renewableResourceCapacity"
    when
        RenewableResourceUsedDay($resource : resource, $capacity : resourceCapacity, $usedDay : usedDay)
        accumulate(
            ResourceRequirement(resource == $resource,
                    $executionMode : executionMode,
                    $requirement : requirement)
            and Allocation(executionMode == $executionMode, $usedDay >= startDate, $usedDay < endDate);
            $used : sum($requirement);
            $used > $capacity
        )
    then
        scoreHolder.addHardConstraintMatch(kcontext, 0, $capacity - $used);
end

// ############################################################################
// Soft constraints
// ############################################################################

rule "totalProjectDelay"
    when
        Allocation(jobType == JobType.SINK, endDate != null, $endDate : endDate,
               $criticalPathEndDate : projectCriticalPathEndDate)
    then
        scoreHolder.addSoftConstraintMatch(kcontext, 0,  $criticalPathEndDate - $endDate);
end


rule "totalMakespan"
    when
        accumulate(
            Allocation(jobType == JobType.SINK, $endDate : endDate);
            $maxProjectEndDate : max($endDate)
        )
    then
        scoreHolder.addSoftConstraintMatch(kcontext, 1, - (Integer) $maxProjectEndDate);
end
0
0
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При назначении задач, когда вы никогда не хотите запускать 2 задания параллельно (так что это жесткое ограничение для всех заданий), я бы, вероятно, сделал его встроенным жестким ограничением и в основном смоделировал его как TSP.

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

Другие вопросы по теме