⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 layer.cpp

📁 层次分析的程序,非常不错,应用非常广泛,代码已经过调试
💻 CPP
字号:
// Layer.cpp : Defines the entry point for the console application.
//




#include "stdafx.h"
#include<stdio.h>
void main(int argc, char* argv[])
{
	float A[5][5]=
	{	1 , 1.0/2 , 4 , 3 , 3,
		2 , 1 , 7 , 5 , 5,
		1.0/4, 1.0/7, 1, 1.0/2,1.0/3,
		1.0/3, 1.0/5, 2, 1, 1,
		1.0/3, 1.0/5, 3, 1, 1
	};
	float B[5][3][3]=
	{
	{   1 , 2 , 5,
	    1.0/2 , 1 , 2,
		1.0/5 , 1.0/2, 1
	},{
	    1 ,1.0/3 ,1.0/8,
		3 ,1 ,1.0/3,
		8 ,3 ,1
	},	{
	   1 ,1 ,3,
	   1 ,1 ,3,
	   1.0/3 ,1.0/3 ,1
	},{
	   1,3,4,1.0/3,1,1,1.0/4,1,1
	},{
	   1,1,1.0/4,1,1,1.0/4,4,4,1
	}
	};	
	int i,j,k,m=5,n=5,m1=3,n1=3;
	float sum=0;
	float w[5],W2[3][5],W[3];
	float A_change[5][5];
	float B_change[5][3][3];
    
	//对判断矩阵做列向量归一化处理
	for(j=0;j<n;j++)
	{
       sum=0;
	   for(i=0;i<m;i++)
	  {
	    sum=sum+ A[i][j];
	  }
	   for(i=0;i<m;i++)
	  {
	   A_change[i][j]=A[i][j]/sum;
	  }
	}
    
	//求判断矩阵的特征向量w
	sum=0;
    for(i=0;i<m;i++)
	{
	  w[i]=0;
	  for(j=0;j<n;j++)
	  {
	    w[i]=w[i]+A_change[i][j];
	  } 
	  sum=sum+w[i];
	}
	for(i=0;i<m;i++)
		w[i]=w[i]/sum;

	//求下层的特征向量构成的矩阵W2
	//同上,先归一化,再求特征向量
	for(k=0;k<n;k++)
	{
	 
	  for(j=0;j<n1;j++)
	  {
	     sum=0;
		for(i=0;i<m1;i++)
		{
		  sum=sum+B[k][i][j];
		}
	    for(i=0;i<m1;i++)
		{
			B_change[k][i][j]=B[k][i][j]/sum;
		}
	  }
	  
	 
	}
	for(k=0;k<n;k++)
	{
	  sum=0;
	  for(i=0;i<m1;i++)
	  {
	    W2[i][k]=0;
		for(j=0;j<n1;j++)
		{
		  W2[i][k]=W2[i][k]+B_change[k][i][j];
		}
		sum=sum+W2[i][k];
	  }
	  
	  for(i=0;i<m1;i++)
		  W2[i][k]=W2[i][k]/sum;
	}
	
	//评估各方案的优劣,用向量W表示
	sum=0;
	for(i=0;i<m1;i++)
	{
	   W[i]=0;
	   for(j=0;j<n;j++)
	   {
	      W[i]=W[i]+W2[i][j]*w[j];
	   }
	   sum=sum+W[i];
	}
	for(i=0;i<m1;i++)
	{ 
	   W[i]=W[i]/sum;
	   printf(" Evaluation of plan %d :  %f \n",i+1,W[i]);
	}
    printf("\n");
    getchar();
	//对各矩阵的一致性进行评价

	//先求判断矩阵的特征值 
    float lamdaA=0,lamdaB[5];
	float Aw[5],Bw[3];
	for(i=0;i<m;i++)
	{
	  Aw[i]=0;
	  for(j=0;j<n;j++)
	  {
	    Aw[i]=Aw[i]+A[i][j]*w[j];
	  }
	  lamdaA=lamdaA+Aw[i]/w[i]/m;
	}
	printf("lamdaA=%1.3f \n",lamdaA);
    for(k=0;k<m;k++)
	{
	  sum=0;
	  lamdaB[k]=0;
	  for(i=0;i<m1;i++)
	  {
	    Bw[i]=0;
		for(j=0;j<n1;j++)
		{
		  Bw[i]=Bw[i]+B[k][i][j]*W2[j][k];
		}
        lamdaB[k]=lamdaB[k]+Bw[i]/W2[i][k]/m1;
      }
       
	   printf("lamdaB[%d]=%1.3f \n",k,lamdaB[k]);
	}
	printf("\n");
  
	//再求一致性指标CI和一致性比率CR;  RI为随机一致性指标
	float RI[12]={0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45,1.49,1.51};
	float CIA,CRA,CIB[5],CRB[5],CR1,CR2=0,CR;
    CIA=(lamdaA-m)/(m-1);
	CRA=CIA/RI[m-1];
	CR1=CRA;
	for(k=0;k<5;k++)
	{
	  CIB[k]=(lamdaB[k]-m1)/(m1-1);
 	  CRB[k]=CIB[k]/RI[m1-1];
	  CR2=CRB[k]*w[k]+CR2;
	}
	CR=CR1+CR2;
	printf("the value of CR is :%1.3f \n",CR);
    


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -