北航研究生算法(2018精心整理)
北京航空航天大学招收攻读2018年博士学位研究生工作管理办法

北京航空航天大学招收攻读2018年博士学位研究生工作管理办法为加强对北京航空航天大学(以下简称北航)招收攻读2018年博士学位研究生(以下简称博士生)工作的管理,提高博士生选拔质量,确保招生工作科学、规范、公平和安全,依据《中华人民共和国教育法》、《中华人民共和国高等教育法》和《中华人民共和国学位条例》,参照《教育部办公厅关于做好2017年招收攻读博士学位研究生工作的通知》(教学厅〔2017〕2号)和《2014年招收攻读博士学位研究生工作管理办法》(教学〔2014〕4号)有关规定,制定本管理办法。
第一章总则第一条北航招收攻读博士学位研究生是为了培养德智体全面发展、掌握本学科坚实宽广的基础理论和系统深入的专门知识、具有独立从事科学研究工作能力、在科学或专门技术上做出创造性成果的高级专门人才。
第二条博士生招生应坚持社会主义办学方向,为培养社会主义合格建设者和可靠接班人挑选好苗子;坚持科学选拔,积极探索并遵循高层次专业人才选拔规律,采用多样化的考察方式方法,确保生源质量;坚持公平公正,做到政策透明、程序公正、结果公开、监督机制健全,维护考生的合法权益;坚持以人为本,增强服务意识,耐心解释招生政策、认真回答考生问题;统筹考虑学校发展及学科布局,坚持绩效优先的原则,优先保证生源充足、培养质量高、绩效好的学科专业和研究方向招生。
第三条招生专业及导师以学校公布的招生专业目录为准。
第四条招生对象为符合有关学籍、学历、学位要求的中华人民共和国公民。
第五条博士录取类别按就业方式分为定向就业和非定向就业两种,按学习方式分为全日制和非全日制两种,工程博士与高级研修中心专项博士学习方式为非全日制。
第六条博士生招生考试分为初试和复试两个阶段,初试和复试都是博士研究生招生考试的重要组成部分。
招生方式包括本科直博、硕博连读、申请考核与普通招考。
本科直博是指具有推荐免试攻读研究生资格的优秀应届本科毕业生,免除初试,直接进行复试考核的招生方式。
北航研究生数值分析作业第一题

