|
发表于 2005-1-27 22:34:50
|
显示全部楼层
<>再给2个:</P><DIV class=postcolor>作者:Nemesis
/*******************层次分析法建模程序******************/
#include<stdio.h>
struct stand
{
float b[100][100];
float bh[100][100];
float b2[100][100];
};
struct stand h[100];
struct stand h1[100];
struct stand w2[100];
struct stand h2[100];
//一致性检验
int check(float r[],int n,int m)
{double RI,CI[15],CR[15];
int i;
switch(n)
{case 1:
case 2:RI=0;break;
case 3:RI=0.58;break;
case 4:RI=0.9;break;
case 5:RI=1.12;break;
case 6:RI=1.24;break;
case 7:RI=1.32;break;
case 8:RI=1.41;break;
case 9:RI=1.45;break;
case 10:RI=1.49;break;
case 11:RI=1.51;break;
default :printf("erro\n");
}
for(i=0;i<m;i++)
CI=(r-n)/(n-1);
CR=CI/RI;
for(i=0;i<m;i++)
{if(CR<0.1)
return(1);
else
return(0);}
}
void main()
{
int i,j,input,output=1,middle,s1,s2[100],n,v,t1;
float c[100][100],m,c1[100][100];
float r1[1],r2[100],w1[100][1],w[100];
float sum1[100],bht[100][1],t[100],t2=0;
float sum2[100],sum[100];
for(i=0;i<100;i++)
{ sum1=0;
w1[0]=0;
w=0;
t=0;
sum2=0;
bht[0]=0;
sum=0;
}
for(j=0;j<100;j++)
for(i=0;i<100;i++)
h2[j].bh[0]=0;
printf(" 请输入准则层元素的个数:");
scanf("\n%d",&middle);
printf(" 请输入方案层元素的个数:");
scanf("\n%d",&input);
printf("下面输入准则层对目标层的相对矩阵(0-9):\n");
//for(i=0;i<middle;i++)
//c=1;
for(i=0;i<middle;i++)
for(j=0;j<middle;j++)
{
printf("%d对%d的权重为:",i+1,j+1);
scanf("%f",&c[j]);
}
for(i=0;i<middle;i++)
for(j=0;j<middle;j++)
c1[j]=c[j];
for(j=0;j<middle;j++)
for(i=0;i<middle;i++)
sum1[j]=sum1[j]+c[j];
for(j=0;j<middle;j++)
for(i=0;i<middle;i++)
c[j]=c[j]/sum1[j];
for(i=0;i<middle;i++)
for(j=0;j<middle;j++)
w1[0]+=c[j];
for(i=0;i<middle;i++)
sum2[0]+=w1[0];
for(i=0;i<middle;i++)
w1[0]=w1[0]/sum2[0];
for(i=0;i<middle;i++)
for(j=0;j<middle;j++)
bht[0]=bht[0]+c1[j]*w1[j][0];
for(i=0;i<middle;i++)
t2=t2+bht[0]/w1[0];
r1[0]=t2/middle;
s1=check(r1,middle,1);
if(s1==0)
printf("未通过一致性检验,请重新输入权重!");
/*************************这里为检验输出****************************/
printf("********准则层对目标层的权向量*********\n");
for(i=0;i<middle;i++)
printf(" %f\n",w1[0]);
printf("最大特征根为:%f\n",r1[0]);
/*******************************************************************/
for(n=0;n<middle;n++)
for(i=0;i<input;i++)
w2[n].b2[0]=0;
printf("下面输入方案层对准则层的相对矩阵:\n");
for(n=0;n<middle;n++)
for(i=0;i<input;i++)
for(j=0;j<input;j++)
{
printf("方案%d对方案%d相对准则%d的权重为:",i+1,j+1,n+1);
scanf("%f",&h[n].b[j]);
}
for(n=0;n<middle;n++)
for(i=0;i<input;i++)
for(j=0;j<input;j++)
h1[n].b[j]=h[n].b[j];
for(n=0;n<middle;n++)
for(j=0;j<input;j++)
for(i=0;i<input;i++)
sum1[j]=sum1[j]+h[n].b[j];
for(n=0;n<middle;n++)
for(j=0;j<input;j++)
for(i=0;i<input;i++)
h[n].b[j]=h[n].b[j]/sum1[j];
for(n=0;n<middle;n++)
for(i=0;i<input;i++)
for(j=0;j<input;j++)
w2[n].b2[0]+=h[n].b[j];
for(n=0;n<middle;n++)
for(i=0;i<input;i++)
sum[n]=sum[n]+w2[n].b2[0];
for(n=0;n<middle;n++)
for(i=0;i<input;i++)
w2[n].b2[0]=w2[n].b2[0]/sum[n];
for(n=0;n<middle;n++)
for(i=0;i<input;i++)
for(j=0;j<input;j++)
h2[n].bh[0]=h2[n].bh[0]+h1[n].b[j]*w2[n].b2[j][0];
for(n=0;n<middle;n++)
for(i=0;i<input;i++)
t[n]=t[n]+h2[n].bh[0]/w2[n].b2[0];
for(n=0;n<middle;n++)
{
r2[n]=t[n]/input;
s2[n]=check(r2,input,middle);
}
/*********************这里为检验输出**********************/
printf("************方案层对准则层的权向量**********\n");
for(i=0;i<input;i++)
{
for(n=0;n<middle;n++)
printf(" %f",w2[n].b2[0]);
printf("\n");
}
printf("最大特征根为:");
for(n=0;n<middle;n++)
printf(" \n%f ",r2[n]);
/*********************************************************/
for(n=0;n<middle;n++)
if(s2[n]==0)
{printf("未通过一致性检验,请重新输入!");}
for(n=0;n<input;n++)
for(i=0;i<middle;i++)
w[n]=w[n]+w1[0]*w2.b2[n][0];
printf("\n*****************输出结果*****************\n");
for(t1=0;t1<input;t1++)
printf(" 方案%d ",t1+1);
printf("\n");
for(t1=0;t1<input;t1++)
printf(" %f ",w[t1]);
printf("\n");
} </DIV> |
|