算法分析大作业
最优化方法大作业-算法源程序-0.618法、抛物线法、共轭梯度法

最优化方法程序作业专业:油气储运工程班级:姓名:学号:一、开发工具该应用程序采用的开发工具是Visual studio 2005,编程语言使用的是C#。
二、程序代码(1)0.618法和抛物线法求ψ(t)=sint,初始点t0=1①主程序:using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Collections;public partial class_Default : System.Web.UI.Page{JiSuan JS = new JiSuan();protected void Button1_Click(object sender, EventArgs e){double xx0 = 0.01;//步长double tt0 = 1, pp = 2, qq = 0.5;ArrayList list1 = new ArrayList();list1 = (ArrayList)JS.SuoJian(xx0, tt0, pp, qq);//调用倍增半减函数double aa = double.Parse(list1[0].ToString());double bb = double.Parse(list1[1].ToString());txtShangxian.Text = bb.ToString();//在页面上显示极小区间txtXiaxian.Text = aa.ToString();ArrayList list2 = new ArrayList();list2 = (ArrayList)JS.JiXiao1(aa, bb);//调用0.618法函数double jixiao1 = double.Parse(list2[0].ToString());double fjixiao1 = double.Parse(list2[1].ToString());txtJixiao1.Text = jixiao1.ToString();//在页面上显示极小点txtFjixiao1.Text = fjixiao1.ToString();//在页面上显示极小点处的函数值ArrayList list3 = new ArrayList();list3 = (ArrayList)JS.JiXiao2(aa, bb);//调用抛物线法函数double jixiao2 = double.Parse(list3[0].ToString());double fjixiao2 = double.Parse(list3[1].ToString());txtJixiao2.Text = jixiao2.ToString();//在页面上显示极小点txtFjixiao2.Text = fjixiao2.ToString();//在页面上显示极小点处的函数值 }}②各个子函数的程序:using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Collections;///<summary>/// JiSuan 的摘要说明///</summary>public class JiSuan{public JiSuan(){//// TODO: 在此处添加构造函数逻辑//}//目标函数public double f(double z){double zz = Math.Sin(z);return zz;}//倍增半减函数public ArrayList SuoJian(double x0, double t0, double p, double q){double t1;double f0, f1;double x1, t2;double f2;double a = 0, b = 0, c = 0;double fa, fc, fb;double t3, f3;bool biaozhi1 = true;//设置是否循环的标志bool biaozhi2 = true;t1 = t0 + x0;f0 = f(t0);//调用目标函数f1 = f(t1);if (f0 > f1){while (biaozhi1){x1 = p * x0;t2 = t1 + x1;f2 = f(t2);//调用目标函数if (f1 > f2){t0 = t1;t1 = t2;f0 = f1;f1 = f2;continue;}else{a = t0;c = t1;b = t2;fa = f0;fc = f1;fb = f2;break;}}}else{t3 = t1;f3 = f1;t1 = t0;f1 = f0;t0 = t3;f0 = f3;while (biaozhi2){x1 = q * x0;t2 = t1 - x1;f2 = f(t2);//调用目标函数if (f1 > f2){t0 = t1;t1 = t2;f0 = f1;f1 = f2;continue;}else{a = t2;c = t1;b = t0;fa = f2;fc = f1;fb = f0;break;}}}ArrayList list = new ArrayList();list.Add(a);list.Add(b);return list;}//0.618法函数public ArrayList JiXiao1(double a, double b) {double jd = 0.0001;//精度double p = 0.618;double t1, t2;double f1, f2;double jixiao=0;//极小点bool biaozhi1 = true;//设置是否循环标志bool biaozhi2 = true;while (biaozhi1){t1 = a + (1 - p)*(b - a);t2 = a + p * (b - a);f1 = f(t1);//调用目标函数f2 = f(t2);while (biaozhi2){if (f1 < f2){b = t2;t2 = t1;f2 = f1;t1 = a + (1 - p)*(b - a); f1 = f(t1);//调用目标函数if (Math.Abs(b - a) > jd) {continue;}else{biaozhi1 = false;break;}}else if (f1 == f2){a = t1;b = t2;if (Math.Abs(b - a) > jd) {break;}else{biaozhi1 = false;break;}}else if (f1 > f2){a = t1;t1 = t2;f1 = f2;t2 = a + p * (b - a);f2 = f(t2);//调用目标函数if (Math.Abs(b - a) > jd){continue;}else{biaozhi1 = false;break;}}}}jixiao = (a + b) / 2;double fjixiao = f(jixiao);//调用目标函数ArrayList list = new ArrayList();list.Add(jixiao);list.Add(fjixiao);return list;}//抛物线法函数public ArrayList JiXiao2(double a, double b){double jd = 0.0001;//精度double c = a + (b - a) / 2;//将c的值设为a、b点的中点double fa, fb, fc, c1, c2;double jixiao = 0;//极小点double ta, fta;double fac;bool biaozhi1 = true;//设置是否循环标志while (biaozhi1){fa = f(a);//调用目标函数fb = f(b);fc = f(c);c1 = (fb - fa) / (b - a);c2 = ((fc - fa) / (c - a) - c1) / (c - b);if (c2 == 0){jixiao = c;break;}else{ta = 0.5 * (a + b - (c1 / c2));fta = f(ta);//调用目标函数if (Math.Abs(b - a) <= jd){jixiao = ta;break;}else{if (fc > fta){if (c > ta){b = c;fb = fc;c = ta;fc = fta;continue;}else{a = c;fa = fc;c = ta;fc = fta;continue;}}else if (fc == fta){if (c > ta){a = ta;b = c;c = (c + ta) / 2;fa = fta;fb = fc;fc = f(c);//调用目标函数continue;}else if (c == ta){fac = f((a + c) / 2);//调用目标函数if (fac < fc){c = (a + c) / 2;fc = f(c);//调用目标函数b = ta;fb = fta;continue;}else{a = (a + c) / 2;fa = f(a);//调用目标函数continue;}}else if (c < ta){a = c;c = (c + ta) / 2;b = ta;fa = fc;fb = fta;fc = f(c);//调用目标函数continue;}}else if (fc < fta){if (c > ta){a = ta;fa = fta;continue;}else{b = ta;fb = fta;continue;}}}}}double fjixiao = f(jixiao);//调用目标函数ArrayList list = new ArrayList();list.Add(jixiao);list.Add(fjixiao);return list;}}(2)共轭梯度法求函数极小点:f(x)=1.5x12+0.5x22-x1x2-2x1;初始点为(-2,4)①主程序:using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Collections;public partial class_Default : System.Web.UI.Page{JiSuan JS = new JiSuan();protected void Button1_Click(object sender, EventArgs e){//共轭梯度法求极小值double[] x0 = new double[2];//定义二维数组double[] x = new double[2];x0[0] = -2;x0[1] = 4;double x00 = -2;double x01 = 4;double jd = 0.0001;//精度bool biaozhi1 = true;//设置是否循环的标志bool biaozhi2 = true;double y;//定义关于x的函数值double[] g = new double[2];//定义函数在点x处的梯度值double[] p = new double[2];double ggm, ggo=0;double jixiao;double x1=0, x2=0, fy=0;int i;for (int j = 0; j < 2; j++){x[j] = x0[j];}while (biaozhi1){i = 0;while (biaozhi2){y = JS.f(x[0], x[1]);//调用目标函数g[0] = JS.g0(x[0], x[1]);//调用梯度函数,求在点x处的梯度值 g[1] = JS.g1(x[0], x[1]);ggm = g[0] * g[0] + g[1] * g[1];if (ggm <= jd){x1 = x[0];x2 = x[1];fy = y;biaozhi1 = false;break;}else{if (i == 0){p[0] = -g[0];p[1] = -g[1];}else{p[0] = -g[0] + (ggm / ggo) * p[0];p[1] = -g[1] + (ggm / ggo) * p[1];}//调用0.618法子函数,找出极小点jixiao = JS.JiXiao1(x[0], x[1], p[0], p[1], x00, x01); x[0] = x[0] + jixiao * p[0];x[1] = x[1] + jixiao * p[1];ggo = ggm;i++;if (i >= 2){break;}else{continue;}}}}txtx1.Text = x1.ToString();txtx2.Text = x2.ToString();txty.Text = fy.ToString();}}②子函数程序:using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Collections;///<summary>/// JiSuan 的摘要说明///</summary>public class JiSuan{public JiSuan(){//// TODO: 在此处添加构造函数逻辑//}//目标函数public double f(double z1,double z2){double zz = 1.5 * z1 * z1 + 0.5 * z2 * z2 - z1 * z2 - 2 * z1;return zz;}//求梯度值函数public double g0(double z1, double z2){double zz = 3 * z1 - z2 - 2;return zz;}public double g1(double z1, double z2){double zz = z2 - z1;return zz;}//倍增半减函数public ArrayList SuoJian(double x0, double t0, double p, double q, double xx0, double xx1, double p0, double p1,double x00,double x01){double t1;double f0, f1;double x1, t2;double f2;double a = 0, b = 0, c = 0;double fa, fc, fb;double t3, f3;bool biaozhi1 = true;//设置是否循环的标志bool biaozhi2 = true;double x_0t1, x_1t1, x_0t2, x_1t2;x_0t1 = xx0 + t1 * p0;x_1t1 = xx1 + t1 * p1;f0 = f(x00, x01);//调用目标函数f1 = f(x_0t1, x_1t1);if (f0 > f1){while (biaozhi1){x1 = p * x0;t2 = t1 + x1;x_0t2 = x_0t1 + t2 * p0;x_1t2 = x_1t1 + t2 * p1;f2 = f(x_0t2, x_1t2);//调用目标函数if (f1 > f2){t0 = t1;t1 = t2;f0 = f1;f1 = f2;continue;}else{a = t0;c = t1;b = t2;fa = f0;fc = f1;fb = f2;break;}}}else{t3 = t1;f3 = f1;t1 = t0;f1 = f0;t0 = t3;while (biaozhi2){x1 = q * x0;t2 = t1 - x1;x_0t2 = x_0t1 + t2 * p0;x_1t2 = x_1t1 + t2 * p1;f2 = f(x_0t2, x_1t2);//调用目标函数if (f1 > f2){t0 = t1;t1 = t2;f0 = f1;f1 = f2;continue;}else{a = t2;c = t1;b = t0;fa = f2;fc = f1;fb = f0;break;}}}ArrayList list = new ArrayList();list.Add(a);list.Add(b);return list;}//0.618法函数public double JiXiao1(double x0, double x1, double p0, double p1,double x00,double x01){double jd = 0.0001;//精度double p = 0.618;double t1, t2;double jixiao = 0;//极小点bool biaozhi1 = true;//设置是否循环标志bool biaozhi2 = true;double xx0 = 0.01;//步长double tt0 = 0, pp = 2, qq = 0.5;double x_0t1, x_1t1, x_0t2, x_1t2;ArrayList list1 = new ArrayList();//调用倍增半减函数获取极小区间list1 = (ArrayList)SuoJian(xx0, tt0, pp, qq, x0, x1, p0, p1, x00, x01);double a = double.Parse(list1[0].ToString());double b = double.Parse(list1[1].ToString());while (biaozhi1){t1 = a + (1 - p) * (b - a);t2 = a + p * (b - a);x_0t1 = x00 + t1 * p0;x_1t1 = x01 + t1 * p1;x_0t2 = x_0t1 + t2 * p0;x_1t2 = x_1t1 + t2 * p1;f1 = f(x_0t1, x_1t1);//调用目标函数f2 = f(x_0t2, x_1t2);while (biaozhi2){if (f1 < f2){b = t2;t2 = t1;f2 = f1;t1 = a + (1 - p) * (b - a);x_0t1 = x00 + t1 * p0;x_1t1 = x01 + t1 * p1;f1 = f(x_0t1, x_1t1);//调用目标函数if (Math.Abs(b - a) > jd){continue;}else{biaozhi1 = false;break;}}else if (f1 == f2){a = t1;b = t2;if (Math.Abs(b - a) > jd){break;}else{biaozhi1 = false;break;}}else if (f1 > f2){a = t1;t1 = t2;f1 = f2;t2 = a + p * (b - a);x_0t2 = x_0t1 + t2 * p0;x_1t2 = x_1t1 + t2 * p1;f2 = f(x_0t2, x_1t2);//调用目标函数if (Math.Abs(b - a) > jd){continue;}else{biaozhi1 = false;break;}}}}jixiao = (a + b) / 2;return jixiao;}}三、程序运行界面及结果(1)0.618法和抛物线法求ψ(t)=sint,初始点t0=1(2)共轭梯度法求函数极小点:f(x)=1.5x12+0.5x22-x1x2-2x1;初始点为(-2,4)。
模式识别大作业

模式识别大作业1.最近邻/k近邻法一.基本概念:最近邻法:对于未知样本x,比较x与N个已知类别的样本之间的欧式距离,并决策x与距离它最近的样本同类。
K近邻法:取未知样本x的k个近邻,看这k个近邻中多数属于哪一类,就把x归为哪一类。
K取奇数,为了是避免k1=k2的情况。
二.问题分析:要判别x属于哪一类,关键要求得与x最近的k个样本(当k=1时,即是最近邻法),然后判别这k个样本的多数属于哪一类。
可采用欧式距离公式求得两个样本间的距离s=sqrt((x1-x2)^2+(y1-y2)^2)三.算法分析:该算法中任取每类样本的一半作为训练样本,其余作为测试样本。
例如iris中取每类样本的25组作为训练样本,剩余25组作为测试样本,依次求得与一测试样本x距离最近的k 个样本,并判断k个样本多数属于哪一类,则x就属于哪类。
测试10次,取10次分类正确率的平均值来检验算法的性能。
四.MATLAB代码:最近邻算实现对Iris分类clc;totalsum=0;for ii=1:10data=load('iris.txt');data1=data(1:50,1:4);%任取Iris-setosa数据的25组rbow1=randperm(50);trainsample1=data1(rbow1(:,1:25),1:4);rbow1(:,26:50)=sort(rbow1(:,26:50));%剩余的25组按行下标大小顺序排列testsample1=data1(rbow1(:,26:50),1:4);data2=data(51:100,1:4);%任取Iris-versicolor数据的25组rbow2=randperm(50);trainsample2=data2(rbow2(:,1:25),1:4);rbow2(:,26:50)=sort(rbow2(:,26:50));testsample2=data2(rbow2(:,26:50),1:4);data3=data(101:150,1:4);%任取Iris-virginica数据的25组rbow3=randperm(50);trainsample3=data3(rbow3(:,1:25),1:4);rbow3(:,26:50)=sort(rbow3(:,26:50));testsample3=data3(rbow3(:,26:50),1:4);trainsample=cat(1,trainsample1,trainsample2,trainsample3);%包含75组数据的样本集testsample=cat(1,testsample1,testsample2,testsample3);newchar=zeros(1,75);sum=0;[i,j]=size(trainsample);%i=60,j=4[u,v]=size(testsample);%u=90,v=4for x=1:ufor y=1:iresult=sqrt((testsample(x,1)-trainsample(y,1))^2+(testsample(x,2) -trainsample(y,2))^2+(testsample(x,3)-trainsample(y,3))^2+(testsa mple(x,4)-trainsample(y,4))^2); %欧式距离newchar(1,y)=result;end;[new,Ind]=sort(newchar);class1=0;class2=0;class3=0;if Ind(1,1)<=25class1=class1+1;elseif Ind(1,1)>25&&Ind(1,1)<=50class2=class2+1;elseclass3=class3+1;endif class1>class2&&class1>class3m=1;ty='Iris-setosa';elseif class2>class1&&class2>class3m=2;ty='Iris-versicolor';elseif class3>class1&&class3>class2m=3;ty='Iris-virginica';elsem=0;ty='none';endif x<=25&&m>0disp(sprintf('第%d组数据分类后为%s类',rbow1(:,x+25),ty));elseif x<=25&&m==0disp(sprintf('第%d组数据分类后为%s类',rbow1(:,x+25),'none'));endif x>25&&x<=50&&m>0disp(sprintf('第%d组数据分类后为%s类',50+rbow2(:,x),ty));elseif x>25&&x<=50&&m==0disp(sprintf('第%d组数据分类后为%s类',50+rbow2(:,x),'none'));endif x>50&&x<=75&&m>0disp(sprintf('第%d组数据分类后为%s类',100+rbow3(:,x-25),ty));elseif x>50&&x<=75&&m==0disp(sprintf('第%d组数据分类后为%s类',100+rbow3(:,x-25),'none'));endif (x<=25&&m==1)||(x>25&&x<=50&&m==2)||(x>50&&x<=75&&m==3)sum=sum+1;endenddisp(sprintf('第%d次分类识别率为%4.2f',ii,sum/75));totalsum=totalsum+(sum/75);enddisp(sprintf('10次分类平均识别率为%4.2f',totalsum/10));测试结果:第3组数据分类后为Iris-setosa类第5组数据分类后为Iris-setosa类第6组数据分类后为Iris-setosa类第7组数据分类后为Iris-setosa类第10组数据分类后为Iris-setosa类第11组数据分类后为Iris-setosa类第12组数据分类后为Iris-setosa类第14组数据分类后为Iris-setosa类第16组数据分类后为Iris-setosa类第18组数据分类后为Iris-setosa类第19组数据分类后为Iris-setosa类第20组数据分类后为Iris-setosa类第23组数据分类后为Iris-setosa类第24组数据分类后为Iris-setosa类第26组数据分类后为Iris-setosa类第28组数据分类后为Iris-setosa类第30组数据分类后为Iris-setosa类第31组数据分类后为Iris-setosa类第34组数据分类后为Iris-setosa类第37组数据分类后为Iris-setosa类第39组数据分类后为Iris-setosa类第41组数据分类后为Iris-setosa类第44组数据分类后为Iris-setosa类第45组数据分类后为Iris-setosa类第49组数据分类后为Iris-setosa类第53组数据分类后为Iris-versicolor类第54组数据分类后为Iris-versicolor类第55组数据分类后为Iris-versicolor类第57组数据分类后为Iris-versicolor类第58组数据分类后为Iris-versicolor类第59组数据分类后为Iris-versicolor类第60组数据分类后为Iris-versicolor类第61组数据分类后为Iris-versicolor类第62组数据分类后为Iris-versicolor类第68组数据分类后为Iris-versicolor类第70组数据分类后为Iris-versicolor类第71组数据分类后为Iris-virginica类第74组数据分类后为Iris-versicolor类第75组数据分类后为Iris-versicolor类第77组数据分类后为Iris-versicolor类第79组数据分类后为Iris-versicolor类第80组数据分类后为Iris-versicolor类第84组数据分类后为Iris-virginica类第85组数据分类后为Iris-versicolor类第92组数据分类后为Iris-versicolor类第95组数据分类后为Iris-versicolor类第97组数据分类后为Iris-versicolor类第98组数据分类后为Iris-versicolor类第99组数据分类后为Iris-versicolor类第102组数据分类后为Iris-virginica类第103组数据分类后为Iris-virginica类第105组数据分类后为Iris-virginica类第106组数据分类后为Iris-virginica类第107组数据分类后为Iris-versicolor类第108组数据分类后为Iris-virginica类第114组数据分类后为Iris-virginica类第118组数据分类后为Iris-virginica类第119组数据分类后为Iris-virginica类第124组数据分类后为Iris-virginica类第125组数据分类后为Iris-virginica类第126组数据分类后为Iris-virginica类第127组数据分类后为Iris-virginica类第128组数据分类后为Iris-virginica类第129组数据分类后为Iris-virginica类第130组数据分类后为Iris-virginica类第133组数据分类后为Iris-virginica类第135组数据分类后为Iris-virginica类第137组数据分类后为Iris-virginica类第142组数据分类后为Iris-virginica类第144组数据分类后为Iris-virginica类第148组数据分类后为Iris-virginica类第149组数据分类后为Iris-virginica类第150组数据分类后为Iris-virginica类k近邻法对wine分类:clc;otalsum=0;for ii=1:10 %循环测试10次data=load('wine.txt');%导入wine数据data1=data(1:59,1:13);%任取第一类数据的30组rbow1=randperm(59);trainsample1=data1(sort(rbow1(:,1:30)),1:13);rbow1(:,31:59)=sort(rbow1(:,31:59)); %剩余的29组按行下标大小顺序排列testsample1=data1(rbow1(:,31:59),1:13);data2=data(60:130,1:13);%任取第二类数据的35组rbow2=randperm(71);trainsample2=data2(sort(rbow2(:,1:35)),1:13);rbow2(:,36:71)=sort(rbow2(:,36:71));testsample2=data2(rbow2(:,36:71),1:13);data3=data(131:178,1:13);%任取第三类数据的24组rbow3=randperm(48);trainsample3=data3(sort(rbow3(:,1:24)),1:13);rbow3(:,25:48)=sort(rbow3(:,25:48));testsample3=data3(rbow3(:,25:48),1:13);train_sample=cat(1,trainsample1,trainsample2,trainsample3);%包含89组数据的样本集test_sample=cat(1,testsample1,testsample2,testsample3);k=19;%19近邻法newchar=zeros(1,89);sum=0;[i,j]=size(train_sample);%i=89,j=13[u,v]=size(test_sample);%u=89,v=13for x=1:ufor y=1:iresult=sqrt((test_sample(x,1)-train_sample(y,1))^2+(test_sample(x ,2)-train_sample(y,2))^2+(test_sample(x,3)-train_sample(y,3))^2+( test_sample(x,4)-train_sample(y,4))^2+(test_sample(x,5)-train_sam ple(y,5))^2+(test_sample(x,6)-train_sample(y,6))^2+(test_sample(x ,7)-train_sample(y,7))^2+(test_sample(x,8)-train_sample(y,8))^2+( test_sample(x,9)-train_sample(y,9))^2+(test_sample(x,10)-train_sa mple(y,10))^2+(test_sample(x,11)-train_sample(y,11))^2+(test_samp le(x,12)-train_sample(y,12))^2+(test_sample(x,13)-train_sample(y, 13))^2); %欧式距离newchar(1,y)=result;end;[new,Ind]=sort(newchar);class1=0;class 2=0;class 3=0;for n=1:kif Ind(1,n)<=30class 1= class 1+1;elseif Ind(1,n)>30&&Ind(1,n)<=65class 2= class 2+1;elseclass 3= class3+1;endendif class 1>= class 2&& class1>= class3m=1;elseif class2>= class1&& class2>= class3m=2;elseif class3>= class1&& class3>= class2m=3;endif x<=29disp(sprintf('第%d组数据分类后为第%d类',rbow1(:,30+x),m));elseif x>29&&x<=65disp(sprintf('第%d组数据分类后为第%d类',59+rbow2(:,x+6),m));elseif x>65&&x<=89disp(sprintf('第%d组数据分类后为第%d类',130+rbow3(:,x-41),m));endif (x<=29&&m==1)||(x>29&&x<=65&&m==2)||(x>65&&x<=89&&m==3) sum=sum+1;endenddisp(sprintf('第%d次分类识别率为%4.2f',ii,sum/89));totalsum=totalsum+(sum/89);enddisp(sprintf('10次分类平均识别率为%4.2f',totalsum/10));第2组数据分类后为第1类第4组数据分类后为第1类第5组数据分类后为第3类第6组数据分类后为第1类第8组数据分类后为第1类第10组数据分类后为第1类第11组数据分类后为第1类第14组数据分类后为第1类第16组数据分类后为第1类第19组数据分类后为第1类第20组数据分类后为第3类第21组数据分类后为第3类第22组数据分类后为第3类第26组数据分类后为第3类第27组数据分类后为第1类第28组数据分类后为第1类第30组数据分类后为第1类第33组数据分类后为第1类第36组数据分类后为第1类第37组数据分类后为第1类第43组数据分类后为第1类第44组数据分类后为第3类第45组数据分类后为第1类第46组数据分类后为第1类第49组数据分类后为第1类第54组数据分类后为第1类第56组数据分类后为第1类第57组数据分类后为第1类第60组数据分类后为第2类第61组数据分类后为第3类第63组数据分类后为第3类第65组数据分类后为第2类第66组数据分类后为第3类第67组数据分类后为第2类第71组数据分类后为第1类第72组数据分类后为第2类第74组数据分类后为第1类第76组数据分类后为第2类第77组数据分类后为第2类第79组数据分类后为第3类第81组数据分类后为第2类第82组数据分类后为第3类第83组数据分类后为第3类第84组数据分类后为第2类第86组数据分类后为第2类第87组数据分类后为第2类第88组数据分类后为第2类第93组数据分类后为第2类第96组数据分类后为第1类第98组数据分类后为第2类第99组数据分类后为第3类第102组数据分类后为第2类第104组数据分类后为第2类第105组数据分类后为第3类第106组数据分类后为第2类第110组数据分类后为第3类第113组数据分类后为第3类第114组数据分类后为第2类第115组数据分类后为第2类第116组数据分类后为第2类第118组数据分类后为第2类第122组数据分类后为第2类第123组数据分类后为第2类第124组数据分类后为第2类第133组数据分类后为第3类第134组数据分类后为第3类第135组数据分类后为第2类第136组数据分类后为第3类第140组数据分类后为第3类第142组数据分类后为第3类第144组数据分类后为第2类第145组数据分类后为第1类第146组数据分类后为第3类第148组数据分类后为第3类第149组数据分类后为第2类第152组数据分类后为第2类第157组数据分类后为第2类第159组数据分类后为第3类第161组数据分类后为第2类第162组数据分类后为第3类第163组数据分类后为第3类第164组数据分类后为第3类第165组数据分类后为第3类第167组数据分类后为第3类第168组数据分类后为第3类第173组数据分类后为第3类第174组数据分类后为第3类2.Fisher线性判别法Fisher 线性判别是统计模式识别的基本方法之一。
数值分析——带双步位移的QR分解求特征值算法

数 值 分 析(B ) 大 作 业(二)1、算法设计:①矩阵的拟上三角化:对实矩阵A 进行相似变换化为拟上三角矩阵(1)A n -,其变换矩阵采用Householder 矩阵,变换过程如下:若()a 0(2,,)r iri r n ==+ ,则r H I =; 否则,(r)(r)Tr r+1,r n,r s =(0,,0,a ,a ) ,(r)r r+1,r r 2c = -sgn(a )||s ||,()()()r r r r+11,2,u =s -c e (0,,0,,,,)r r r r r r r r nr a c a a ++=- ,2T r r r 2H =I-2u u /r u ,(1)()r r r r A H A H +=。
当2r n =-时,得(1)(2)(1)222112n n n n n n A H A H H H A H H ------=== ,令12n-2P=H H H 又r H 是对称正交矩阵,于是n-1T A =P AP 成立,因而n-1A 与 A 相似。
②矩阵的QR 分解:矩阵的QR 分解过程与拟上三角化过程相似,在这里不再重复其原理。
③求全部特征值矩阵拟上三角化后利用带双步位移的QR 方法,采用书本Page 63页具体算法实现。
为了使编程方便,并体会goto 语句使用的灵活性,程序中的跳转均使用goto Loop*实现。
④求A 的相应于实特征值的特征向量求实特征值对应的特征向量,即是求解线性方程组(λI-A)=0i i x ,(1,,)i n = 。
因此,为得到全部实特征值对应的特征向量,解线性方程组的过程要循环n 次(n 为矩阵阶数)。
线性方程组的求解采用列主元素Gauss 消去法。
#include <stdio.h>#include <math.h>#define ERR 1.0e-12 //误差限#define N10 //矩阵行列数#define L 1.0e5 //最大迭代次数double A[N][N]={0};void Init_A() //初始化矩阵{int i,j;for(i=0;i<N;i++)for(j=0;j<N;j++){if(i==j)A[i][j]=1.5*cos((i+1)+1.2*(j+1));elseA[i][j]=sin(0.5*(i+1)+0.2*(j+1));}}/*void Display_A(){int i,j;for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%8.4f",A[i][j]);printf("\n");}}*/int Sgn(double a){if(a>=0)return 1;elsereturn -1;}void On_To_The_Triangle() //矩阵拟上三角化{int i,j,r,flag=0;double cr,dr,hr,tr,temp;double ur[N],pr[N],qr[N],wr[N];for(r=1;r<=N-2;r++){flag=0;for(i=r+2;i<=N;i++)if(A[i-1][r-1]!=0){flag=1;break;}if(0==flag)continue;dr=0;for(i=r+1;i<=N;i++)dr+=A[i-1][r-1]*A[i-1][r-1];dr=sqrt(dr);if(0==A[r][r-1])cr=dr;else cr=-Sgn(A[r][r-1])*dr;hr=cr*cr-cr*A[r][r-1];for(i=1;i<=r;i++)ur[i-1]=0;ur[r]=A[r][r-1]-cr;for(i=r+2;i<=N;i++)ur[i-1]=A[i-1][r-1];for(i=1;i<=N;i++){temp=0;for(j=1;j<=N;j++)temp+=A[j-1][i-1]*ur[j-1];pr[i-1]=temp/hr;}for(i=1;i<=N;i++){temp=0;for(j=1;j<=N;j++)temp+=A[i-1][j-1]*ur[j-1];qr[i-1]=temp/hr;}temp=0;for(i=1;i<=N;i++){temp+=pr[i-1]*ur[i-1];tr=temp/hr;}for(i=1;i<=N;i++){wr[i-1]=qr[i-1]-tr*ur[i-1];}for(i=1;i<=N;i++)for(j=1;j<=N;j++)A[i-1][j-1]=A[i-1][j-1]-wr[i-1]*ur[j-1]-ur[i-1]*pr[j-1];}}void Get_Roots(double eigenvalue[][2],int m,double ss,double tt) //求一元二次方程的根{double discriminant=ss*ss-4*tt; //if(discriminant<0){*(*(eigenvalue+m-2))=0.5*ss;*(*(eigenvalue+m-2)+1)=0.5*sqrt(-discriminant);*(*(eigenvalue+m-1))=0.5*ss;*(*(eigenvalue+m-1)+1)=-0.5*sqrt(-discriminant);}else{*(*(eigenvalue+m-2))=0.5*(ss+sqrt(discriminant));*(*(eigenvalue+m-2)+1)=0;*(*(eigenvalue+m-1))=0.5*(ss-sqrt(discriminant));*(*(eigenvalue+m-1)+1)=0;}}void Get_Mk(double mk[][N],int m,double ss,double tt) //获取Mk,用于带双步位移的QR分解{int i,j,k;for(i=0;i<m;i++)for(j=0;j<m;j++)*(*(mk+i)+j)=0;for(i=0;i<m;i++)for(j=0;j<m;j++){for(k=0;k<m;k++)*(*(mk+i)+j)+=A[i][k]*A[k][j];*(*(mk+i)+j)-=ss*A[i][j];if(j==i)*(*(mk+i)+j)+=tt;}}void QR_Reslove(double mk[][N],int m) //QR分解{int i,j,r,flag=0;double cr,dr,hr,tr,temp;double ur[N],vr[N],pr[N],qr[N],wr[N];double B[N][N],C[N][N];for(i=0;i<m;i++)for(j=0;j<m;j++){B[i][j]=*(*(mk+i)+j);C[i][j]=A[i][j];}for(r=1;r<=m-1;r++){flag=0;for(i=r+1;i<=m;i++)if(B[i-1][r-1]!=0){flag=1;break;}if(0==flag)continue;dr=0;for(i=r;i<=m;i++)dr+=B[i-1][r-1]*B[i-1][r-1];dr=sqrt(dr);if(0==B[r-1][r-1])cr=dr;else cr=-Sgn(B[r-1][r-1])*dr;hr=cr*cr-cr*B[r-1][r-1];for(i=1;i<r;i++)ur[i-1]=0;ur[r-1]=B[r-1][r-1]-cr;for(i=r+1;i<=m;i++)ur[i-1]=B[i-1][r-1];for(i=1;i<=m;i++){temp=0;for(j=1;j<=m;j++)temp+=B[j-1][i-1]*ur[j-1];vr[i-1]=temp/hr;}for(i=0;i<m;i++)for(j=0;j<m;j++)B[i][j]-=ur[i]*vr[j];for(i=1;i<=m;i++){temp=0;for(j=1;j<=m;j++)temp+=C[j-1][i-1]*ur[j-1];pr[i-1]=temp/hr;}for(i=1;i<=m;i++){temp=0;for(j=1;j<=m;j++)temp+=C[i-1][j-1]*ur[j-1];qr[i-1]=temp/hr;}temp=0;for(i=1;i<=m;i++){temp+=pr[i-1]*ur[i-1];tr=temp/hr;}for(i=1;i<=m;i++){wr[i-1]=qr[i-1]-tr*ur[i-1];}for(i=1;i<=m;i++)for(j=1;j<=m;j++)C[i-1][j-1]=C[i-1][j-1]-wr[i-1]*ur[j-1]-ur[i-1]*pr[j-1];}for(i=0;i<m;i++)for(j=0;j<m;j++)A[i][j]=C[i][j];}void Display_Eigenvalue(double value[][2]) //显示特征值{int i;for(i=0;i<N;i++){printf("λ%d=%8.4f",i+1,*(*(value+i)));if(*(*(value+i)+1)>0)printf("+%8.4f",*(*(value+i)+1));else if(*(*(value+i)+1)<0)printf("%8.4f",*(*(value+i)+1));printf("\n");}printf("\n");}int QR_With_Double_Step_Displacement(double eigenvalue[][2]) //带双步位移QR分解求特征值{int i,j,k=1,m=N;double s,t;double Mk[N][N];for(i=0;i<N;i++)for(j=0;j<2;j++)eigenvalue[i][j]=0;do{k++;if(m==1){eigenvalue[m-1][0]=A[m-1][m-1];m--;continue;}else if(m==2){s=A[m-2][m-2]+A[m-1][m-1];t=A[m-2][m-2]*A[m-1][m-1]-A[m-1][m-2]*A[m-1][m-2];Get_Roots(eigenvalue,m,s,t); //求一元二次方程的根m=0;continue;}else if(m==0)return 0;else if(fabs(A[m-1][m-2])<=ERR){eigenvalue[m-1][0]=A[m-1][m-1];m--;continue;}else{s=A[m-2][m-2]+A[m-1][m-1];t=A[m-2][m-2]*A[m-1][m-1]-A[m-1][m-2]*A[m-2][m-1];if(fabs(A[m-2][m-3])<=ERR){Get_Roots(eigenvalue,m,s,t); //求一元二次方程的根m-=2;continue;}else{Get_Mk(Mk,m,s,t); //获取Mk,用于带双步位移的QR分解QR_Reslove(Mk,m); //QR分解}}}while(k<L);printf("Errer\n"); //迭代过程不成功,报错}void Select_Principal_Element(int k) //Gauss消元法求解方程组之选主元{int i,max=k;double trans[N];for(i=k+1;i<N;i++)if(fabs(A[i][k])>fabs(A[max][k]))max=i;if(k==max)return;else{for(i=k;i<N;i++){trans[i]=A[k][i];A[k][i]=A[max][i];A[max][i]=trans[i];}}}void Eliminant(int k) //Gauss消元法求解方程组之消元{int i,j;double rate;for(i=k+1;i<N;i++){rate=A[i][k]/A[k][k];for(j=k;j<N;j++)A[i][j]=A[i][j]-rate*A[k][j];}}void Back_Substitution(double Eigenvector[]) //Gauss消元法求解方程组之回代{int i,j,k;double Temp_M[N][N+1];for(i=0;i<N-1;i++){for(j=i;j<N;j++)Temp_M[i][j]=A[i][j];Temp_M[i][N]=0;}Temp_M[N-1][N-1]=1;Temp_M[N-1][N]=1;for(k=N-1;k>=0;k--){*(Eigenvector+k)=Temp_M[k][N];for(i=k;i<N-1;i++)*(Eigenvector+k)=*(Eigenvector+k)-*(Eigenvector+i+1)*Temp_M[k][i+1];*(Eigenvector+k)=*(Eigenvector+k)/Temp_M[k][k];}}void Display_Eigenvector(double Eigenvector[],double eigenvalue) //显示特征值对应特征向量{int i;printf("When λ=%8.4f\nEigenvector=\n",eigenvalue);for(i=0;i<N;i++)printf("%8.4f",*(Eigenvector+i));printf("\n");}void Get_Eigenvector(double value[][2]) //利用Gauss消元法求解特征向量{int i,j;double eigenvalue;double Eigenvector[N];for(i=0;i<N;i++)if(*(*(value+i)+1)==0){Init_A(); //初始化矩阵eigenvalue=*(*(value+i));for(j=0;j<N;j++)A[j][j]-=eigenvalue;for(j=0;j<N-1;j++){Select_Principal_Element(j); //Gauss消元法求解方程组之选主元Eliminant(j); //Gauss消元法求解方程组之消元}Back_Substitution(Eigenvector); //Gauss消元法求解方程组之回代Display_Eigenvector(Eigenvector,eigenvalue); //显示特征值对应特征向量}}main(){double eigenvalue[N][2];Init_A(); //初始化矩阵On_To_The_Triangle(); //矩阵上三角化QR_With_Double_Step_Displacement(eigenvalue); //带双步位移QR分解求特征值printf("Contactme:****************\n\n");Display_Eigenvalue(eigenvalue); //显示特征值Get_Eigenvector(eigenvalue); //利用Gauss消元法求解特征向量return 0;}PS: Forfurtherdetails,pleasecontactme:****************。
北航最优化大作业

北航最优化大作业1.引言旅行商问题(Traveling Salesman Problem,TSP)是一种经典的组合优化问题,目标是找到一条路径,使得旅行商从起点出发,途经所有城市一次后返回起点,并且总路径长度最短。
TSP问题具有NP-hard的特性,寻找最优解是一个非常具有挑战性的任务。
本文将基于禁忌算法,探讨TSP问题的求解方法。
2.禁忌算法简介禁忌算法是一种基于局部的元启发式算法,通过在过程中禁止一定的动作来跳出局部最优解,以期望获得更好的全局最优解。
算法通过引入禁忌表和禁忌长度等机制,避免过程中陷入局部最优解。
3.TSP问题的数学建模假设有n个城市,城市之间的距离可以表示为一个n×n的距离矩阵D。
TSP问题的目标可以定义为:min ∑_(i=1)^n ∑_(j=1)^(n) D_ij*x_ijs.t. ∑_(i=1)^n x_ij=1,∑_(j=1)^n x_ij=1,∀i ≠ jx_ij∈{0,1}, 1≤i,j≤n其中x_ij表示城市i与城市j之间的路径是否存在,1表示存在,0表示不存在。
4.禁忌算法在TSP问题中的应用(1)初始化选取一个起始解x,计算其路径长度f(x)。
将x设为当前解x_best,将f(x)设为当前解的最优值f_best。
(2)选择邻域解选择当前解的一个邻域解x',使得x'与x只有一个位置上的交换。
通过随机选择两个位置,进行交换操作。
(3)禁忌判断如果邻域解x'的路径长度f(x')小于当前解的最优值f_best,则更新f_best为f(x'),并将x'设为新的当前解。
否则,比较x'与当前解的禁忌情况。
(4)禁忌更新如果x'未在禁忌表中,或者禁忌表中对应的禁忌周期已过,则将x'设为新的当前解。
否则,选择一个路径长度较短的邻域解x'',即使其路径长度f(x'')大于f_best。
大工20秋《人工智能》大作业

学习中心:专业:计算机科学与技术年级: 2019年春季学号:学生:题目:回归算法1.谈谈你对本课程学习过程中的心得体会与建议?通过对人工智能课程的系统学习,让我全面的了解了人工智能的基本概念和发展现状。
以及现实生活中越来越广泛的应用。
在数据分析,交通管理以及生物医疗等方面人工智能都发挥着极大的作用。
人工智能将是未来科技发展的一个新的趋势。
人工智能的具体课程,由人工智能的基本概念和发展情况,以及人工智能的搜索策略,机器学习和神经计算以及人工智能的具体应用这几部分组成。
在整个学习的过程中老师结合各种生动的实例让我们对于人工智能的概念以及逻辑思维方式处理方式都有一个全面整体的认知,使这些相对枯燥的理论能够变得更加有趣也更方便我们去掌握使用。
人工智能未来的发展必然是不可限量的,人工智能课程的学习使我们逐步了解了这个相对陌生的领域,在将来的工作和生活中我们要努力把所学到的东西运用到其中去,必定能事半功倍大大的提高效率。
对于这门课程我还是希望课程内容可以与时俱进,结合当下人工智能发展的情况,做到实时的去结合当前人工智能发展和应用的一些成果去丰富课程体系和课程内容,更好的让学生了解人工智能学习人工智能并且合理的运用相关理论和实例。
2.回归算法1.逻辑回归算法概念:逻辑回归其实是一种分类算法,将数据拟合到一个logistic函数中,从而完成对事件发生的概率进行预测。
2.逻辑回归算法核心思想:逻辑回归Logistic,主要用于两分类问题,即输出只有两种,因此利用Logistic函数,或者可以称作为Sigmoid函数,函数形式以及函数图像如下所示:我们可以从图中看出,在z=0时,函数值为0.5,向左逐渐减少趋近于0,向右则逐渐增大为1,其值域为(0,1)之内,下面的图体现了不同的判定边界。
边界图1边界图2逻辑回归的代价函数3.逻辑回归实战案例采用的数据集为文件夹中的data1.txt和data2.txt其中包含人口和收入的关系,对其分别进行逻辑回归运算以及加入正则项的逻辑回归运算。
大学23秋《机器学习》大作业及要求--答案 --可直接上交

大学23秋《机器学习》大作业及要求--答案 --可直接上交作业要求本次大作业旨在评估学生对机器研究概念和技术的理解和应用能力。
请按照以下要求完成作业:1. 选择一个机器研究问题或任务,可以是分类、回归、聚类等。
2. 根据所选问题,选择适用的机器研究算法,并解释为何选择该算法。
3. 收集和准备用于训练和测试模型的数据集。
4. 使用选定的算法对数据集进行训练,并评估模型的性能。
5. 分析和解释模型的结果和性能,并提出可改进的方案。
作业答案我选择了一个分类问题,即根据房屋的各项特征预测房屋的售价。
为了解决这个问题,我选择了支持向量机(Support Vector Machines,SVM)算法。
之所以选择SVM算法,是因为它在处理分类问题上表现出色,并且对于高维空间的数据也具有较高的准确性。
我采用了一个包含了房屋特征和对应售价的数据集。
首先,我对数据集进行了清洗和预处理,包括处理缺失值、标准化特征等。
然后,我将数据集划分为训练集和测试集,其中80%的数据用于训练模型,20%的数据用于评估模型的性能。
接下来,我使用SVM算法对训练集进行训练,并利用测试集进行模型性能的评估。
通过调整SVM算法的参数,我得到了一个在测试集上表现较好的模型。
该模型的准确率达到了85%,并且在其他评价指标上也取得了不错的结果。
对于模型的结果和性能,我进行了详细的分析和解释。
我发现房屋售价与房屋大小、地理位置和房屋年龄等特征密切相关。
同时,我提出了一些可改进的方案,例如增加更多的特征、尝试其他的机器研究算法等,以进一步提升模型的预测能力。
最后,我将我的作业答案整理成文档,可直接上交。
总结本作业通过选择一个机器学习问题和合适的算法,对数据集进行训练和评估,展示了机器学习的基本流程和方法。
通过对模型结果的分析和解释,提出了可改进的方案,进一步提升了作业的质量。
希望本次作业能够对学生的机器学习理解和应用能力有所提升。
计算方法大作业作业((北京科技大学研究生结课考试)

《计算方法》平时作业(2010-2011学年第一学期)学 院:_________________________ 专 业:_________________________ 姓 名:_________________________ 学 号:_________________________ 联 系 方 式:_________________________机研111班机械工程学院作业(考试前交, 给出证明或计算过程、计算程序及计算结果) 1. 对向量()12Tn x x x x = 定义1211,max ,nk k k nk x x xx x ∞≤≤====∑设A 是n n ⨯矩阵,规定1111max x A Ax ==,1max x A Ax ∞∞∞==,2221max x A Ax ==证明111112max (),max (),.n nkj jk j nj nk k T A a A a A A A λ∞≤≤≤≤=====∑∑列范数行范数是最大特征值证明:1) 证明111||||max||nijj n i A a≤≤==∑1111111111||||max ||max ||||max ||||||max ||nnn nij iiji ij ij j nj nj nj ni i i i AX a x ax a x a ≤≤≤≤≤≤≤≤=====≤≤=∑∑∑∑所以 111||||111||||max ||||max||nijx j ni A Ax a=≤≤==≤∑设 1111max||||,1,0,1,0,||||1,nnijip i ip i ip j ni i aa x a x a x ≤≤====≥=-<=∑∑取若取若则11||n nip i ip i i a x a ===∑∑且。
因此,1111111||||max ||||||max ||n nn nij i ip iip ij j nj ni i i i Ax a x ax a a ≤≤≤≤=====≥==∑∑∑∑即 111||||111||||max ||||max||nijx j ni A Ax a=≤≤==≥∑ 则 111||||m a x ||nij j ni A a ≤≤==∑2)证明11||||max||niji n j A a∞≤≤==∑11111111||||m a x ||m a x ||||m a x ||||||m a x||nnnni j j i j j i j i j i ni ni ni nj j j j A X a x a x a x a ∞∞≤≤≤≤≤≤≤≤=====≤≤=∑∑∑∑ 所以 ||||111||||m a x ||||m a x ||nij x i n j A Ax a ∞∞∞=≤≤==≤∑设 111max||||,1,0,1,0,||||1,nnijpj j pj j pj i nj j aa x a x a x ∞≤≤====≥=-<=∑∑取若取若则11||nn pj j pj j j a a ===∑∑且。
superpoint总结 大作业

superpoint总结大作业
SuperPoint是一种基于卷积神经网络的图像特征点检测算法。
它通过学习特征点的描述子和关键点来在图像中定位和描述物体。
以下是SuperPoint的几个主要特点和总结:
1. 网络结构:SuperPoint使用了一种深度卷积神经网络结构,它包含了若干个卷积层和池化层,以及全连接层。
这个网络结构能够有效地提取图像的特征。
2. 特征点检测:SuperPoint通过网络结构来检测图像中的特征点。
它通过在网络的最后一层使用特征金字塔来检测不同尺度的特征点。
这种方法在不同的图像尺度上都能够检测到特征点。
3. 描述子学习:SuperPoint还通过学习图像的描述子来描述检测到的特征点。
它使用了一个全连接层来学习每个特征点的描述子,描述子能够有效地表示特征点的周围区域。
4. 训练过程:SuperPoint的训练过程包括两个主要的步骤。
首先,使用真实的特征点标注来训练网络的特征点检测部分。
然后,使用特征点匹配算法来训练网络的描述子部分。
5. 性能评估:SuperPoint在多个公开的基准数据集上进行了性能评估。
实验结果显示,SuperPoint在特征点检测和描述子匹配方面表现出色,能够比其他算法更好地保持特征点的稳定性和准确性。
总的来说,SuperPoint是一种高效的图像特征点检测算法,它通过网络结构和描述子学习来定位和描述图像中的特征点。
通过实验证明,SuperPoint在性能上超越了其他算法,具有很好的稳定性和准确性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 1文档来源为:从网络收集整理.word版本可编辑. 算法分析大作业
动态规划方法解 乘法表问题和汽车加油行驶问题 目录 1.动态规划解乘法表问题 1.1问题描述------ 1.2算法设计思想------ 1.3设计方法------ 1.4源代码------ 1.5最终结果------ 2.动态规划解汽车加油行驶问题 2.1问题描述------ 2.2算法设计思想------ 2.3设计方法------ 2.4源代码------ 2.5最终结果------ 3.总结 1.动态规划解决乘法表问题 1.1问题描述 定义于字母表∑{a,b,c)上的乘法表如表所示: 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 2文档来源为:从网络收集整理.word版本可编辑. 依此乘法表,对任一定义于∑上的字符串,适当加括号表达式后得到一个表达式。 例如,对于字符串x=bbbba,它的一个加括号表达式为(b(bb))(ba)。依乘法表,该表达式的值为a。 试设计一个动态规划算法,对任一定义于∑上的字符串x=x1x2…xn,计算有多少种不同的加括号方式,使由x导出的加括号表达式的值为a。 1.2算法设计思想
设常量a,b,c 分别为 1, 2 ,3 。n 为字符串的长度。 设字符串的第 i 到 第 j 位乘积为 a 的加括号法有result[i][j][a] 种, 字符串的第 i 到 第 j 位乘积为 b 的加括号法有result[i][j][b] 种, 字符串的第 i 到 第 j 位乘积为 c 的加括号法有 result[i][j][c] 种。 则原问题的解是: result[i][n][a] 。 设 k 为 i 到 j 中的某一个字符,则对于 k 从 i 到 j : result[i][j][a] += result[i][k][a] * result[k + 1][j][c] + result[i][k][b] * result[k + 1][j][c] + result[i][k][c] * result[k + 1][j][a]; result[i][j][b] += result[i][k][a] * result[k + 1][j][a] + result[i][k][a] * result[k + 1][j][b] + result[i][k][b] * result[k + 1][j][b]; result[i][j][c] += result[i][k][b] * result[k + 1][j][a] + result[i][k][c] * result[k + 1][j][b] + result[i][k][c] * result[k + 1][j][c]; 输入:输入一个以a,b,c组成的任意一个字符串。 输出:计算出的加括号方式数。 1.3设计方法
乘法表问题直观理解就是通过加括号使得最终运算结果为a,该问题与矩阵连乘问题类似,矩阵连乘是每一次加括号选择运算量最小的,写成数学表达式有: 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 3文档来源为:从网络收集整理.word版本可编辑. 而乘法表问题则是计算所有加括号运算结果为a的情况数,并不要求输出加括号方式。那么可以从乘法的最小单元两个符号相乘的所有可能开始,接着在两个符号相乘的基础上计算三个符号相乘的所有可能。直到计算N长度的符号1-N的所有可能。可以定义一个三维数组a[n][n][3],n为输入字符串的长度,a[i][j][0]为从字符串中第i个元素到第j个元素的子串表达式值为a的加括号方式数,a[i][j][1]为从字符串中第i个元素到第j个元素的子串表达式值为b的加括号方式数,a[i][j][2]为从字符串中第i个元素到第j个元素的子串表达式值为c的加括号方式数。 由乘法表的定义则可知啊a[i][j][0]=(对k求和,k从i到j-1)a[i][k][0]*a[i][k+1][2]+a[i][k][1]*a[i][k+1][2]+a[i][k][2]*a[i][k+1][1]; 同理可得到a[i][j][1]和a[i][j][2]。 同时由上面的表达式可知,要计算a[i][j][],需先计算a[i][k][]和a[i][k
+1][],这里k从i到j-1,故a[i][j][]可采取如下的计算次序 1.4源代码 #include "iostream" #include "algorithm" #include "fstream" using namespace std; /* 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 4文档来源为:从网络收集整理.word版本可编辑. f[i][j][0] 表示在ch[i]~ch[j]之间以某种方式加括号后,结果为a f[i][j][1] 表示在ch[i]~ch[j]之间以某种方式加括号后,结果为b f[i][j][2] 表示在ch[i]~ch[j]之间以某种方式加括号后,结果为c a = a*c || b*c || c*a b = a*a || a*b || b*b c = b*a || c*b || c*c */ int f[50][50][3]; char chars[3] = {'a', 'b', 'c'}; int mul(int n, char ch[]) { for(int i=0; i for(int k=0; k<3; k++) f[i][i][k] = (ch[i] == chars[k] ? 1: 0); /* a = a*c || b*c || c*a b = a*a || a*b || b*b c = b*a || c*b || c*c */ for(int r=1; r for(i=0; i { int j = i + r; //区间右端点 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 5文档来源为:从网络收集整理.word版本可编辑. for(int k=i; k { f[i][j][0] += f[i][k][0]*f[k+1][j][2] + f[i][k][1]*f[k+1][j][2] + f[i][k][2]*f[k+1][j][0];
f[i][j][1] += f[i][k][0]*f[k+1][j][0] + f[i][k][0]*f[k+1][j][1] + f[i][k][1]*f[k+1][j][1];
f[i][j][2] += f[i][k][1]*f[k+1][j][0] + f[i][k][2]*f[k+1][j][1] + f[i][k][2]*f[k+1][j][2];
} } return f[0][n-1][0]; } int main() { ifstream fin("mul.txt"); cout << "输入字符串:"; char ch[100]; fin >> ch; cout << ch; int n = strlen(ch); cout << "\n结果为a的加括号方式为:" << mul(n, ch) << endl; fin.close(); return 0; } 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持. 6文档来源为:从网络收集整理.word版本可编辑. 1.5最终结果 2.动态规划解决汽车加油行驶问题 2.1问题描述 给定一个N*N的方形网络,设其左上角为起点○,坐标为(1,1),X轴向右为正,Y轴向下为正,每个方格边长为1。一辆汽车从起点○出发驶向右下角终点, 其坐标为(M,N)。在若干网格交叉点处,设置了油库,可供汽车在行驶途中,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则: (1)汽车只能沿网格边行驶,装满油后能行驶K条网格边。出发时汽车已装满油,在起点与终点处不设油库。 (2)当汽车行驶经过一条网格边时,若其X坐标或Y坐标减小,则应付费用B,否则免付费用。 (3)汽车在行驶过程中遇油库则应加满油并付加油费用A。 (4)在需要时可在网格点处增设油库,并付增设油库费用C(不含加油费A)。 (5)(1)~(4)中的各数N,K,A,B,C均为正整数。 2.2算法设计思想
这个题目,应该说是刚开始的时候被他给吓到了,只是想着如何去把所有的条件构造起来,然后使用网络流的方式来解决问题!但是,如果真的是很冷静下来好好地思考这道题目,就会发现如果没有那些限制条件,就是一个求解最长路的题目,这样就可以直接使用SPFA来解决这个问题!关键就是在于这个每次最多只能走K个网格边,这样就是限制了活动的范围,使得有的边无法扩展!因此可以考虑使用这个分层思想的最短路问题!就是通过将每一个点进行拆分,这样,就是相当于一种分类讨论的方式!而分类讨论了之后,就知道哪些边是可以扩展的,哪些边是不能扩展的!关键点就是在于该如何选取变量来分层,这就是因情况而异了!像这道题目之中,就是通过油量的多少来扩展边的!分层思想,说穿了其实就是相当于这个动态规划之中的增加变量的方式来确定状态一样,他们的实质其实都是一样的! 2.3设计方法
采用的是动态规划的思想来解题,用备忘录的方法进行递归,递归的式子后面写出.