层次分析法中用于归一化的程序
<P>程序之三</P><P>层次分析法中用于归一化的程序:
(按列向量):</P>
<P>function n=guiyihua
n=input('输入行向量的数目:')
m=input('输入列向量的数目:')
a=zeros(n,m)
for i=1:n
for j=1:m
a(i,j)=input('输入矩阵的元素:');
end
end
a
b=zeros(3,3);
a0=zeros(1,3);
c=zeros(1,3);
for i=1:3
for j=1:3
a0(1,i)=a0(1,i)+a(j,i);
end
end
a0
for j=1:1:3
for i=1:1:3
b(i,j)=a(i,j)/a0(1,j);
end
end
b</P>
<P>for i=1:3
for j=1:3
c(1,i)=c(1,i)+b(i,j);
end
end
c
c/n</P> <P>再给2个:</P><DIV class=postcolor>作者:Nemesis
/*******************层次分析法建模程序******************/
#include<stdio.h>
struct stand
{
float b;
float bh;
float b2;
};
struct stand h;
struct stand h1;
struct stand w2;
struct stand h2;
//一致性检验
int check(float r[],int n,int m)
{double RI,CI,CR;
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,n,v,t1;
float c,m,c1;
float r1,r2,w1,w;
float sum1,bht,t,t2=0;
float sum2,sum;
for(i=0;i<100;i++)
{ sum1=0;
w1=0;
w=0;
t=0;
sum2=0;
bht=0;
sum=0;
}
for(j=0;j<100;j++)
for(i=0;i<100;i++)
h2.bh=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);
}
for(i=0;i<middle;i++)
for(j=0;j<middle;j++)
c1=c;
for(j=0;j<middle;j++)
for(i=0;i<middle;i++)
sum1=sum1+c;
for(j=0;j<middle;j++)
for(i=0;i<middle;i++)
c=c/sum1;
for(i=0;i<middle;i++)
for(j=0;j<middle;j++)
w1+=c;
for(i=0;i<middle;i++)
sum2+=w1;
for(i=0;i<middle;i++)
w1=w1/sum2;
for(i=0;i<middle;i++)
for(j=0;j<middle;j++)
bht=bht+c1*w1;
for(i=0;i<middle;i++)
t2=t2+bht/w1;
r1=t2/middle;
s1=check(r1,middle,1);
if(s1==0)
printf("未通过一致性检验,请重新输入权重!");
/*************************这里为检验输出****************************/
printf("********准则层对目标层的权向量*********\n");
for(i=0;i<middle;i++)
printf(" %f\n",w1);
printf("最大特征根为:%f\n",r1);
/*******************************************************************/
for(n=0;n<middle;n++)
for(i=0;i<input;i++)
w2.b2=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.b);
}
for(n=0;n<middle;n++)
for(i=0;i<input;i++)
for(j=0;j<input;j++)
h1.b=h.b;
for(n=0;n<middle;n++)
for(j=0;j<input;j++)
for(i=0;i<input;i++)
sum1=sum1+h.b;
for(n=0;n<middle;n++)
for(j=0;j<input;j++)
for(i=0;i<input;i++)
h.b=h.b/sum1;
for(n=0;n<middle;n++)
for(i=0;i<input;i++)
for(j=0;j<input;j++)
w2.b2+=h.b;
for(n=0;n<middle;n++)
for(i=0;i<input;i++)
sum=sum+w2.b2;
for(n=0;n<middle;n++)
for(i=0;i<input;i++)
w2.b2=w2.b2/sum;
for(n=0;n<middle;n++)
for(i=0;i<input;i++)
for(j=0;j<input;j++)
h2.bh=h2.bh+h1.b*w2.b2;
for(n=0;n<middle;n++)
for(i=0;i<input;i++)
t=t+h2.bh/w2.b2;
for(n=0;n<middle;n++)
{
r2=t/input;
s2=check(r2,input,middle);
}
/*********************这里为检验输出**********************/
printf("************方案层对准则层的权向量**********\n");
for(i=0;i<input;i++)
{
for(n=0;n<middle;n++)
printf(" %f",w2.b2);
printf("\n");
}
printf("最大特征根为:");
for(n=0;n<middle;n++)
printf(" \n%f ",r2);
/*********************************************************/
for(n=0;n<middle;n++)
if(s2==0)
{printf("未通过一致性检验,请重新输入!");}
for(n=0;n<input;n++)
for(i=0;i<middle;i++)
w=w+w1*w2.b2;
printf("\n*****************输出结果*****************\n");
for(t1=0;t1<input;t1++)
printf(" 方案%d ",t1+1);
printf("\n");
for(t1=0;t1<input;t1++)
printf(" %f ",w);
printf("\n");
} </DIV> 这里有一个,用VB写的,你看看。
Private Sub Command1_Click()
Dim num As Integer
Dim num0, num1, num2 As Double
strline = ""
fly1 = 1
On Error Resume Next
For i = 1 To List_n
For j = 1 To List_n
Text3((i - 1) * List_n + j).Enabled = True
Next j
Next i
For i = 1 To List_n
For j = i To List_n
If i = j Then
Text3((i - 1) * List_n + j).text = " 1"
Else
num = 1
num1 = 1
num2 = 1
num = InStr(num, Text3((i - 1) * List_n + j).text, "/")
If num <> 0 Then
num1 = Val(Left(Text3((i - 1) * List_n + j).text, num))
num2 = Val(Right(Text3((i - 1) * List_n + j).text, Len(Text3((i - 1) * List_n + j).text) - num))
Text3((i - 1) * List_n + j).text = num1 / num2
Text3((j - 1) * List_n + i).text = num2 / num1
Else
Text3((j - 1) * List_n + i).text = 1 / Val(Text3((i - 1) * List_n + j).text)
End If
End If
Next j
Next i
L = MsgBox("您确定以上的数据吗?", 49, "提示")
If L <> 1 Then
Exit Sub
End If
Call caculation(Combo1.ListIndex + 1, List_n, Text3)
If Selected(Combo1.ListIndex + 1) = Combo1.ListIndex + 1 Then
h = MsgBox("重新输入新数据吗?", 3)
Select Case h
Case 1
GoTo op
Case 2
Exit Sub
Case 7
Exit Sub
End Select
End If
op: Selected(Combo1.ListIndex + 1) = Combo1.ListIndex + 1
Call check
'结果说明
For i = 1 To List_n
Next i
If fly1 = 1 And fly2 = 1 Then
Command1.Enabled = False
Command2.Enabled = False
For i = 1 To List_n
ftoa(i) = 0
For j = 1 To List_m
ftoa(i) = ftoa(i) + AAs(j, i) * AAs(0, j)
Next j
strline = strline + Str(ftoa(i)) + " "
Next i
j = MsgBox("各方案对目标的权数为:" + Chr(10) + Chr(13) + strline, 64, "结论")
End If
For i = 1 To List_n
For j = 1 To List_n
Text3((i - 1) * List_n + j).Visible = True
Text3((i - 1) * List_n + j).text = ""
If i > j Or i = j Then
Text3((i - 1) * List_n + j).Enabled = False
Text3((i - 1) * List_n + j).BackColor = &H868754
End If
Next j
Next i
End Sub
页:
[1]