您好,欢迎访问三七文档
层次分析法AnaliticHierachyProcess(AHP)一、需求分析问题举例1.在海尔、新飞、容声和雪花四个牌号的电冰箱中选购一种。要考虑品牌的信誉、冰箱的功能、价格和耗电量。2.在泰山、杭州和承德三处选择一个旅游点。要考虑景点的景色、居住的环境、饮食的特色、交通便利和旅游的费用。3.在基础研究、应用研究和数学教育中选择一个领域申报科研课题。要考虑成果的贡献(实用价值、科学意义),可行性(难度、周期和经费)和人才培养。模型和方法1.层次结构模型的构造步骤一:确定层次结构,将决策的目标、考虑的因素(决策准则)和决策对象按它们之间的相互关系分为最高层、中间层和最低层,绘出层次结构图。最高层:决策的目的、要解决的问题。最低层:决策时的备选方案。中间层:考虑的因素、决策的准则。对于相邻的两层,称高层为目标层,低层为因素层。步骤二:通过相互比较,确定下一层各因素对上一层目标的影响的权重,将定性的判断定量化,即构造因素判断矩阵。步骤三:由矩阵的特征值确定判别的一致性;由相应的特征向量表示各因素的影响权重,计算权向量。步骤四:通过综合计算给出最底层(各方案)对最高层(总目标)影响的权重,权重最大的方案即为实现目标的最由选择。2.因素判断矩阵比较n个因素y=(y1,y2,…,yn)对目标z的影响.采用两两成对比较,用aij表示因素yi与因素yj对目标z的影响程度之比。通常用数字1~9及其倒数作为程度比较的标度,即九级标度法xi/xj相当较重要重要很重要绝对重要aij135792,4,6,8居于上述两个相邻判断之间。当aij1时,对目标Z来说xi比xj重要,其数值大小表示重要的程度。同时必有aji=1/aij1,对目标Z来说xj比xi不重要,其数值大小表示不重要的程度。称矩阵A=(aij)为因素判断矩阵。因为aij0且aji=1/aij故称A=(aij)为正互反矩阵。例.选择旅游景点Z:目标,选择景点y:因素,决策准则y1费用,y2景色,y3居住,y4饮食,y5交通3.一致性与权向量如果aijajk=aiki,j,k=1,2,…,n,则称正互反矩阵A具有一致性.这表明对各个因素所作的两两比较是可传递的。一致性互正反矩阵A=(aij)具有性质:A的每一行(列)均为任意指定行(列)的正数倍数,因此rank(A)=1.A有特征值=n,其余特征值均为零.记A的对应特征值=n的特征向量为w=(w1w2,…,wn)则aij=wiwj-1如果在目标z中n个因素y=(y1,y2,…,yn)所占比重分别为w=(w1w2,…,wn),则iwi=1,且因素判断矩阵为A=(wiwj-1)。因此,称一致性正互反矩阵A相应于特征值n的归一化特征向量为因素y=(y1,y2,…,yn)对目标z的权向量4.一致性检验与因素排序定理1:n阶正互反矩阵A是一致性的当且仅当其最大特征值为n.定理2:正互反矩阵具有模最大的正实数特征值1,其重数为1,且相应特征向量为正向量.为刻画n阶正互反矩阵A=(aij)与一致性接近的程度,定义一致性指标(Consensusindex):CI=(1-n)/(n-1)CI=0,A有完全的一致性。CI接近于0,A有满意的一致性。Saaty又引入平均随机一致性指标RTn123456789RI000.580.901.121.241.321.411.45当CR=CI/RI0.1时,认为A有满意的一致性。此时取A的相应于1的归一化特征向量w=(w1w2,…,wn)为因素y=(y1,y2,…,yn)对目标z的权向量。由w=(w2,…,wn)分量wi的大小可以对因素的重要性排序。择校排名二、使用的知识要点1.动态生成控件三、主程序界面四、主要程序段动态生本控件,并加上相应所需要的方法://初始化文本框privatevoidInitextbox(intlen,string[]str){this.groupBox1.Controls.Clear();//清空不用的控件TextBoxmytextbox;//定义文本框intx=this.groupBox1.Location.X+10;inty=this.groupBox1.Location.Y+40;for(inti=0;ilen;i++)//生成标签{Labelmylabel=newLabel();mylabel.Text=str[i].ToString();mylabel.Location=newPoint(x+i*60,y-40);mylabel.AutoSize=true;this.groupBox1.Controls.Add(mylabel);}for(inti=0;ilen;i++)//生成文本框{for(intj=0;jlen;j++){mytextbox=newTextBox();mytextbox.Size=newSystem.Drawing.Size(60,20);mytextbox.BackColor=Color.LightGoldenrodYellow;mytextbox.Name=mytextbox+i+j;mytextbox.Leave+=newSystem.EventHandler(this.textBox_mouseover);mytextbox.Location=newPoint(x,y);if(i==j){mytextbox.BackColor=Color.Wheat;mytextbox.Text=1;mytextbox.Enabled=false;}if(ij){mytextbox.BackColor=SystemColors.ActiveBorder;mytextbox.Enabled=false;}this.groupBox1.Controls.Add(mytextbox);x+=60;}x=this.groupBox1.Location.X+10;y+=20;}}相应的方法://控制文本框privatevoidtextBox_mouseover(objectsender,System.EventArgse){TextBoxtemptextbox=(TextBox)sender;stringtempstr=temptextbox.Name.ToString();if(temptextbox.Text.Trim()==){//MessageBox.Show(没有输入数字);//temptextbox.Focus();}else{stringi=tempstr.Substring(tempstr.Length-2,1);stringj=tempstr.Substring(tempstr.Length-1,1);foreach(ControltempCinthis.groupBox1.Controls){if(tempCisTextBox){if(tempC.Name.ToString()==mytextbox+j+i){if(temptextbox.Text.ToString().Trim().IndexOf(/)0)tempC.Text=temptextbox.Text.ToString().Substring(temptextbox.Text.ToString().Trim().Length-1,1);elseif(temptextbox.Text.ToString().Trim()==1)tempC.Text=1;elsetempC.Text=1/+temptextbox.Text;}}}}}//textBox_mouseover获取第个文本框的值:privatevoidgetdata(double[,]matrix){foreach(ControltempCinthis.groupBox1.Controls){try{if(tempCisTextBox){stringtempstr=tempC.Text.ToString().Trim();if(tempstr==){MessageBox.Show(有文本框没有填数据!);return;}inti=Convert.ToInt32(tempC.Name.ToString().Substring(tempC.Name.ToString().Length-2,1));intj=Convert.ToInt32(tempC.Name.ToString().Substring(tempC.Name.ToString().Length-1,1));if(tempstr.IndexOf(/)0){matrix[i,j]=Convert.ToDouble(tempstr.Substring(0,1))/Convert.ToDouble(tempstr.Substring(tempstr.Length-1,1));}elsematrix[i,j]=Convert.ToDouble(tempstr);}}catch(Exceptionerr){MessageBox.Show(err.ToString());}}}五、所有程序代码usingSystem;usingSystem.Drawing;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Windows.Forms;namespace经济管理模型{///summary///ccfx2的摘要说明。////summarypublicclassccfx2:System.Windows.Forms.Form{privatestaticdouble[]RI={0,0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45};privateInt32LenA;//准则数privateSystem.Int32LenB;//方案数privatedouble[,]zhuzematrix;//准则数方阵privatedouble[][,]fanganmatrix;//方案阵privatestring[]zhuze;//准则字符串privatestring[]fangan;//方案字符串privateintStepcount=0;//录入矩阵的步骤privatedouble[]W;//单序wprivatedouble[,]TW;//总序wprivatedouble[]Torder;//总的方案排名privatedoublelamda;//单序最大lamdaprivatedouble[]Tlamda;//总序lamdaprivateSystem.Windows.Forms.GroupBoxgroupBox1;privateSystem.Windows.Forms.Labellabel5;privateSystem.Windows.Forms.Buttonbutton1;privateSystem.Windows.Forms.Labellabel1;privateSystem.Windows.Forms.Labellabel2;privateSystem.Windows.Forms.TextBoxtextBox1;privateSystem.Windows.Forms.TextBoxtextBox2;privateSystem.Windows.Forms.Buttonbutton2;///summary///必需的设计器变量。////summaryprivateSystem.ComponentModel.Containercomponents=null;publicccfx2(){////Windows窗体设计器支持所必需的//InitializeComponent();////TODO:在InitializeComponent调用后添加任何构造函数代码//}/
本文标题:层次分析法C#代码
链接地址:https://www.777doc.com/doc-2299538 .html