您的位置:程序门 -> 专题开发/技术/项目 -> 数据结构与算法



关于一个aoe关键路径里问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


关于一个aoe关键路径里问题
发表于:2007-06-04 16:20:18 楼主
打开http://mail.163.com/
用户名yejingjing0723
密码19860723
有一个主题是“问题”的,题目在附件里,那道题目因为有图这里发不了,请大家务必要帮帮我小女子啊,我马上要考试了,我请解答者吃饭哟
发表于:2007-06-04 18:58:191楼 得分:0
没人吗,真的很急啊,拜托了
发表于:2007-06-04 20:56:132楼 得分:0
看了楼主的邮箱.
发现一些楼主的隐私,不过我已经忘记了.算是对得起楼主吧.
楼主的问题以前老师好像教过,不过我也已经忘记了.算是对不起老师吧.
发表于:2007-06-04 23:12:453楼 得分:0
数据结构中关键路径算法的实现与应用

摘     要     介绍求关键路经的算法,对于给出的事件结点网络,要求求出从起点到终点的所有路径,经分析、比较后找出长读最大的路径,从而得出求关键路径的算法,并给出计算机上机实现的源程序。

关键词     关键路径   最少时间

1:引言

通常把计划、施工过程、生产流程、程序流程的都当成一个工程。除了很小的工程外、一般都把工程分为若干个叫做“活动”的子工程。完成了这些“活动”的子工程,这个工程就可以完成了。

通常我们用有向图表示一个工程。在这种有向图中,用顶点表示活动,用有向边

<vi,vj> 表示活动vi必须先于活动vj进行。如果在无有向环的带权有向图中用有向边表示一个工程中的各项活动(activity),用有向边上的权值表示活动的持续时间(duration),用顶点表示事件(event),则这种的有向图叫做用边表示活动的网络,简称aoe(active   on   edges)网络。

        aoe网络在某些工程估算方面非常有用。他可以使人们了解:

                  (1):研究某个工程至少需要多少时间?

                  (2):那些活动是影响工程进度的关键?

在aoe网络中,有些活动可以并行的进行。从源点到各个顶点,以至从源点到汇点的有向路径可能不止一条。这些路径的长度也可能不同。完成不同路径的活动所需的时间虽然不同,但只有各条路径上所有活动都完成了,这个工程才算完成。因此,完成整个工程所需的时间取决于从源点到汇点的最长路径长度,即在这条路径上所有活动的持续时间之和。这条路径长度就叫做关键路径(critical   path)。

2:设计步骤:

    1:   以某一工程为蓝本,采用图的结构表示实际的工程计划的时间。

    2:   调查以分析和预测这个工程计划个阶段的时间。

                    3:   用调查的结果建立aoe网(activity   on   edge   network),即边表示活动的网络,并用图的形式表示。

4:   用图来存储这些信息。

                5:   用creategraphic();函数建立aoe图。

                6:   用searchmappath();函数求出最大路径,并打印出关键路径。

                7:编写代码

                8:   测试

3:   设计代码:

#include <stdio.h>

#include <stdlib.h>

#include <iomanip.h>

#include   <process.h>

//#define   projectnumber     9//10

//#define   plannumber   11//13

typedef   struct   node

{

              int   adjvex;

              int   dut;

              struct   node   *next;

}edgenode;

typedef   struct  

{

              int     projectname;

              int     id;

              edgenode   *link;

}vexnode;

//vexnode   graphicmap[projectnumber];

void   creategraphic(vexnode*   graphicmap,int   projectnumber,int   activenumber)

{

              int   begin,end,duttem;

              edgenode   *p;

              for(int   i=0;i <projectnumber;i++)

              {

                graphicmap[i].projectname=i;

                            graphicmap[i].id   =0;

                            graphicmap[i].link   =null;

              }          

              printf( "某项目的开始到结束在图中的节点输入 <vi,vj,dut> \n ");

              printf( "如:3,4,9   回车表示第三节点到第四节点之间的活动用了9个单位时间\n ");

              for(int   k=0;k <activenumber;k++)

              {

                            scanf( "%d,%d,%d ",&begin,&end,&duttem);

                            p=(edgenode*)malloc(sizeof(edgenode));

                            p-> adjvex   =end-1;

                            p-> dut   =duttem;

                            graphicmap[end-1].id   ++;

                            p-> next   =graphicmap[begin-1].link   ;

                            graphicmap[begin-1].link   =p;

              }

}

int   searchmappath(vexnode*   graphicmap,int   projectnumber,int   activenumber,int&   totaltime)