北航研究⽣数值分析作业第⼀题北航研究⽣数值分析作业第⼀题:⼀、算法设计⽅案1.要求计算矩阵的最⼤最⼩特征值,通过幂法求得模最⼤的特征值,进⾏⼀定判断即得所求结果;2.求解与给定数值接近的特征值,可以该数做漂移量,新数组特征值倒数的绝对值满⾜反幂法的要求,故通过反幂法即可求得;3.反幂法计算时需要⽅程求解中间过渡向量,需设计Doolite分解求解;4.|A|=|B||C|,故要求解矩阵的秩,只需将Doolite分解后的U矩阵的对⾓线相乘即为矩阵的Det。
算法编译环境:vlsual c++6.0需要编译函数:幂法,反幂法,Doolite分解及⽅程的求解⼆、源程序如下:#include#include#include#includeint Max(int value1,int value2);int Min(int value1,int value2);void Transform(double A[5][501]);double mifa(double A[5][501]);void daizhuangdoolite(double A[5][501],double x[501],double b[501]); double fanmifa(double A[5][501]); double Det(double A[5][501]);/***定义2个判断⼤⼩的函数,便于以后调⽤***/int Max(int value1,int value2){return((value1>value2)?value1:value2);}int Min(int value1,int value2){return ((value1}/*****************************************//***将矩阵值转存在⼀个数组⾥,节省空间***/void Transform(double A[5][501],double b,double c){int i=0,j=0;A[i][j]=0,A[i][j+1]=0;for(j=2;j<=500;j++)A[i][j]=c;i++;j=0;A[i][j]=0;for(j=1;j<=500;j++)A[i][j]=b;i++;for(j=0;j<=500;j++)A[i][j]=(1.64-0.024*(j+1))*sin(0.2*(j+1))-0.64*exp(0.1/(j+1)); i++;for(j=0;j<=499;j++)A[i][j]=b;A[i][j]=0;i++;for(j=0;j<=498;j++)A[i][j]=c;A[i][j]=0,A[i][j+1]=0;}/***转存结束***///⽤于求解模最⼤的特征值,幂法double mifa(double A[5][501]){int s=2,r=2,m=0,i,j;double b2,b1=0,sum,u[501],y[501];for (i=0;i<=500;i++){u[i] = 1.0;}do{sum=0;if(m!=0)b1=b2;m++;for(i=0;i<=500;i++)sum+=u[i]*u[i];for(i=0;i<=500;i++)y[i]=u[i]/sqrt(sum);for(i=0;i<=500;i++){u[i]=0;for(j=Max(i-r,0);j<=Min(i+s,500);j++)u[i]=u[i]+A[i-j+s][j]*y[j];}b2=0;for(i=0;i<=500;i++)b2=b2+y[i]*u[i];}while(fabs(b2-b1)/fabs(b2)>=exp(-12));return b2;}//带状DOOLITE分解,并且求解出⽅程组的解void daizhuangdoolite(double A[5][501],double x[501],double b[501]) { int i,j,k,t,s=2,r=2;double B[5][501],c[501];for(i=0;i<=4;i++){for(j=0;j<=500;j++)B[i][j]=A[i][j];}for(i=0;i<=500;i++)c[i]=b[i];for(k=0;k<=500;k++){for(j=k;j<=Min(k+s,500);j++){for(t=Max(0,Max(k-r,j-s));t<=k-1;t++)B[k-j+s][j]=B[k-j+s][j]-B[k-t+s][t]*B[t-j+s][j]; }for(i=k+1;i<=Min(k+r,500);i++){for(t=Max(0,Max(i-r,k-s));t<=k-1;t++)B[i-k+s][k]=B[i-k+s][k]-B[i-t+s][t]*B[t-k+s][k]; B[i-k+s][k]=B[i-k+s][k]/B[s][k];}}for(i=1;i<=500;i++)for(t=Max(0,i-r);t<=i-1;t++)c[i]=c[i]-B[i-t+s][t]*c[t];x[500]=c[500]/B[s][500];for(i=499;i>=0;i--){x[i]=c[i];for(t=i+1;t<=Min(i+s,500);t++)x[i]=x[i]-B[i-t+s][t]*x[t];x[i]=x[i]/B[s][i];}}//⽤于求解模最⼤的特征值,反幂法double fanmifa(double A[5][501]){int s=2,r=2,m=0,i;double b2,b1=0,sum=0,u[501],y[501];for (i=0;i<=500;i++){u[i] = 1.0;}do{if(m!=0)b1=b2;m++;sum=0;for(i=0;i<=500;i++)sum+=u[i]*u[i];for(i=0;i<=500;i++)y[i]=u[i]/sqrt(sum);daizhuangdoolite(A,u,y);b2=0;for(i=0;i<=500;i++)b2+=y[i]*u[i];}while(fabs(b2-b1)>=fabs(b1)*exp(-12));return 1/b2;}//⾏列式的LU分解,U的主线乘积即位矩阵的DET double Det(double A[5][501]) {int i,j,k,t,s=2,r=2;for(k=0;k<=500;k++){for(j=k;j<=Min(k+s,500);j++){for(t=Max(0,Max(k-r,j-s));t<=k-1;t++)A[k-j+s][j]=A[k-j+s][j]-A[k-t+s][t]*A[t-j+s][j];}for(i=k+1;i<=Min(k+r,500);i++){for(t=Max(0,Max(i-r,k-s));t<=k-1;t++)A[i-k+s][k]=A[i-k+s][k]-A[i-t+s][t]*A[t-k+s][k];A[i-k+s][k]=A[i-k+s][k]/A[s][k];}}double det=1;for(i=0;i<=500;i++)det*=A[s][i];return det;}void main(){double b=0.16,c=-0.064,p,q;int i,j;double A[5][501];Transform(A,b,c); //进⾏A的赋值cout.precision(12); //定义输出精度double lamda1,lamda501,lamdas;double k=mifa(A);if(k>0) //判断求得最⼤以及最⼩的特征值.如果K>0,则它为最⼤特征值值,//并以它为偏移量再⽤⼀次幂法求得新矩阵最⼤特征值,即为最⼤ //与最⼩的特征值的差{lamda501=k;for(i=0;i<=500;i++)A[2][i]=A[2][i]-k;lamda1=mifa(A)+lamda501;for(i=0;i<=500;i++)A[2][i]=A[2][i]+k;}else //如果K<=0,则它为最⼩特征值值,并以它为偏移量再⽤⼀次幂法//求得新矩阵最⼤特征值,即为最⼤与最⼩的特征值的差{lamda1=k;for(i=0;i<=500;i++)A[2][i]=A[2][i]-k;lamda501=mifa(A)+lamda1;for(i=0;i<=500;i++)A[2][i]=A[2][i]+k;}lamdas=fanmifa(A);FILE *fp=fopen("result.txt","w");fprintf(fp,"λ1=%.12e\n",lamda1);fprintf(fp,"λ501=%.12e\n",lamda501);fprintf(fp,"λs=%.12e\n\n",lamdas);fprintf(fp,"\t要求接近的值\t\t\t实际求得的特征值\n");for(i=1;i<=39;i++) //反幂法求得与给定值接近的特征值{p=lamda1+(i+1)*(lamda501-lamda1)/40;for(j=0;j<=500;j++)A[2][j]=A[2][j]-p;q=fanmifa(A)+p;for(j=0;j<=500;j++)A[2][j]=A[2][j]+p;fprintf(fp,"µ%d: %.12e λi%d: %.12e\n",i,p,i,q);}double cond=fabs(mifa(A)/fanmifa(A));double det=Det(A);fprintf(fp,"\ncond(A)=%.12e\n",cond);fprintf(fp,"\ndetA=%.12e\n",det);}三、程序运⾏结果λ1=-1.069936345952e+001λ501=9.722283648681e+000λs=-5.557989086521e-003要求接近的值实际求得的特征值µ1: -9.678281104107e+000 λi1: -9.585702058251e+000µ2: -9.167739926402e+000 λi2: -9.172672423948e+000µ3: -8.657198748697e+000 λi3: -8.652284007885e+000µ4: -8.146657570993e+000 λi4: -8.0934********e+000µ5: -7.636116393288e+000 λi5: -7.659405420574e+000µ6: -7.125575215583e+000 λi6: -7.119684646576e+000µ7: -6.615034037878e+000 λi7: -6.611764337314e+000µ8: -6.104492860173e+000 λi8: -6.0661********e+000µ9: -5.593951682468e+000 λi9: -5.585101045269e+000µ10: -5.0834********e+000 λi10: -5.114083539196e+000µ11: -4.572869327058e+000 λi11: -4.578872177367e+000µ12: -4.062328149353e+000 λi12: -4.096473385708e+000µ13: -3.551786971648e+000 λi13: -3.554211216942e+000µ14: -3.0412********e+000 λi14: -3.0410********e+000µ15: -2.530704616238e+000 λi15: -2.533970334136e+000µ16: -2.020*********e+000 λi16: -2.003230401311e+000µ17: -1.509622260828e+000 λi17: -1.503557606947e+000µ18: -9.990810831232e-001 λi18: -9.935585987809e-001µ19: -4.885399054182e-001 λi19: -4.870426734583e-001µ20: 2.200127228676e-002 λi20: 2.231736249587e-002µ21: 5.325424499917e-001 λi21: 5.324174742068e-001µ22: 1.043083627697e+000 λi22: 1.052898964020e+000µ23: 1.553624805402e+000 λi23: 1.589445977158e+000µ24: 2.064165983107e+000 λi24: 2.060330427561e+000µ25: 2.574707160812e+000 λi25: 2.558075576223e+000µ26: 3.0852********e+000 λi26: 3.080240508465e+000µ27: 3.595789516221e+000 λi27: 3.613620874136e+000µ28: 4.106330693926e+000 λi28: 4.0913********e+000µ29: 4.616871871631e+000 λi29: 4.603035354280e+000µ30: 5.127413049336e+000 λi30: 5.132924284378e+000µ31: 5.637954227041e+000 λi31: 5.594906275501e+000µ32: 6.148495404746e+000 λi32: 6.080933498348e+000µ33: 6.659036582451e+000 λi33: 6.680354121496e+000µ34: 7.169577760156e+000 λi34: 7.293878467852e+000µ35: 7.680118937861e+000 λi35: 7.717111851857e+000µ36: 8.190660115566e+000 λi36: 8.225220016407e+000µ37: 8.701201293271e+000 λi37: 8.648665837870e+000µ38: 9.211742470976e+000 λi38: 9.254200347303e+000µ39: 9.722283648681e+000 λi39: 9.724634099672e+000cond(A)=1.925042185755e+003detA=2.772786141752e+118四、分析如果初始向量选择不当,将导致迭代中X1的系数等于零.但是,由于舍⼊误差的影响,经若⼲步迭代后,.按照基向量展开时,x1的系数可能不等于零。
北航计算机研究生课程算法设计及解析总结

