AOE网络: 有权的有向图中,顶点代表事件,权值代表事件活动事件,边代表事件活动。入度为零的顶点叫源点,出度=0顶点叫做汇点。
基础概念:
关键路径:在AOE图中,从源点到汇点最长一条路径长度该路径上的各个活动所持续的时间之和)的路径称为关键路径。关键路径是AOE网络最短工期时间。
关键活动:
(1).事件最早发生时间: ve[k]指从源点开始到顶点Vk最大路径长度,活动最早开始时间等于事件最早开始时间:Ve[k]=max{Ve[i]+len<Vi,Vk>}
(2). 事件最迟开始时间:从汇点到ve[k]逆序时间最小值。Vl[k]=min{Vl[j]-len<Vk,vj>};
编程: 求出最早开始时间和最晚开始时间,如果两者相等表示此顶点代表事件是关键事件,关键活动;
package com.Graph;
import java.util.ArrayList;
public class CriticalPath {
public static void main(String[] args) {
int [][]array={{0,1},{0,2},{1,3},{1,4},{2,3},{2,5},{3,4},{4,6},{4,7},{5,7}
,{6,9},{7,8},{8,9}};
int weight[]={3,4,5,6,8,7,3,9,4,6,2,5,3};
int [] VNum={0,1,2,3,4,5,6,7,8,9};
Graph graph=new Graph(VNum, weight.length, array, weight);
criticalPath(graph);
}
public static ArrayList<Integer> criticalPath(Graph graph)
{
int ve[]=new int [graph.Vertex];// 最早开始时间
int vl[]=new int [graph.Vertex];// 最迟开始时间
for(int i=0;i<graph.Vertex;i++)
{
ve[i]=0;
}
/* 求最早开始时间*/
for(int i=0;i<graph.Vertex;i++)
{
EdgeNode edge=graph.graph[i].firstedge;
while(edge!=null)
{
if(ve[i]+edge.Weight>ve[edge.adjvex])
ve[edge.adjvex]=ve[i]+edge.Weight;
edge=edge.nextedge;
}
}
System.out.print("最早开始时间: ");
Print(ve);
/**求 最晚开始时间*/
for(int i=0;i<graph.Vertex;i++)
vl[i]=ve[graph.Vertex-1];
for(int i=graph.Vertex-1;i>=0;i--)
{
EdgeNode edge=graph.graph[i].firstedge;
int ver=graph.graph[i].Vertexnum;
while(edge!=null)
{
if(vl[edge.adjvex]-edge.Weight<vl[ver])
vl[ver]=vl[edge.adjvex]-edge.Weight;
edge=edge.nextedge;
}
}
System.out.print("最晚开始时间: ");
Print(vl);
/**求出关键路径上的关键活动 最晚开始时间-最早开始时间=0的 事件
* **/
ArrayList <Integer> list=new ArrayList<>();
for(int i=0;i<graph.Vertex;i++)
{
if((ve[i]-vl[i])==0)
list.add(i);
}
for(int i=0;i<list.size();i++)
System.out.print(list.get(i)+" ");
return list;
}
public static void Print(int a[])
{
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
System.out.println();
}
}