{

              int   i,j,k,m=0;

              int   front=-1,rear=-1;

              int*   topologystack=(int*)malloc(projectnumber*sizeof(int));//用来保存拓扑排列

              int*   vl=(int*)malloc(projectnumber*sizeof(int));//用来表示在不推迟整个工程的前提下,vj允许最迟发生的时间

        int*   ve=(int*)malloc(projectnumber*sizeof(int));//用来表示vj最早发生时间

              int*   l=(int*)malloc(activenumber*sizeof(int));//用来表示活动ai最迟完成开始时间

              int*   e=(int*)malloc(activenumber*sizeof(int));//表示活动最早开始时间

              edgenode   *p;

              totaltime=0;

              for(i=0;i <projectnumber;i++)   ve[i]=0;

              for(i=0;i <projectnumber;i++)

              {

                            if(graphicmap[i].id==0)

                            {

                                          topologystack[++rear]=i;

                                    m++;

                            }

              }

              while(front!=rear)

              {

                            front++;

                            j=topologystack[front];

                            m++;

                            p=graphicmap[j].link   ;

                            while(p)

                            {

                                          k=p-> adjvex   ;

                                          graphicmap[k].id   --;

                                          if(ve[j]+p-> dut   > ve[k])

                                                        ve[k]=ve[j]+p-> dut   ;

                                          if(graphicmap[k].id   ==0)

                                                        topologystack[++rear]=k;

                                          p=p-> next   ;

                            }

              }

              if(m <projectnumber)

              {

                            printf( "\n本程序所建立的图有回路不可计算出关键路径\n ");

                            printf( "将退出本程序\n ");

                            return   0;

              }

              totaltime=ve[projectnumber-1];

              for(i=0;i <projectnumber;i++)

                            vl[i]=totaltime;

              for(i=projectnumber-2;i> =0;i--)

              {

                            j=topologystack[i];

                            p=graphicmap[j].link   ;

                            while(p)

                            {

                                          k=p-> adjvex   ;

                                          if((vl[k]-p-> dut   ) <vl[j])

                                                        vl[j]=vl[k]-p-> dut   ;

                                          p=p-> next   ;

                            }

              }

              i=0;

              printf( " ¦     起点     ¦     终点     ¦       最早开始时间       ¦       最迟完成时间       ¦     差值     ¦         备注         ¦\n ");

              for(j=0;j <projectnumber;j++)

              {

                            p=graphicmap[j].link;

                            while(p)

                            {

                                          k=p-> adjvex   ;

                                          e[++i]=ve[j];

                                          l[i]=vl[k]-p-> dut;

                                          printf( " ¦     %4d     ¦     %4d     ¦               %4d               ¦               %4d               ¦     %4d     ¦ ",graphicmap[j].projectname   +1,graphicmap[k].projectname   +1,e[i],l[i],l[i]-e[i]);

                                          if(l[i]==e[i])

                                                        printf( "     关键活动     ¦ ");

                                          printf( "\n ");

                                          p=p-> next   ;

                            }

              }

              return   1;

}

void   seekkeyroot()

{

              int   projectnumber,activenumber,totaltime=0;

              system( "cls ");

              printf( "请输入这个工程的化成图形的节点数: ");

              scanf( "%d ",&projectnumber);

        printf( "请输入这个工程的活动个数: ");

        scanf( "%d ",&activenumber);

        vexnode*   graphicmap=(vexnode*)malloc(projectnumber*sizeof(vexnode));

        creategraphic(graphicmap,projectnumber,activenumber);

        searchmappath(graphicmap,projectnumber,activenumber,totaltime);

        printf( "整个工程所用的最短时间为:%d个单位时间\n ",totaltime);

        system( "pause ");

}

int   main()

{

 

              char   ch;

              for(;;)

              {

                            do  

                            {

                                          system( "cls ");

                                          printf( " ¦                                                   欢迎进入求关键路径算法程序                                                       ¦ ");

                        for(int   i=0;i <80;i++)printf( "* ");

                                          printf( "%s ", "(s)tart开始输入工程的节点数据并求出关键路径\n ");

                                          printf( "%s ", "(e)xit退出\n ");

                                          printf( "%s ", "请输入选择: ");

                                          scanf( "%c ",&ch);

                                          ch=toupper(ch);

                            }while(ch!= 's '&&ch!= 'e ');

                    switch(ch)

                    {

                      case 's ':

                        seekkeyroot();

                                          break;

                            case 'e ':  

                                          return   1;

                    }

              }

}

4:   总结:    

至此,全部的设计过程完毕,上面所有代码已经在vc6.0+win2000平台下调试成功。从上面的分析可以看出   ,设计结果与预测的相符合.

关键路径在具体的工程中有着重要的作用,当一个aoe网络中的关键路径只有一条时,加速关键路径上的任一关键活动,能够加速整个工程的完成。但当一个aoe网络中的关键路径不止一条时,加速任一关键活动不一定能够加速整个工程的完成。

如方案1与方案2在改变关键路径时整个工程的进度没有改变。



快速检索

最新资讯
热门点击