可靠性设计分析技术大作业用计算机找系统的最小通路集的算法2015年4月学生姓名学号学校南京航空航天大学学院自动化学院专业自动化专业班级指导老师试验目的通过实验,掌握可靠性分析中的网络分析法,学习利用计算机计算系统可靠性的方法。实验内容针对给定的系统网络图,任选一种计算机语言(MATLAB语言或C语言)编写采用网络分析法求解系统程序的编排思想1.思想①输入节点I作为起始节点;②由起始节点出发,选下一步可到达的节点j;③判断节点j是否走过,若已走过则后退一步,以上一个节点作为起始节点,转②;④判断是否已达到输出节点L,若未到,则把j作为起始点,转②;⑤判断是否已找到了所有的路,若否,则后退两步,把上面两个节点作为起始节点,转②;⑥结束2.由以上可见,计算机算法的关键是要进行几个判断:①判断节点是否与前面走过的节点重复;②判断是否已找到了一条路;③判断是否已找到了所有的路。3.算法参数和符号n:网络中节点数;I:输入节点标号;L:输出节点标号;E:扇出向量;E=(E(1),…,E(I),…,E(n)),表示离开节点1,…,n的弧数。其中E(i)表示节点I下一步可以到达的节点有E(I)个。E阵完全由网络所确定。R:路线矩阵;R=(r(I,k)),I=1,…,n;k=;,…,E(I)。R的第I行记录了节点I可以一步到达的节点标号。R不一定是长方阵,即对不同的行,列数未必相同。为了表示I的下一步的节点已经完全走遍,同时区分出输入节点I,在R的每行再增加一个元素r(I,E(I)+1),当I≠I时,取-1,当I=I时,取0。此时仍称R为G路线矩阵。显然,R阵完全由网络所确定。C:位置向量;C=(C(1),…,C(I),…,C(n)),其中C(j)记录节点j在R中的列号。而元素r(j,Cj)记录j下一步到达的节点标号。F:检验向量;F为定义在节点{1,2,…,n}上的函数,初值为I≠I时,取1,i=L时取-1,其余情况取0。F的作用为:当某个节点j已走过时,F(j)的值就为1。在寻找一条最小路集的过程中,这可以用来判断后面的节点是否与已走过的节点有重复。一旦F(j)=1,表明已达到输出节点L,即找到了一条最小路集。P:输出矩阵;所有最小路集组成的矩阵,其中每一列为由输入节点I到输出节点L的一条最小路集。P的元素P(v,w)记录了第w条最小路集中第v个节点的标号。程序运行的最终结果所用语言:c语言运行平台:Dev-C++5.4.1假设网络如图所示。图3-29桥式网络图3-30有向网络图图3-29从节点1到节点3的运行结果为图3-30运行结果心得体会经过一天的学习,以及以前的知识储备,终于把代码写了出来,最终也能正常运行。在这个过程中查了不少资料,也抄了部分代码,我觉得抄程序是最笨的方法但我认为它是进步最快的方法,抄程序是积累经验的时候,而做项目才是真正把所学为所用的时候,可以说只有你做一个大点的项目出来才能真正是说明你学到了东西,你会用所学的东西,要不然就算你学的再多,不会用也没用。在这个过程中的体会是1.不会的一定要问明白;2.在学习语言的时候一定要记住动手,不要只说不做,这样会行成眼高手低,不管什么样的程序都要亲手做过才能说会了;3.进一步加深对课堂讲授内容的理解。课堂上要讲授许多关于c语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。然而要使用c语言这个工具解决实际问题,又必须掌握它。通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握c语言的语法规定。对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,这是由于大部分学生是初次接触程序设计,缺乏程序设计的实践所致;4.熟悉程序开发环境、学习计算机系统的操作方法。一个c语言程序从编辑、编译、连接到运行,都要在一定的外部操作环境下才能进行。通过上机实验,熟练地掌握c语言开发环境;5.学习上机调试程序。完成程序的编写,决不意味着万事大吉。你认为万无一失的程序,实际上机运行时可能不断出现麻烦。如编译程序检测出一大堆错误。有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。程序的调试是一个技巧性很强的工作,对于初学者来说,尽快掌握程序调试方法是非常重要的。有时候一个消耗你几个小时时间的小小错误,调试高手一眼就看出错误所在。参考文献【1】辛开远.大型网络所有最小路的计算机算法——系统可靠性分析讲座[J].水利电力机械.2004(04)【2】金星,洪延姬,余浩章,王华,李永.大型网络系统最小路集的优化计算方法[J].系统工程学报.2002(01)【3】武小悦,沙基昌.构造网络不交化最小路集的一种新算法[J].系统工程理论与实践.2000(01)附录#includestdio.hmain(){intn,I,L,i,j,w,v;intE[20],C[20],F[20],U[20];intR[20][20],P[20][20];for(i=0;in;i++)for(j=0;jn;j++)P[i][j]=0;for(i=0;in;i++)for(j=0;jn;j++)R[i][j]=0;printf(***用计算机找系统的最小通路集的算法***\n\n);printf(请输入节点数n,输入节点I,输出节点L:\n\t);scanf(%d,%d,%d,&n,&I,&L);printf(\n输入扇出向量E:\n\t);for(i=0;in;i++)scanf(%d,&E[i]);printf(\n输入路线矩阵R:\n\t);for(i=0;in;i++){for(j=0;jE[i];j++)scanf(%d,&R[i][j]);}for(i=0;in;i++){C[i]=1;}j=I;P[0][0]=I;w=1;v=2;for(i=0;in;i++){if(i==I-1)R[i][E[i]]=-1;elseR[i][E[i]]=0;}for(i=0;in;i++){if(i==I-1)F[i]=1;elseif(i==L-1)F[i]=-1;elseF[i]=0;}A:P[v-1][w-1]=R[j-1][C[j-1]-1];{if(R[j-1][C[j-1]-1]0){if(F[R[j-1][C[j-1]-1]-1]0){C[j-1]=C[j-1]+1;gotoA;}else{if(F[R[j-1][C[j-1]-1]-1]==0){j=P[v-1][w-1];F[j-1]=1;v=v+1;gotoA;}else{U[w-1]=v;C[j-1]=C[j-1]+1;{for(i=1;i=U[w-1]-1;i++)P[i-1][w]=P[i-1][w-1];}w=w+1;gotoA;}}}else{if(R[j-1][C[j-1]-1]==0){F[j-1]=0;C[j-1]=1;j=P[v-3][w-1];C[j-1]=C[j-1]+1;v=v-1;gotoA;}else{printf(\n从%d到%d的最小通路集为:\n,I,L);for(i=0;iw-1;i++){{for(j=0;jU[i];j++)printf(%d,P[j][i]);}printf(\n);}}}}}