一、解:第 k 月的需求量 Nk(k=1,2,3,4)状量 Xk:第 k 月初的存量, X1=X5=0,0≤Xk≤ Nk+⋯+N4决策量 Uk:第 k 月的生量, max{0, Nk-Xk} ≤ Uk≤min{6 ,Nk+⋯+N4 - Xk}状移方程: X = Uk + Xk – Nkk+1第 k 月的成本 Vk = *(Xk - Nk) Uk=03 + Uk + *(Uk + Xk - Nk) Uk ≠ 0F k(Xk) 是由第 k 月初的存量 Xk 开始到第 4 月份束段的最成本F k(Xk) = min{Vk + F k+1(X k+1 )}1≤k≤4= min{ 3 + Uk + *(Uk + Xk - Nk) + F k+1(Uk + Xk - Nk) }Uk≠0min{ *(Xk - Nk) + F k+1(Xk - Nk) }Uk=0F5(X5)=0四个月内的最成本F1 (X1)=F 1(0)算步以下:(1) k=40≤X4≤4,max{0,4 - X4}≤U4≤min{6,4-X4}X4 U4 X5 V4 F5(X5) V4 + F5(X5)0 4 0 7 0 7=F4(0)1 3 0 6 0 6=F4(1)2 2 0 5 0 5=F (2)43 1 04 0 4=F4(3)4 0 0 0 0 0=F4(4)即于状 X4 的每个取,都有唯一确定的决策量U4 使得 F4(X4) 最(2) k=30≤X3≤6,max{0,2 - X3} ≤U3≤min{6 , 6-X3}X3 U3 X4 V3 F4(X4) V3 + F4(X4) 0 2 0 5 7 123 1 64 2 85 135 3 46 4 11 0 11=F3(0)1 1 0 4 7 112 1 63 2 7 5 124 3 42 5 4 10 0 10=F3(1) 0 0 0 7 7=F (2)31 1 62 2 6 5 113 3 43 4 4 9 0 90 1 6 =F (3)31 2 5 5 102 3 44 3 4 8 0 80 2 1 5 6=F (4)31 3 42 4 7 0 75 0 3 4 =F3 (5)1 4 6 0 66 0 4 3 0 2=F3(6)(3) k=2 时0≤X2≤9,max{0,3 - X2}≤U2≤min{6,9-X2}X2 U2 X3 V2 F3(X3) V2 + F 3(X3) 0 3 0 6 11 174 1 105 2 9 7 16=F (0)26 3 171 2 0 5 11 163 1 104 2 8 7 15=F2(1)5 3 166 4 11 6 172 1 0 4 11 152 1 103 2 7 7 14=F (2)24 3 155 4 106 166 5 173 0 0 0 11 11=F (3)21 1 102 2 6 7 133 3 144 4 9 6 155 5 166 6 12 2 144 0 1 10 =F (4)21 2 5 7 132 3 133 4 8 6 144 5 155 6 11 2 135 0 2 1 7 8=F (5)21 3 122 4 7 6 133 5 144 6 10 2 126 0 3 8=F (6)21 4 6 6 122 5 133 6 9 2 117 0 4 2 6 8=F (7)21 5 122 6 8 2 108 0 5 8=F2(8)9 1 6 7 2 90 6 3 2 5=F (9)2(4) k=1X1=0,max{0,2} ≤U1≤min{6 , 11}X1 U1 X2 V1 F2(X2) V1 + F2(X2) 0 2 0 5 16 213 1 154 2 8 14 225 3 11 =F1 (0)6 4 11由以上算可得, 4 个月的最成本 F (0) = ( 千元 )1从 k=1 回溯,可得最果中各段的状量Xk 和决策量 Uk 以下表:月份 k 量 Uk 月初存量 Xk 需求量 Nk 每个月成本Vk1 5 0 22 03 3 03 6 0 2 114 0 4 4 0二、解:1、变量设定段 k:已遍 k 个点, k=1,2 ⋯ 6,7 。
2018北京航空航天大学计算机学院考研复试通知复试时间复试分数线复试经验

