Activity Networks
We can divide all but simplest
projects into several subprojects
called activity.
Model it as a graph
Activity-on-Vertex (AOV) Networks
Activity-on-Edge (AOE) Networks
Activity on Vertex (AOV) Networks
An activity on vertex, or AOV network, is a
directed graph G in which the vertices
represent tasks or activities and the edges
represent the precedence relation
between tasks
Example
C3 is C1’s successor
C1 is C3’s predecessor
C9
C8
C1 C10 C11
C3 C7
C2 C12
C13 C14
C4 C5 C6
C15
Topological Ordering
A topological order is a linear ordering of
the vertices of a graph such that, for any
two vertices, i, j, if i is a predecessor of j
in the network then I precedes j in the
ordering
Example
C1 C2 C4 C5 C3 C6 C8 C7 C10 C13 C12
C14 C15 C11 C9
May not unique
C9
C8
C1 C10 C11
C3 C7
C2 C12
C13 C14
C4 C5 C6
C15
Topological Sort
Find a vertex v such that v has no
predecessor, output it. Then delete it from
network
Repeat this step until all vertices are
deleted
Time complexity: O(|V| + |E|)
Example
v0 has no predecessor, output it. Then
delete it and three edges
v1
v1
v0 v2 v4
v0 v2 v4
v3 v5
v3 v5
Example cont.
Choose v3, output it
Final result: v0, v3, v2, v1, v4, v5
V1
V2 V4
V3
V5
Program 6.13: Topological sort
• for (i = 0; i <n; i++) {
• if every vertex has a predecessor {
fprintf(stderr, “Network has a cycle.\n “ );
exit(1);
}
pick a vertex v that has no predecessors;
output v;
delete v and all edges leading out of v
from the network;
}
Issues in Data Structure Consideration
Decide whether a vertex has any
predecessors.
Each vertex has a count.
Decide a vertex together with all its
incident edges.
Adjacency list
*Figure 6.40:Adjacency list representation of Figure 6.30(a)
headnodes node
count link vertex link
V0 0 1 2 3 NULL
1 4 NULL
V1
1 4 5 NULL
V2 1 5 4 NULL
3 NULL
2 NULL
• typedef struct node *node_pointer;
typedef struct node {
int vertex;
node_pointer link;
};
typedef struct {
int count;
node_pointer link;
} hdnodes;
hdnodes graph[MAX_VERTICES];
*Program 6.14: Topological sort
void topsort (hdnodes graph [] , int n)
{
int i, j, k, top;
node_pointer ptr;
/* create a stack of vertices with no
predecessors */
top = -1;
for (i = 0; i < n; i++)
if (!graph[i].count) {
graph[i].count = top; top = i;
}
for (i = 0; i < n; i++)
if (top == -1) {
fprintf(stderr, “\n Network has a cycle.
Sort terminated. \n”);
exit(1);
}
*Program 6.14: Topological sort (cont.)
else {
j = top; /* unstack a vertex */
top = graph[top].count;
printf(“v%d, “, j);
for (ptr = graph [j]. link; ptr ;ptr = ptr -
>link ) {
/*decrease the count of the successor vertices of
j*/
k = ptr ->vertex;
graph[k].count --;
if (!graph[k].count) {
/* add vertex k to the stack*/
graph[k].count = top;
top = k;
}
}
}
}
Activity on Edge (AOE) Networks
Activity on edge or AOE, network is an activity network
closely related to the AOV network. The directed edges
in the graph represent tasks or activities to be
performed on a project.
directed edge
tasks or activities to be performed
vertex
events which signal the completion of certain activities
number
time required to perform the activity
Example: *Figure 6.41:An AOE network
Activities: a0, a1,…
Events :v0,v1,…
Application of AOE Network
Evaluate performance
minimum amount of time
activity whose duration time should be shortened
…
Critical path
a path that has the longest length
minimum time required to complete the project
v0, v1, v4, v7, v8 or v0, v1, v4, v6, v8 (18)
Critical Path
A critical path is a path that has the
longest length. (v0, v1, v4, v7, v8)
Earliest Time
The earliest time of an activity, ai, can occur is the length
of the longest path from the start vertex v0 to ai’s start
vertex.
( Ex: the earliest time of activity a7 can occur is 7.
We denote this time as early(i) for activity ai.
∴ early(6) = early(7) = 7.
Latest Time
The latest time, late(i), of activity, ai, is defined to be the latest
time the activity may start without increasing the project
duration.
Project duration : length of the longest path from start to finish
Ex: early(5) = 5 & late(5) = 8; early(7) = 7 & late(7) = 7
Critical Activity
A critical activity is an activity for which
early(i) = late(i).
The difference between late(i) and early(i)
is a measure of how critical an activity is.
Calculation of Earliest Times
Let activity ai is represented by edge (u, v).
early (i) = earliest [u]
late (i) = latest [v] – duration of activity ai
We compute the times in two stages:
a forward stage and a backward stage.
The forward stage:
Step 1: earliest [0] = 0
Step 2: earliest [j] = max {earliest [i] + duration of
(i, j)}
i is in P(j)
P(j) is the set of immediate predecessors of j.
*Figure 6.42:Computing earliest from topological sort
Calculation of Latest Times
The backward stage:
Step 1: latest[n-1] = earliest[n-1]
Step 2: latest [j] = min {latest [i] - duration of (j, i)}
i is in S(j)
S(j) is the set of vertices adjacent from vertex j.
latest[8] = earliest[8] = 18
latest[6] = min{earliest[8] - 2} = 16
latest[7] = min{earliest[8] - 4} = 14
latest[4] = min{earliest[6] – 9; earliest[7] – 7} = 7
latest[1] = min{earliest[4] - 1} = 6
latest[2] = min{earliest[4] - 1} = 6
latest[5] = min{earliest[7] - 4} = 10
latest[3] = min{earliest[5] - 2} = 8
latest[0] = min{earliest[1] – 6; earliest[2] – 4; earliest[3] – 5} = 0
*Figure 6.43: Computing latest for AOE network of Figure 6.41(a)(p.314)
Graph with non-critical activities deleted
Thank You