Um projecto de obra consiste num conjunto de tarefas, que podem ser de tipos diferentes. Cada tarefa tem sempre uma duração, em número de dias, uma necessidade de mão de obra, em número de operários (que, para se simplificar, se considera indiferenciada, i.e., os operários são todos generalistas, sabem fazer tudo), um custo de material e um custo de mão de obra. As tarefas podem depender de outras tarefas. Por exemplo, se existirem as tarefas A, B e C correspondentes a construção de fundações, construção de paredes e instalação de cabos eléctricos, então a tarefa B só pode ser realizada depois da tarefa A e a tarefa C depois da B. Diz-se, neste caso, que B é sucessora de A e predecessora de C e que C é sucessora de B. Ou ainda que B depende de A e C depende de B.
O planeamento dum projecto corresponte a dizer:
A orçamentação corresponde a listar discriminadamente os custos dos materiais e da mão de obra utilizada.
Admite-se que a empresa que realizará a obra de construção pode contratar e despedir operários sempre que lhe apetecer e sem quaisquer custos (não é possível nem desejável na prática, mas simplifica a construção do programa...). Admite-se ainda que um operário é pago ao dia, mesmo que só precise de trabalhar umas horas ou uns minutos.
Admitem-se pelo menos quatro tipos da tarefas: tarefas orçamentadas por área, tarefas orçamentadas por dimensão linear, tarefas orçamentadas à peça e tarefas unitárias. Estes tipos podem ser expandidos ou especializados a gosto, embora tal não seja exigido.
As tarefas não são fragmentáveis. I.e., se a tarefa consiste em pintar 100 m2 de parede, só o utilizador do programa poderá fragmentar a tarefa em duas (e.g., de 50 m2).
O Problema 4 da avaliação periódica incidirá sobre a representação das tarefas através de uma hierarquia de classes em C++ usando polimorfismo.
t - nova tarefa.
i - nova tarefa com inicio explícito.
L tarefa - mostra uma tarefa.
a tarefa - altera uma tarefa.
r tarefa - remove uma tarefa.
d nome de - nova dependência.
R nome de - remove dependência.
+ tarefa tempo - adia tarefa.
- tarefa tempo - antecipa tarefa.
< tempo - novo inicio.
> tempo - novo fim.
l - mostra plano tarefa a tarefa.
G - mostra plano em diagrama de Gantt.
m - minimiza projecto.
o - mostra orçamento.
g ficheiro - guarda projecto.
c ficheiro - carrega projecto.
s - sai.
? - ajuda.
> t
Tarefa:
por área
à peça
linear
unitária
Que tipo de tarefa deseja?
unitária
Descreva a tarefa brevemente: Construção de paredes
Descreva o material: tijolo e cimento
Introduza notas várias: -
Qual a duração da tarefa (em dias)? 15
Quantos operários ocupa? 10
Qual o preço da mão obra por dia e por operário (em escudos)? 3000
Qual o preço total do material (em escudos)? 1000000
Que etiqueta dá à tarefa? A
> t
Tarefa:
por área
à peça
linear
unitária
Que tipo de tarefa deseja?
linear
Descreva a tarefa brevemente: Abertura de roços
Descreva o material: -
Introduza notas várias: -
Qual o comprimento? 500
Quantos operários ocupa? 2
Quanto tempo dura cada operario por unidade de comprimento (em dias)? 0.02
Qual o preço da mão obra por dia e por operário (em escudos)? 3000
Qual o preço de material por cada unidade de comprimento (em escudos)? 0
Que etiqueta dá à tarefa? B
> L B
Abertura de roços
duração: 5 dias
0.02 dias por operario e por unidade de comprimento
mão de obra: 2 operários
custo por dia: 3000$
custo total: 30000$
material: -
comprimento: 500
custo por unidade de comprimento: 0$
custo total: 0$
notas: -
> t
Tarefa:
por área
à peça
linear
unitária
Que tipo de tarefa deseja?
linear
Descreva a tarefa brevemente: Instalação de cabos eléctricos
Descreva o material: Cabelte
Introduza notas várias: -
Qual o comprimento? 1000
Quantos operários ocupa? 2
Quanto tempo dura cada operario por unidade de comprimento (em dias)? 0.002
Qual o preço da mão obra por dia e por operário (em escudos)? 7000
Qual o preço de material por cada unidade de comprimento (em escudos)? 750
Que etiqueta dá à tarefa? C
> L C
Instalação de cabos eléctricos
duração: 1 dias
0.002 dias por operario e por unidade de comprimento
mão de obra: 2 operários
custo por dia: 7000$
custo total: 14000$
material: Cabelte
comprimento: 1000
custo por unidade de comprimento: 750$
custo total: 750000$
notas: -
> t
Tarefa:
por área
à peça
linear
unitária
Que tipo de tarefa deseja?
à peça
Descreva a tarefa brevemente: Instalação de tomadas
Descreva o material: Legrand SB 900
Introduza notas várias: -
Qual o número de peças a colocar? 100
Quantos operários ocupa? 2
Quanto tempo dura cada operario a instalar uma peça (em dias)? 0.04
Qual o preço da mão obra por dia e por operário (em escudos)? 7000
Qual o preço de cada peça (em escudos)? 750
Que etiqueta dá à tarefa? D
> L D
Instalação de tomadas
duração: 2 dias
0.04 dias por operario e por peça
mão de obra: 2 operários
custo por dia: 7000$
custo total: 28000$
material: Legrand SB 900
peças: 100
custo por peça: 750$
custo total: 75000$
notas: -
> t
Tarefa:
por área
à peça
linear
unitária
Que tipo de tarefa deseja?
por área
Descreva a tarefa brevemente: Pintura de exteriores
Descreva o material: SIN
Introduza notas várias: 3 demãos
Qual a área? 500
Quantos operários ocupa? 2
Quanto tempo dura cada operario por unidade de área (em dias)? 0.01
Qual o preço da mão obra por dia e por operário (em escudos)? 5000
Qual o preço de material por cada unidade de area (em escudos)? 7500
Que etiqueta dá à tarefa? E
> a E
Descrição: Pintura de exteriores
Alterar?
Descrição do material: SIN
Alterar? s
CIN
Notas: 3 demãos
Alterar?
Alterar a área? [500]
Alterar número de operários? [2]
Alterar tempo que cada operario leva por unidade de área? [0.01]
Alterar o preço da mão obra por dia e por operário? [5000$]
Alterar preco do material por unidade de área? [7500$]
> L E
Pintura de exteriores
duração: 3 dias
0.01 dias por operario e por unidade de area
mão de obra: 2 operários
custo por dia: 5000$
custo total: 30000$
material: CIN
area: 500
custo por unidade de area: 7500$
custo total: 3750000$
notas: 3 demãos
> l
0-15
A(15): 0-15,0-15,0-15: C []
B(5): 0-5,0-5,10-15: 10 []
C(1): 0-1,0-1,14-15: 14 []
D(2): 0-2,0-2,13-15: 13 []
E(3): 0-3,0-3,12-15: 12 []
> d B A
> d C B
> l
0-21
A(15): 0-15,0-15,0-15: C []
B(5): 15-20,15-20,15-20: C [A,]
C(1): 20-21,20-21,20-21: C [B,]
D(2): 0-2,0-2,19-21: 19 []
E(3): 0-3,0-3,18-21: 18 []
> d D c
Erro: Etiqueta c inexistente no projecto!
> d D C
> d E A
> l
0-23
A(15): 0-15,0-15,0-15: C []
B(5): 15-20,15-20,15-20: C [A,]
C(1): 20-21,20-21,20-21: C [B,]
D(2): 21-23,21-23,21-23: C [C,]
E(3): 15-18,15-18,20-23: 5 [A,]
> o
Orçamento da obra.
Items:
0. Construção de paredes:
mão de obra: 3000$ x 15 dias x 10 operários = 450000$
material (tijolo e cimento) : 1000000$
1. Abertura de roços:
mão de obra: 3000$ x 5 dias x 2 operários = 30000$
material (-) : 500m x 0$ = 0$
2. Instalação de cabos eléctricos:
mão de obra: 7000$ x 1 dias x 2 operários = 14000$
material (Cabelte) : 1000m x 750$ = 750000$
3. Instalação de tomadas:
mão de obra: 7000$ x 2 dias x 2 operários = 28000$
material (Legrand SB 900) : 100 x 750$ = 75000$
4. Pintura de exteriores:
mão de obra: 5000$ x 3 dias x 2 operários = 30000$
material (CIN) : 500m2 x 7500$ = 3750000$
Total material: 5575000$
Total mão de obra: 552000$
Total: 6127000$
> a A
Descrição: Construção de paredes
Alterar?
Descrição do material: tijolo e cimento
Alterar?
Notas: -
Alterar?
Alterar a duração da tarefa? [15 dias]
Alterar o número de operários usados? [10] s
9
Alterar o preço da mão obra por dia e por operário? [3000$]
Alterar o preço total do material? [1000000$]
> o
Orçamento da obra.
Items:
0. Construção de paredes:
mão de obra: 3000$ x 15 dias x 9 operários = 405000$
material (tijolo e cimento) : 1000000$
1. Abertura de roços:
mão de obra: 3000$ x 5 dias x 2 operários = 30000$
material (-) : 500m x 0$ = 0$
2. Instalação de cabos eléctricos:
mão de obra: 7000$ x 1 dias x 2 operários = 14000$
material (Cabelte) : 1000m x 750$ = 750000$
3. Instalação de tomadas:
mão de obra: 7000$ x 2 dias x 2 operários = 28000$
material (Legrand SB 900) : 100 x 750$ = 75000$
4. Pintura de exteriores:
mão de obra: 5000$ x 3 dias x 2 operários = 30000$
material (CIN) : 500m2 x 7500$ = 3750000$
Total material: 5575000$
Total mão de obra: 507000$
Total: 6082000$
> G
T ABCDE R
----------
0 9.... 9
1 9.... 9
2 9.... 9
3 9.... 9
4 9.... 9
5 9.... 9
6 9.... 9
7 9.... 9
8 9.... 9
9 9.... 9
10 9.... 9
11 9.... 9
12 9.... 9
13 9.... 9
14 9.... 9
15 .2..2 4
16 .2..2 4
17 .2..2 4
18 .2..| 2
19 .2..| 2
20 ..2.| 2
Carregue <enter>
T ABCDE R
----------
21 ...2| 2
22 ...2| 2
> s
Projecto alterado. Guardar? s
Nome do ficheiro: ola
Tarefas: | Durações: | Depende de: |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
O respectivo diagrama de dependências será:
Diagrama de precedências
onde se representam as tarefas por caixas com o seu nome e a sua duração e as dependências (ou melhor, as influências) por setas.
A abordagem deste problema é simples. Pense-se numa dada tarefa, por exemplo H. Do diagrama, é evidente que H é sucessora directa de E, F e G. Mas isso significa que a tarefa H nunca poderá começar antes do final de qualquer uma das tarefas de que depende directamente!
Suponha-se que a primeira tarefa (qualquer que ela seja), dum projecto com o conjunto de tarefas P, tem começo exactamente no instante Tc. Sejam t.c e t.f os tempos de começo e fim o mais cedo possível para a tarefa t pertencente a P. Então o que se afirmou acerca da tarefa H é o mesmo que dizer que H.c = max {E.f, F.f, G.f}. Em geral, sendo ti, com i = 0, ..., t.n - 1, as t.n predecessoras directas da tarefa t, então
em que (M i : m <= i < n : f(i)) é o quantificador do máximo. I.e., o seu valor é o maior dos valores de f(i) quando i varia na gama de valores dada por m <= i < n. Se a gama de valores possíveis é vazia, então o quantificador não está bem definido.Mas esta observação ainda não resolve o problema, pois estabelece uma dependência entre as tarefas e as suas predecessoras, mas não diz como calcular os tempos mais cedo de todas as tarefas. É necessário fazer mais algumas observações.
Em primeiro lugar, é preciso notar que a duração total mínima do projecto é a diferença entre o final o mais cedo possível da tarefa que termina mais tarde e o tempo inicial. I.e., o tempo final do projecto é
Em segundo lugar, é necessário validar a equação (1) para o caso em que t.n (o número de predecessoras directas de t) é zero. Nesse caso, que valores pode tomar t.c? Como é óbvio, uma tarefa sem predecessoras pode começar logo no início do projecto, pelo que, quando t.n = 0, tem-se t.c = Tc. Ou seja, a equação deve-se escrever Então, como qualquer projecto bem construído tem pelo menos uma tarefa sem predecessoras (caso contrário haveria dependências circulares), pode-se começar por atribuir a essas tarefas sem predecessoras como tempo de começo o tempo de começo do projecto. Suponha-se que, para o exemplo acima, o tempo de começo do projecto era 0 (zero). Então, é óbvio que A.c = Tc = 0, A.f = A.c + A.d = 0 + 2 = 2 (sendo t.d a duração da tarefa t), J.c = 0 e J.f = 0 + 3 = 3. Agora é só propagar estes tempos, de acordo com a equação (3), até se processarem todas as tarefas. Mas é necessário transformar estas ideias num algoritmo.Dado que todas as tarefas terão começo nunca antes do tempo de começo global Tc, comece-se por atribuir esse tempo de começo a todas as tarefas. I.e., faça-se t.c = Tc para todas as tarefas. Associe-se a cada tarefa t um contador t.p (contador das predecessoras directas já processadas), e inicialize-se esse contador com t.n, i.e., com o número de predecessoras directas de t. Coloquem-se as tarefas t tais que t.n = 0 numa fila de espera F. Faça-se:
{O tempo de finalização do projecto ainda não é conhecido:}Aplicando o algoritmo acima ao diagrama de precedências dado como exemplo obtêm-se sucessivamente os valores indicados na tabela:
Tf <- Tc{Enquanto a fila de tarefas a processar não estiver vazia:}
enquanto ~ F.vazia() faça-se:{Seja t a tarefa à frente da fila. Como as tarefa só são colocadas na fila
quando as suas predecessoras directas já foram processadas,
esta tarefa t já tem o valor correcto do tempo de começo mais cedo
possível t.c:}
t <- F.frente(){Retire-se essa tarefa da fila:}
F.tira(){Calcule-se o tempo de finalização o mais cedo possível da tarefa:}
t.f <- t.c + t.d{Se esse tempo for superior a Tf, então o tempo de finalização do
projecto tem de ser aumentado:}
se t.f > Tf
Tf <- t.f {aumenta-se o mínimo possível.}{Agora que já se sabe qual o tempo de finalização mais cedo de t,
deve-se influenciar o tempo de começo mais cedo das suas sucessoras
directas:}
para todas as tarefas s sucessoras directas de t faça-se:{Se o tempo de finalização mais cedo de t é superior ao tempo de
começo mais cedo de s (sucessora de t), então o começo mais
cedo de s tem de ser aumentado:}
se s.c < t.f então
s.c <- t.f{Diminua-se o contador de predecessoras já processadas de s,
pois a tarefa t acabou de ser processada:}
s.p <- s.p - 1{Se o número de predecessoras processadas chegou a zero, então
s é candidata a ser processada, pois já tem o tempo de começo
mais cedo estabelecido. Assim, coloque-se a tarefa s na fila de
espera:}
se s.p = 0
F.põe(s){Quando aqui se chega, uma de duas coisas aconteceu: ou todas as tarefas
foram processadas (o que é fácil de verificar contabilizando o número de
tarefas tiradas da fila de espera), e portando Tf contém o tempo de
finalização mais cedo do projecto e todas as tarefas têm os seus tempos de
começo e fim o mais cedo possível bem estabelecidos; ou ficaram algumas
tarefas por processar, o que só pode acontecer se o projecto estiver mal
especificado por conter dependências circulares.}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
c = 0 f = ? n = 0 p = 0 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 3 p = 3 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 0 p = 0 |
c = 0 f = ? n = 1 p = 1 |
|
|
|
|
c = 0 f = 2 n = 0 p = 0 |
c = 2 f = ? n = 1 p = 0 |
c = 2 f = ? n = 1 p = 0 |
c = 2 f = ? n = 1 p = 0 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 3 p = 3 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 0 p = 0 |
c = 0 f = ? n = 1 p = 1 |
|
|
|
|
c = 0 f = 2 n = 0 p = 0 |
c = 2 f = ? n = 1 p = 0 |
c = 2 f = ? n = 1 p = 0 |
c = 2 f = ? n = 1 p = 0 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 3 p = 3 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = 3 n = 0 p = 0 |
c = 3 f = ? n = 1 p = 0 |
|
|
|
|
c = 0 f = 2 n = 0 p = 0 |
c = 2 f = 3 n = 1 p = 0 |
c = 2 f = ? n = 1 p = 0 |
c = 2 f = ? n = 1 p = 0 |
c = 3 f = ? n = 1 p = 0 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 3 p = 3 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = 3 n = 0 p = 0 |
c = 3 f = ? n = 1 p = 0 |
|
|
|
|
c = 0 f = 2 n = 0 p = 0 |
c = 2 f = 3 n = 1 p = 0 |
c = 2 f = 7 n = 1 p = 0 |
c = 2 f = ? n = 1 p = 0 |
c = 3 f = ? n = 1 p = 0 |
c = 7 f = ? n = 1 p = 0 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = ? n = 3 p = 3 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = 3 n = 0 p = 0 |
c = 3 f = ? n = 1 p = 0 |
|
|
|
|
c = 0 f = 2 n = 0 p = 0 |
c = 2 f = 3 n = 1 p = 0 |
c = 2 f = 7 n = 1 p = 0 |
c = 2 f = 6 n = 1 p = 0 |
c = 3 f = ? n = 1 p = 0 |
c = 7 f = ? n = 1 p = 0 |
c = 6 f = ? n = 1 p = 0 |
c = 0 f = ? n = 3 p = 3 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = 3 n = 0 p = 0 |
c = 3 f = ? n = 1 p = 0 |
|
|
|
|
c = 0 f = 2 n = 0 p = 0 |
c = 2 f = 3 n = 1 p = 0 |
c = 2 f = 7 n = 1 p = 0 |
c = 2 f = 6 n = 1 p = 0 |
c = 3 f = ? n = 1 p = 0 |
c = 7 f = ? n = 1 p = 0 |
c = 6 f = ? n = 1 p = 0 |
c = 0 f = ? n = 3 p = 3 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = 3 n = 0 p = 0 |
c = 3 f = 8 n = 1 p = 0 |
|
|
|
|
c = 0 f = 2 n = 0 p = 0 |
c = 2 f = 3 n = 1 p = 0 |
c = 2 f = 7 n = 1 p = 0 |
c = 2 f = 6 n = 1 p = 0 |
c = 3 f = 6 n = 1 p = 0 |
c = 7 f = ? n = 1 p = 0 |
c = 6 f = ? n = 1 p = 0 |
c = 6 f = ? n = 3 p = 2 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = 3 n = 0 p = 0 |
c = 3 f = 8 n = 1 p = 0 |
|
|
|
|
c = 0 f = 2 n = 0 p = 0 |
c = 2 f = 3 n = 1 p = 0 |
c = 2 f = 7 n = 1 p = 0 |
c = 2 f = 6 n = 1 p = 0 |
c = 3 f = 6 n = 1 p = 0 |
c = 7 f = 9 n = 1 p = 0 |
c = 6 f = ? n = 1 p = 0 |
c = 9 f = ? n = 3 p = 1 |
c = 0 f = ? n = 1 p = 1 |
c = 0 f = 3 n = 0 p = 0 |
c = 3 f = 8 n = 1 p = 0 |
|
|
|
|
c = 0 f = 2 n = 0 p = 0 |
c = 2 f = 3 n = 1 p = 0 |
c = 2 f = 7 n = 1 p = 0 |
c = 2 f = 6 n = 1 p = 0 |
c = 3 f = 6 n = 1 p = 0 |
c = 7 f = 9 n = 1 p = 0 |
c = 6 f = 9 n = 1 p = 0 |
c = 9 f = ? n = 3 p = 0 |
c = 9 f = ? n = 1 p = 0 |
c = 0 f = 3 n = 0 p = 0 |
c = 3 f = 8 n = 1 p = 0 |
|
|
|
|
c = 0 f = 2 n = 0 p = 0 |
c = 2 f = 3 n = 1 p = 0 |
c = 2 f = 7 n = 1 p = 0 |
c = 2 f = 6 n = 1 p = 0 |
c = 3 f = 6 n = 1 p = 0 |
c = 7 f = 9 n = 1 p = 0 |
c = 6 f = 9 n = 1 p = 0 |
c = 9 f = 11 n = 3 p = 0 |
c = 9 f = ? n = 1 p = 0 |
c = 0 f = 3 n = 0 p = 0 |
c = 3 f = 8 n = 1 p = 0 |
|
|
|
|
c = 0 f = 2 n = 0 p = 0 |
c = 2 f = 3 n = 1 p = 0 |
c = 2 f = 7 n = 1 p = 0 |
c = 2 f = 6 n = 1 p = 0 |
c = 3 f = 6 n = 1 p = 0 |
c = 7 f = 9 n = 1 p = 0 |
c = 6 f = 9 n = 1 p = 0 |
c = 9 f = 11 n = 3 p = 0 |
c = 9 f = 11 n = 1 p = 0 |
c = 0 f = 3 n = 0 p = 0 |
c = 3 f = 8 n = 1 p = 0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A | |||||||||||
B | |||||||||||
C | |||||||||||
D | |||||||||||
E | |||||||||||
F | |||||||||||
G | |||||||||||
H | |||||||||||
I | |||||||||||
J | |||||||||||
K |
t.C - começo da tarefa t o mais tarde possívelo algoritmo pode-se escrever:
t.F - fim da tarefa t o mais tarde possível
{Para inicializar, atribua-se o valor Tf ao tempo de finalização o mais tarde possível t.F de cada tarefa t, atribua-se também o número t.m de sucessoras da tarefa t ao contador t.p e coloquem-se as tarefas sem sucessoras na fila F.}A diferença entre t.C e t.c (ou entre t.F e t.f) é a folga na colocação da tarefa t. Significa que a tarefa pode ter começo num intervalo de instantes de tempo de largura t.C - t.c. Essas folgas podem ser representadas no diagrama de Gantt (folgas a verde):{Enquanto a fila de tarefas a processar não estiver vazia:}
enquanto ~ F.vazia() faça-se:{Seja t a tarefa à frente da fila. Como as tarefa só são colocadas na fila
quando as suas sucessoras directas já foram processadas, esta tarefa
t já tem o valor correcto do tempo de finalização mais tarde
possível t.F:}
t <- F.frente(){Retire-se essa tarefa da fila:}
F.tira(){Calcule-se o tempo de começo o mais tarde possível da tarefa:}
t.C <- t.F - t.d{Agora que já se sabe qual o tempo de começo mais tarde de t,
deve-se influenciar o tempo de finalização mais tarde das suas
predecessoras directas:}
para todas as tarefas p predecessoras directas de t faça-se:{Se o tempo de começo mais tarde de t é inferior ao tempo de
finalização mais tarde de p (predecessora de t), então a
finalização mais tarde de p tem de ser aumentada:}
se t.C < p.F então
p.F <- t.C{Diminua-se o contador de sucessoras já processadas de p,
pois a tarefa t acabou de ser processada:}
p.p <- p.p - 1{Se o número de sucessoras processadas chegou a zero, então p
é candidata a ser processada, pois já tem o tempo de finalização
mais tarde estabelecido. Assim, coloque-se a tarefa p na fila de
espera:}
se p.p = 0
F.põe(p){Quando aqui se chega, uma de duas coisas aconteceu: ou todas as tarefas
foram processadas (o que é fácil de verificar contabilizando o número de
tarefas tiradas da fila de espera), e portando todas as tarefas têm os seus
tempos de começo e fim o mais tarde possível bem estabelecidos; ou ficaram
algumas tarefas por processar, o que só pode acontecer se o projecto
estiver mal especificado por conter dependências circulares.}
|
|
|
|
|
|
|
|
|
|
|
|
A | |||||||||||
B | |||||||||||
C | |||||||||||
D | |||||||||||
E | |||||||||||
F | |||||||||||
G | |||||||||||
H | |||||||||||
I | |||||||||||
J | |||||||||||
K |
Todas as tarefas que têm folga nula são chamadas tarefas críticas: para reduzir o tempo total de execução do projecto é necessário encurtar pelo menos uma das tarefas críticas. As tarefas críticas são indicadas no diagrama com um sublinhado.
Finalmente, é de notar que se podem usar algoritmos muito semelhantes aos apresentados para fazer um plano do projecto respeitando tanto quanto possível tempos de começo e fim do projecto e tempos de começo das tarefas especificados pelo utilizador do programa, i.e., sem minimizar o tempo de conclusão do projecto. Pense no assunto.
Os algoritmos de planeamento serão abordados no Problema 3 da avaliação.
Não se esqueça de que é importante testar o código à medida que o desenvolve. Nunca deixe os testes para o fim. Pior ainda é só tentar compilar quando já escreveu o código todo. Para seu próprio bem, não o faça...
Algumas outras sugestões que poderá achar úteis para a escrita do programa:
A nota deste trabalho será dada apenas após uma discussão, individual, com cada um dos elementos do grupo. Nesta discussão qualquer elemento do grupo terá de demonstrar um total conhecimento do programa e ser capaz de operar as alterações que forem pedidas. Nessa oral poderão também ser feitas perguntas sobre a matéria em geral. A nota final dependerá não só da qualidade do trabalho, mas também, e principalmente, do conhecimento do mesmo programa e da matéria em geral e da capacidade de resolver problemas em C++ demonstrados nessa discussão.
Quaisquer funcionalidades extra que não tenham sido pedidas no enunciado, tais como menus sofisticados, interfaces com janelas, etc., não serão avaliadas.