2018北京航空航天大学计算机学院考研复试通知复试时间复试分数线复试经验启道考研网快讯:2018年考研复试即将开始,启道教育小编根据根据考生需要,整理2017年北京航空航天大学计算机学院考研复试细则,仅供参考:一、复试科目(启道考研复试辅导班)二、复试通知(启道考研复试辅导班)三、复试分数线(启道考研复试辅导班)四、复试流程(启道考研复试辅导班)关于考研复试流程及调剂,启道考研复试辅导班老师解析如下图:五、初试高分为何被刷?初试定资格,复试定结果。
考研初试高分除了保证你能进复试之外,录取是根本无法保证的,这也凸显了复试的重要性。
启道考研复试辅导班建议大家熟读复试注意事项,避免高分被刷情况发生。
1、导师喜欢综合能力更强的学生不少初试高分落榜者会认为“复试有黑幕,存在暗箱操作”。
其实不然,启道考研辅导班帮你找找个人原因。
学生的综合素质对其未来发展是很重要的,面试的目的其实就是想通过直接接触学生来全面地权衡学生的综合素质。
在面试的过程中,评委老师主要会有以下几个考察点:专业知识、运用专业知识的能力、分析研究问题的潜力、逻辑思维能力、语言表达能力以及非语言表达能力。
因为复试直接是人与人打交道,因此高分落榜有很大的人为因素,这种人为因素主要体现在学生的思维活跃性、课外阅读量以及知识延展等方面,“导师一想到你以后将与他三年共事,哪怕你考试考得再好,但你是个书呆子,他怎么会要你?2、复试权重高于初试初试定资格,复试定结果。
换言之,过了笔试线,只是给了你一张船票,但它并不能送你走到最后。
随着研究生招生录取的不断改革,复试的权重越来越高于初试,2017年很多学校的复试比例在1:1.2-1:1.6之间,有些专业硕士甚至达到1:3,这意味着如果录取10人的话,面试者可能是30人,导师的选择性也越来越大。
因此考生在备考时,必须得努力拓展自己的专业知识面。
为了避免各位机械工程学院考研生出现高分被刷的遗憾,启道考研复试辅导班带领大家一起熟悉考研复试的五大禁忌:一、全面了解复试内容大学复试前招生院校会有通知,复试内容一般包括专业课笔试、外语听说能力等,不少院校也将心理测评放到复试的内容当中,与此同时,举止表达和礼仪等方面也在考查范围之内。
北航计算机考研经验

北航计算机考研经验我报的是计算机专硕,不分方向。
初试347分,其中政治72,英语67,数学114,专业课94。
2018年专硕复试线290分/学硕310分;我347分排在第60多名(ps:由于非全日制满足校线的才两人,所以专硕划分比较低,同时由于专硕报名人数多,导致后面复试会刷掉很多专硕,以及分数较低的会调剂到非全日制)。
首先谈初试,北航计算机无论学硕还是专硕考试科目都是一样的。
公共课为英语一、数学一、政治;专业课代码是961,包含组成原理,操作系统和计算机网络三门。
数学一:我大概2017年寒假就下定决心考研了,寒假的时候就在家里看高数书,记笔记。
作为过来人,我不推荐学弟学妹刚开始复习时就自己啃高数书,首先是这些知识点是大一学的,很多都记不清了,自己看书理解可能不会很深刻,其次是高数书比较无聊,会出现看不下去的情况,导致复习时事倍功半。
但是我当时没有及时发现这个问题,直到5月份参加了一次数学模考,发现自己做题时根本就不懂题目考点,在请教一些同学后才开始改过来,在5、6、7月开始疯狂地补数学视频,重新做数学笔记。
所以我的第一个经验就是:学习数学时,最好一边看数学辅导视频,一边做笔记,看完一章后,做相应的辅导习题(高数十八讲、全书等)。
数学150分,是一个特别容易拉分的学科,也是整个考研期间不间断学习的学科,整体时间分配大概是暑假前完成高数十八讲以及线性代数和概率论的基础。
暑假期间属于高数强化阶段做1000题或者660题,并弄清每个题目的考点。
然后9月开始(最迟10月,不然真题训练量不够)开始做数学真题、8套卷、四套卷,并可以将真题的错误记录在改错本上。
同时留出3套左右的试卷,以便在11、12月份自己进行模拟考试。
数学考试在考研第二天08:30~11:30,三个小时的时间。
所以学弟学妹们在学习数学时,也尽量拿上午的时间来学习。
英语一:英语是我的弱项,我英语四级考了两次才过。
但是学弟学妹们不要慌,只要把英语的得分点弄明白然后专攻得分点,也能拿到不错的成绩。
北航机械工程及自动化学院2018年研究生招生方案

北航机械工程及自动化学院2018年研究生招生方案一、机械学院复试资格基本线根据2018年硕士研究生招生初试成绩统计结果和各学科招生规模情况,经机械学院研究生招生工作领导小组讨论决定,2018年硕士研究生招生复试资格基本线如下:考试方式一志愿报考专业[专业代码]总分单科单科(满分=100分)(满分>100分)全国统考(不含少数民族骨干计划和退役大学生计划)机械工程[080200]3104060材料加工工程[080503]3104060航空宇航制造工程[082503]3104060机械工程(专业学位)[085201]2904060强军计划无退役大学生计划说明:初试各项成绩(包括总分、政治、外国语、业务课1和业务课2)达到报考第一志愿专业:机械学院复试资格基本线的考生可参加机械学院复试。
机械学院不接收一志愿未报考本院考生的调剂申请。
上线学生自动获得一志愿报考专业复试资格,学院不再单独通知,名单见附件4。
二、机械学院硕士研究生复试工作小组组长:丁希仑副组长:蔡军成员:边宇枢、李刘合、李东升、陈华伟、杨民、刘静华、陈殿生、郑联语秘书:乐悦三、机械学院硕士研究生思政考核工作小组由学院分党委委员、党员系所主任、系所党支部书记组成,名单如下:组长:邓怡成员:丁希仑、蔡军、周正干、李东升、于靖军、从保强、边宇枢、吴琼、李刘合、郭伟、孟宝、陈华伟、彭翀、杨民、文力、刘静华、宫浩钦、陈殿生、王巍、郑联语、杜福洲四、体检通知复试考生由北航校医院统一组织体格检查,详情查询北航校医院主页公告通知栏:体检表由校医院统一发放,请带好现金131元、一寸照片与签字笔。
校医院安排机械学院考生在3月17日体检。
因北航全校上线考生较多,报考机械学院的在京考生推荐在3月11日(周日)参加体检,尽量避开体检高峰。
考生体检报告收取时间:3月19日-3月21日,地点:新主楼A828,体检不合格者不予录取。
五、复试资格审查机械学院按照北航研招网上公布的“2018年硕士研究生招生复试资格基本线及复试规定”要求,对考生的复试资格进行严格审查。
(完整word版)北航研究生算法设计与分析Assignment_2

