Вы говорите о CPM - методе критического пути.
Оценка каждого типа условия (Finish to Start, ....) представляет собой простой Select-Case.
Вам нужны eval ранние даты, а затем более поздние даты. Это определяет критический путь.
Если ваш алгоритм включает ASAP - ALAP для некоторых задач, вы можете оценить дополнительный проход запланированных дат.
Я использую рекурсивный алгоритм для каждого прохода (ранние даты, последние даты...). Это обнаруживает цикл условий и показывает их (Task1 -> Task2 -> Task1).
Самая сложная задача для CPM — управление календарем. Не то, чтобы функция
Date1 = Calendar.Eval_DateFinish(Start, Duration)
Становится функцией на основе интервалов календаря ресурсов.
Вот моя функция для Ealy Dates.
Private Sub cpm_fmte(ByVal n As Int32)
Dim a = Actividades(n), fi, f As FechaCpm, ncit As Integer = 0
fi.value = Integer.MinValue
Dim cal As Calend = a.Cal, dur As Integer = a.dur
sw(n) = 255 : RaBucle.Add(a) 'Marco la actividad para detectar bucle condicionantes
For Each c In a.Predecesoras '/* calcular predecesoras */
If c._Act >= nHitos Then
If c._Act < nTResumen Then Continue For
Select Case sw(c._Act)
Case 0 : cpm_fmte(c._Act)
Case 255 : ShowBucle(c._Act) : Throw New Exception("Cpm_ftme: Error - Bucle Condicionantes")
'case Else - 1 - Ya calculada anteriormente
End Select
End If
Dim Pred = Actividades(c._Act)
Select Case c.Tipo
Case "D"c : f.value = Pred.ffmte.value + c.Demora
Case "I"c : f.value = Pred.fimte.value + c.Demora : ncit += 1
Case "T"c : f = cal.Calc_Fi(Pred.ffmte + c.Demora, dur) : ncit += 1
Case Else : Throw New Exception(String.Format("Error condic.: {0} {1} {2} {3} {4}", _
a.Id, c.Tipo, Pred.Id, c.Demora))
End Select
If f > fi Then fi = f
Next
RaBucle.Count -= 1
If fi.value = Integer.MinValue Then fi = Proyecto.Actprj.FechaPrj
If dur > 0 Then fi = cal.Fecha_Jla_Av(fi)
a.fimte.value = fi.value : a.ffmte = cal.Calc_Ff(fi, dur)
a.Fip = a.fimte : a.Ffp = a.ffmte
If a.ffmte.value > Fmax.value Then mfmax.value = a.ffmte.value
If a.fimte.value < Fmin.value Then mFmin.value = a.fimte.value
sw(n) = 1 'Actividad calculada
End Sub
Примечания. Тогда я испанец:
- Fmte -> Ранние даты (Fechas más Tempranas), Fmta -> Последние даты, Fp - Запланировано.
- Fi -> Дата начала (Fecha Inicio), FF -> Дата окончания (Fecha Fín)
- Actividades — Задания
- "D"c -> (Финиш - старт), "Después",
- "I"c -> (Старт - Старт) "Инициан..."
- "T"c -> (Финиш - Финиш) "Терминан..."
- Никогда не использовал условие Старт-Финиш.
Я использую тип (структуру) FechaCpm, который оценивается как тип Int32 (FechaCpm.Value) и интерпретируется как минутный интервал времени.
Вы можете получить больше кода для CPM на SourceForge, но я никогда не нахожу никакого кода в сети. Вы можете увидеть «Открыть WorkBench» — Java или «Планировщик» — C++.
Мой код основан на CPM, большинство программ Planification основаны на ресурсах, поддерживающих CPM. Я использую только один ресурс (Человеческий ресурс), тогда Календарь является свойством Задачи.
person
x77
schedule
20.07.2010