用分支定界算法求以下问题:某公司于乙城市的销售点急需一批成品,该公司成品生产基地在甲城市。
甲城市与乙城市之间共有n 座城市,互相以公路连通。
甲城市、乙城市以及其它各城市之间的公路连通情况及每段公路的长度由矩阵M1 给出。
每段公路均由地方政府收取不同额度的养路费等费用,具体数额由矩阵M2 给出。
请给出在需付养路费总额不超过1500 的情况下,该公司货车运送其产品从甲城市到乙城市的最短运送路线。
具体数据参见文件:m1.txt: 各城市之间的公路连通情况及每段公路的长度矩阵(有向图); 甲城市为城市Num.1,乙城市为城市Num.50。
m2.txt: 每段公路收取的费用矩阵(非对称)。
思想:利用Floyd算法的基本方法求解。
程序实现流程说明:1.将m1.txt和m2.txt的数据读入两个50×50的数组。
2.用Floyd算法求出所有点对之间的最短路径长度和最小费用。
3.建立一个堆栈,初始化该堆栈。
4.取出栈顶的结点,检查它的相邻的所有结点,确定下一个当前最优路径上的结点,被扩展的结点依次加入堆栈中。
在检查的过程中,如果发现超出最短路径长度或者最小费用,则进行”剪枝”,然后回溯。
5.找到一个解后,保存改解,然后重复步骤4。
6.重复步骤4、5,直到堆栈为空,当前保存的解即为最优解。
时间复杂度分析:Floyd算法的时间复杂度为3O N,N为所有城市的个数。
()该算法的时间复杂度等于DFS的时间复杂度,即O(N+E)。
其中,E为所有城市构成的有向连通图的边的总数。
但是因为采用了剪枝,会使实际运行情况的比较次数远小于E。
求解结果:算法所得结果:甲乙之间最短路线长度是:464最短路线收取的费用是:1448最短路径是:1 3 8 11 15 21 23 26 32 37 39 45 47 50C源代码(注意把m1.txt与m2.txt放到与源代码相同的目录下,下面代码可直接复制运行):#include<stdlib.h>#include<stdio.h>#include<time.h>#include<string.h>#define N 50#define MAX 52void input(int a[N][N],int b[N][N]);void Floyd(int d[N][N]);void fenzhi(int m1[N][N],int m2[N][N],int mindist[N][N],int mincost[N][N]);int visited[N],bestPath[N];void main(){clock_t start,finish;double duration;int i,j,mindist[N][N],mincost[N][N],m1[N][N],m2[N][N]; /* m1[N][N]和m2[N][N]分别代表题目所给的距离矩阵和代价矩阵*/// int visited[N],bestPath[N];FILE *fp,*fw;// system("cls");time_t ttime;time(&ttime);printf("%s",ctime(&ttime));start=clock();for(i=0;i<N;i++){visited[i]=0;bestPath[i]=0;}fp=fopen("m1.txt","r"); /* 把文件中的距离矩阵m1读入数组mindist[N][N] */if(fp==NULL){printf("can not open file\n");return;}for(i=0;i<N;i++)for(j=0;j<N;j++)fscanf(fp,"%d",&mindist[i][j]);fclose(fp); /* 距离矩阵m1读入完毕*/fp=fopen("m2.txt","r"); /* 把文件中的代价矩阵m2读入数组mincost[N][N] */if(fp==NULL){printf("can not open file\n");return;}for(i=0;i<N;i++)for(j=0;j<N;j++)fscanf(fp,"%d",&mincost[i][j]);fclose(fp); /* 代价矩阵m2读入完毕*/input(m1,mindist); /* mindist[N][N]赋值给m1[N][N],m1[N][N]代表题目中的距离矩阵*/input(m2,mincost); /* mincost[N][N]赋值给m2[N][N],m2[N][N]代表题目中的代价矩阵*/for(i=0;i<N;i++) /* 把矩阵mindist[i][i]和mincost[i][i]的对角元素分别初始化,表明城市到自身不连通,代价为0 */{mindist[i][i]=9999;mincost[i][i]=0;}Floyd(mindist); /* 用弗洛伊德算法求任意两城市之间的最短距离,结果存储在数组mindist[N][N]中*//*fw=fopen("1.txt","w");for(i=0;i<N;i++){for(j=0;j<N;j++)fprintf(fw,"%4d ",mindist[i][j]);fprintf(fw,"\n");}fclose(fw);// getchar();//*/Floyd(mincost); /* 用弗洛伊德算法求任意两城市之间的最小代价,结果存储在数组mincost[N][N]中*//*fw=fopen("2.txt","w");for(i=0;i<N;i++){for(j=0;j<N;j++)fprintf(fw,"%4d ",mincost[i][j]);fprintf(fw,"\n");}fclose(fw);// getchar();//*/fenzhi(m1,m2,mindist,mincost); /* 调用分支定界的实现函数,寻找出所有的可行路径并依次输出*/finish=clock();duration = (double)(finish - start) / CLOCKS_PER_SEC;printf( "%f seconds\n", duration );//*/}void Floyd(int d[N][N]) /* 弗洛伊德算法的实现函数*/{int v,w,u,i;for(u=0;u<N;u++){for(v=0;v<N;v++){for(w=0;w<N;w++)if(d[v][u]+d[u][w]<d[v][w]){//printf("v,w,u,d[v][u],d[u][w],d[v][w] %d %d %d %d %d %d",v+1,w+1,u+1,d[v][u],d[u][w],d[v][ w]);getchar();d[v][w]=d[v][u]+d[u][w];}}}}void input(int a[N][N],int b[N][N]) /* 把矩阵b赋值给矩阵a */{int i,j;for(i=0;i<N;i++)for(j=0;j<N;j++)a[i][j]=b[i][j];}void fenzhi(int m1[N][N],int m2[N][N],int mindist[N][N],int mincost[N][N]){int stack[MAX],depth=0,next,i,j; /* 定义栈,depth表示栈顶指针;next指向每次遍历时当前所处城市的上一个已经遍历的城市*/int bestLength,shortestDist,minimumCost,distBound=9999,costBound=9999;int cur,currentDist=0,currentCost=0; /* cur指向当前所处城市,currentDist和currentCost分别表示从甲城市到当前所处城市的最短距离和最小代价,currentDist和currentCost初值为0表示从甲城市出发开始深度优先搜索*/stack[depth]=0; /* 对栈进行初始化*/stack[depth+1]=0;visited[0]=1; /* visited[0]=1用来标识从甲城市开始出发进行遍历,甲城市已被访问*/while(depth>=0) /* 表示遍历开始和结束条件,开始时从甲城市出发,栈空,depth=0;结束时遍历完毕,所有节点均被出栈,故栈也为空,depth=0 *//* 整个while()循环体用来实现从当前的城市中寻找一个邻近的城市*/{cur=stack[depth]; /* 取栈顶节点赋值给cur,表示当前访问到第cur号城市*/ next=stack[depth+1]; /* next指向当前所处城市的上一个已经遍历的城市*/for(i=next+1;i<N;i++) /* 试探当前所处城市的每一个相邻城市*/{if((currentCost+mincost[cur][N-1]>costBound)||(currentDist+mindist[cur][N-1]>=distBound)){ /* 所试探的城市满足剪枝条件,进行剪枝*///printf("here1 %d %d %d %d %d %d %d\n",cur,currentCost,mincost[cur][49],costBound,curre ntDist,mindist[cur][49],distBound); getchar();//printf("%d %d %d %d %d %d",cur,i,m1[cur][i],currentCost,mincost[cur][49],costBound); getchar();continue;}if(m1[cur][i]==9999) continue; /* 所试探的城市不连通*/if(visited[i]==1) continue; /* 所试探的城市已被访问*/if(i<N) break; /* 所试探的城市满足访问条件,找到新的可行城市,终止for循环*/ }if(i==N) /* 判断for循环是否是由于搜索完所有城市而终止的,如果是(i==N),进行回溯*/{// printf("here");getchar();depth--;currentDist-=m1[stack[depth]][stack[depth+1]];currentCost-=m2[stack[depth]][stack[depth+1]];visited[stack[depth+1]]=0;}else /* i!=N,表示for循环的终止是由于寻找到了当前城市的一个可行的邻近城市*/{//printf("%d %d %d %d %d %d\n",cur,i,m1[stack[depth]][i],m2[stack[depth]][i],currentCost,curre ntDist);//getchar();currentDist+=m1[stack[depth]][i]; /* 把从当前所处城市到所找到的可行城市的距离加入currentDist */currentCost+=m2[stack[depth]][i]; /* 把从当前所处城市到所找到的可行城市的代价加入currentCost */depth++; /* 所找到的可行城市进栈*/stack[depth]=i; /* 更新栈顶指针,指向所找到的可行城市*/stack[depth+1]=0;visited[i]=1; /* 修改所找到的城市的访问标志*/if(i==N-1) /* i==N-1表示访问到了乙城市,完成了所有城市的一次搜索,找到一条通路*/{// printf("here\n");for(j=0;j<=depth;j++) /* 保存当前找到的通路所经过的所有节点*/ bestPath[j]=stack[j];bestLength=depth; /* 保存当前找到的通路所经过的所有节点的节点数*/shortestDist=currentDist; /* 保存当前找到的通路的距离之和*/minimumCost=currentCost; /* 保存当前找到的通路的代价之和*///costBound=currentCost;distBound=currentDist; /* 更新剪枝的路径边界,如果以后所找到的通路路径之和大于目前通路的路径之和,就剪枝*/if(minimumCost>1500) continue; /* 如果当前找到的通路的代价之和大于1500,则放弃这条通路*/printf("最短路径:%3d,路径代价:%3d,所经历的节点数目:%3d,所经历的节点如下:\n",shortestDist,minimumCost,bestLength+1); /* 输出找到的通路的结果*/bestPath[bestLength]=49;for(i=0;i<=bestLength;i++) /* 输出所找到的通路所经过的具体的节点*/ printf("%3d ",bestPath[i]+1);(完整word版)北航研究生算法设计与分析Assignment_2 printf("\n");depth--; /* 连续弹出栈顶的两个值,进行回溯,开始寻找新的可行的通路*/currentDist-=m1[stack[depth]][stack[depth+1]];currentCost-=m2[stack[depth]][stack[depth+1]];visited[stack[depth+1]]=0;depth--;currentDist-=m1[stack[depth]][stack[depth+1]];currentCost-=m2[stack[depth]][stack[depth+1]];visited[stack[depth+1]]=0;// getchar();}}}}。
北航研究生数值分析编程大作业1

数值分析大作业一、算法设计方案1、矩阵初始化矩阵[]501501⨯=ij a A 的下半带宽r=2,上半带宽s=2,设置矩阵[][]5011++s r C ,在矩阵C 中检索矩阵A 中的带内元素ij a 的方法是:j s j i ij c a ,1++-=。
这样所需要的存储单元数大大减少,从而极大提高了运算效率。
2、利用幂法求出5011λλ,幂法迭代格式:0111111nk k k k kk T k k k u R y u u Ay y u ηηβ------⎧∈⎪⎪=⎪=⎨⎪=⎪⎪=⎩非零向量 当1210/-≤-k k βββ时,迭代终止。
首先对于矩阵A 利用幂法迭代求出一个λ,然后求出矩阵B ,其中I A B λ-=(I 为单位矩阵),对矩阵B 进行幂法迭代,求出λ',之后令λλλ+'='',比较的大小与λλ'',大者为501λ,小者为1λ。
3、利用反幂法求出ik s λλ,反幂法迭代格式:0111111nk k k k kk T k k k u R y u Au y y u ηηβ------⎧∈⎪⎪=⎪=⎨⎪=⎪⎪=⎩非零向量 当1210/-≤-k k βββ时,迭代终止,1s k λβ=。
每迭代一次都要求解一次线性方程组1-=k k y Au ,求解过程为:(1)作分解LU A =对于n k ,...,2,1=执行[][]s k n r k k k i c c c c c n s k k k j c cc c k s ks k t k s k r i t t s t i k s k i k s k i js j t k s j r k t t s t k j s j k j s j k <+++=-=++=-=+++----=++-++-++-++----=++-++-++-∑∑);,min(,...,2,1/)(:),min(,...,1,:,1,11),,1max(,1,1,1,11),,1max(,1,1,1(2)求解y Ux b Ly ==,(数组b 先是存放原方程组右端向量,后来存放中间向量y))1,...,2,1(/)(:/:),...,3,2(:,1),min(1.1.11),1max(,1--=-===-=+++-++-+--=++-∑∑n n i c x c b x c b x n i b c b b i s t n s i i t t s t i i i ns n n ti r i t t s t i i i使用反幂法,直接可以求得矩阵按模最小的特征值s λ。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一:判断题1、一个正确的算法,对于每个合法输入,都会在有限的时间内输出一个满足要求的结果。
(对)2、NP完全问题比其他所有NP问题都要难。
(错)3、回溯法用深度优先法或广度优先法搜索状态空间树。
(错,仅深度优先)4、在动态规划中,各个阶段所确定的策略就构成一个策略序列,通常称为一个决策。
(错)5、P类和NP类问题的关系用P⊂NP来表示是错误的。
(错)6、若近似算法A求解某极小化问题一实例的解为Sa,且已知该问题的最优解为Sa/3,则该近似算法的性能比为3。
(错)7、通常来说,算法的最坏情况的时间复杂行比平均情况的时间复杂性容易计算。
(对)8、若P2多项式时间转化为(polynomial transforms to)P1,则P2至少与P1一样难。
(错)9、快速排序算法的平均时间复杂度是O(nlogn),使用随机化快速排序算法可以将平均时间复杂度降得更低。
(错)10、基于比较的寻找数组A[1,…,n]中最大元素的问题下届是Ω(n/3)。
(错)11、O(f(n))+O(g(n))=O(min{f(n),g(n)})(错)12、若f(n)=Ω(g(n)),g(n)=Ω(h(n)),则f(n)=Ω(h(n))(对)13、若f(n)=O(g(n)),则g(n)=Ω(f(n))(对)14、贪婪技术所做的每一步选择所产生的部分解,不一定是可行性的。
(错)15、LasVegas算法只要给出解就是正确的。
(对)16、一个完全多项式近似方案是一个近似方案{Aε},其中每一个算法Aε在输入实例I的规模的多项式时间内运行。
(错)二:简答1、二叉查找树属于减治策略的三个变种中的哪一个的应用?什么情况下二叉查找树表现出最差的效率?此时的查找和插入算法的复杂性如何?答:减治策略有3个主要的变种,包括减常量、减常数因子和减可变规模。
(1) 二叉查找树属于减可变规模变种的应用。
(2) 当先后插入的关键字有序时,构成的二叉查找树蜕变为单支树,树的深度等于n,此时二叉查找树表现出最差的效率,(3) 查找和插入算法的时间效率都属于Θ(n)。
2、何谓伪多项式算法?如何将一Monte Carlo算法转化为Las Vegas算法?答:若一个数值算法的时间复杂度可以表示为输入数值N的多项式,但其运行时间与输入数值N的二进制位数呈指数增长关系,则称其时间复杂度为伪多项式时间。
Las Vegas算法不会得到不正确的解。
一旦用拉斯维加斯算法找到一个解,这个解就一定是正确解。
但有时用拉斯维加斯算法找不到解。
Monte Carlo算法每次都能得到问题的解,但不保证所得解的准确性转化:可以在Monte Carlo算法给出的解上加一个验证算法,如果正确就得到解,如果错误就不能生成问题的解,这样Monte Carlo算法便转化为了Las Vegas算法。
3、构造AVL树和2-3树的主要目的是什么?它们各自有什么样的查找和插入的效率?答:(1)当先后插入的关键字有序时,构成的二叉查找树蜕变为单支树,树的深度等于n,此时二叉查找树表现出最差的效率,为了解决这一问题,可以构造AVL树或2-3树,使树的深度减小。
一棵AVL树要求它的每个节点的左右子树的高度差不能超过1。
2-3树和2-3-4树允许一棵查找树的单个节点不止包含一个元素。
(2) AVL树在最差情况下,查找和插入操作的效率属于Θ(lgn)。
2-3树无论在最差还是平均情况下,查找和插入的效率都属于Θ(log n)。
4、写出0/1背包问题的一个多项式等价(Polynomial Equivalent)的判定问题,并说明为什么它们是多项式等价的。
答:0/1背包问题:从M件物品中,取出若干件放在空间为W的背包里,给出一个能获得最大价值的方案。
每件物品的体积为W1,W2……Wn,与之相对应的价值为P1,P2……Pn。
+判定问题I:从M件物品中,取出若干件放在空间为W的背包里,是否存在一个方案,所获价值≥P*?。
每件物品的体积为W1,W2……Wn,与之相对应的价值为P1,P2……Pn。
若判定问题I存在多项式时间的解法,则反复调用该算法就可以在多项式时间内解决0/1背包的优化问题。
因而这个判定问题与原问题多项式等价。
5、下面问题是否属于NP问题?为什么?问题表述:给定图中的两个点、,整数和,图中每条边的长度及便利这条边的时间,问图中是否存在一条由到的路径,使得其长度大于,且遍历时间小于?答:这个问题属于NP问题。
因为若给出该问题的一个解,可以在多项式时间内检验这个解的正确性。
如给出一条由p到q的路径,可以在多项式时间内计算出它的长度及遍历时间,然后分别与C和t进行比较,从而可以判断这个解的对错。
分治题1.写出一个求解下列问题的分治算法,推导其时间复杂性并与蛮力法相比较。
给定互不相等的n个数的一个序列,若其中某两个数和的关系为:且,则称和是逆序的。
要求计算该序列中的逆序个数,即具有逆序关系的元素对的总数目。
解:/** *求解n个数的一个序列,具有逆序关系的元素对的总数目*/count = 0; //逆序元素对的全局计数变量mergeInvertedPairs(A,low,mid,high) {i = low;j = mid+1;k = low;tmp[n]; //用于归并排序的辅助数组while i <= mid && j <= high {if (A[i] > A[j]) {tmp[k] = A[j++];count += (mid-i+1); //相比归并排序,就多了这一条语句} else {tmp[k] = A[i++];}k++;}while i <= mid {tmp[k++] = A[i++];}while j <= high {tmp[k++] = A[j++];}for (j = low; j <= high; j++) {A[j] = tmp[j];}}findInvertedPairs(A[], low, high) {if (low < high) {mid = (low+high) / 2;findInvertedPairs(A,low,mid);findInvertedPairs(A,mid+1,high);mergeInvertedPairs(A,low,mid,high);}算法思路:以归并排序为基础,在两两集合合并的时候如果前一个集合的元素a[i]>a[j],那么说明需要调整次序,逆序数num=num+mid-i。
时间复杂度的迭代公式为11;(n)2(n/2)(n)n1;nTT O=⎧=⎨+>⎩因此算法的时间复杂度为T(n)=O(nlogn);蛮力法的时间复杂度为O(n2),当n数目较大时,分治法计算规模远小于蛮力法。
2.为一个整数序列,中的整数如果在中出现次数多余,那么称为多数元素。
例如,在序列中3是多数元素,因为出现了4次,大于。
求A的多数元素问题的蛮力算法复杂性如何?设计一个具有变治思想的算法,提高蛮力算法的效率,写出伪代码并分析其事件复杂性。
2. num <- src[0];count <-0;for i <-0 to n-1do{if(num == src[i]){count++;}else{count--;if(count <0){num <- src[i];count = 0;}}}采用减治的思想每一个减去一个元素,时间复杂度为O(n),蛮力法的时间复杂度为O(n2)。
动态规划题1.某工厂调查了解市场情况,估计在今后四个月内,市场对其产品的需求量如下表所示。
已知:对每个月来讲,生产一批产品的固定成本费为3(千元),若不生成,则为零。
每生产单位产品的成本费为1(千元)。
同时,在任何一个月内,生产能力所允许的最大生产批量为不超过6个单位。
又知:每单位产品的库存费用为每月0.5(千元),同时要求在第一个月开始之初,及在第四个月末,均无产品库存。
问:在满足上述条件下,该厂应如何安排各个时期的生产与库存,使所花的总成本费用最低?写出你所设的状态变量、决策变量、状态转移方程与递推关系式,和手工求解的详细步骤及结果。
解:设阶段序数k表示月份,状态变量x k为第k个月初拥有的单位产品数量,亦为第k-1月末时的单位产品数量,决策变量u k为第k个月生产的单位产品数量,c k为第k月份需要的产品数量,这里x k和u k均取离散变量。
状态转移方程为: , k =1,2,3,4; 且x1=0。
k段允许决策集合为: k = 1,2,3;当k=4时,。
设为第k月的成本费,单位为(千元),则,故指标函数为令表示为由出发采用最优生产方案到第4个月结束这段期间的产品成本。
根据最优化原理,则有递推公式:其中:逆序计算的详细步骤如下:(1)当k=4时,(2)当k=3时,因为,且所以有:当此时在处取得最小值。
当,此时在处取得最小值。
当,此时在处取得最小值。
当,此时,在处取得最小值。
当,此时,在处取得最小值。
当,此时,在处取得最小值。
当,此时,在处取得最小值。
(3)当k=2时,因为,且所以有:当时,,在处取得最小值。
当时,,且在处取得最小值。
当时,,在处取得最小值。
当时,,且在处取得最小值。
当时,,且在处取得最小值。
当时,,且在处取得最小值。
当时,,且在处取得最小值。
(4)当k=1时,因为,所以有:当,,且在处取得最小值。
综上所述,最优的库存方案为:第一月生产5单位产品,第二月和第四月不生产,第三月生产6单位产品。
2.用动态规划方法手工求解以下问题有8万元的投资可以投给3个过目,每个项目在不同筒子数额下(以万元为单位)的利润如下表请安排投资计划,使总的利润最大。
写出你所设的状态变量、决策变量、状态转移方程与递推关系式和手工求解的详细步骤及结构。
解:状态变量:x k 表示留给项目k..n的投资额,其中n为项目总个数,k=1..n.决策变量:u k 表示投给项目k的投资额.允许决策集合:状态转移方程:递推关系式:其中,表示项目k的投资额为u k时的盈利.针对本题,n = 3,x k最大取8手工详解过程:1.初始化k = 32.k = 23.k = 1最终结果:给项目1投资4万元,项目2投资4万元,项目3不投资,将获得最大利润140万元.线路题的某种深搜解法:1)可以根据线路(l1,l2,...,lm)的取舍构建一棵m层二叉搜索树。
第i层的所有左分支表示铺设线路li,右分支则表示不铺设。
如果存在可行解,遍历此二叉搜索树即可找到最优解。
2)前进:当前节点未被剪枝并且仍有子节点即可继续前进。
分支:先遍历左分支,后遍历右分支。
回溯:左右分支都被遍历时返回父节点。
剪枝:剪枝条件如下:1。