数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 4524|回复: 2

层次分析法中用于归一化的程序

[复制链接]
发表于 2005-1-24 23:14:35 | 显示全部楼层 |阅读模式
<>程序之三</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>
发表于 2005-1-27 22:34:50 | 显示全部楼层
<>再给2个:</P><DIV class=postcolor>作者:Nemesis
/*******************层次分析法建模程序******************/

#include&lt;stdio.h&gt;
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&lt;m;i++)
CI=(r-n)/(n-1);
CR=CI/RI;
for(i=0;i&lt;m;i++)
{if(CR&lt;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&lt;100;i++)
{ sum1=0;
w1[0]=0;
w=0;
t=0;
sum2=0;
bht[0]=0;
sum=0;
}
for(j=0;j&lt;100;j++)
for(i=0;i&lt;100;i++)
h2[j].bh[0]=0;
printf(" 请输入准则层元素的个数:");
scanf("\n%d",&amp;middle);
printf(" 请输入方案层元素的个数:");
scanf("\n%d",&amp;input);
printf("下面输入准则层对目标层的相对矩阵(0-9):\n");
//for(i=0;i&lt;middle;i++)
//c=1;
for(i=0;i&lt;middle;i++)
for(j=0;j&lt;middle;j++)
{
printf("%d对%d的权重为:",i+1,j+1);
scanf("%f",&amp;c[j]);
}
for(i=0;i&lt;middle;i++)
for(j=0;j&lt;middle;j++)
c1[j]=c[j];
for(j=0;j&lt;middle;j++)
for(i=0;i&lt;middle;i++)
sum1[j]=sum1[j]+c[j];
for(j=0;j&lt;middle;j++)
for(i=0;i&lt;middle;i++)
c[j]=c[j]/sum1[j];
for(i=0;i&lt;middle;i++)
for(j=0;j&lt;middle;j++)
w1[0]+=c[j];
for(i=0;i&lt;middle;i++)
sum2[0]+=w1[0];
for(i=0;i&lt;middle;i++)
w1[0]=w1[0]/sum2[0];
for(i=0;i&lt;middle;i++)
for(j=0;j&lt;middle;j++)
bht[0]=bht[0]+c1[j]*w1[j][0];
for(i=0;i&lt;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&lt;middle;i++)
printf(" %f\n",w1[0]);
printf("最大特征根为:%f\n",r1[0]);
/*******************************************************************/
for(n=0;n&lt;middle;n++)
for(i=0;i&lt;input;i++)
w2[n].b2[0]=0;
printf("下面输入方案层对准则层的相对矩阵:\n");
for(n=0;n&lt;middle;n++)
for(i=0;i&lt;input;i++)
for(j=0;j&lt;input;j++)
{
printf("方案%d对方案%d相对准则%d的权重为:",i+1,j+1,n+1);
scanf("%f",&amp;h[n].b[j]);
}
for(n=0;n&lt;middle;n++)
for(i=0;i&lt;input;i++)
for(j=0;j&lt;input;j++)
h1[n].b[j]=h[n].b[j];
for(n=0;n&lt;middle;n++)
for(j=0;j&lt;input;j++)
for(i=0;i&lt;input;i++)
sum1[j]=sum1[j]+h[n].b[j];
for(n=0;n&lt;middle;n++)
for(j=0;j&lt;input;j++)
for(i=0;i&lt;input;i++)
h[n].b[j]=h[n].b[j]/sum1[j];
for(n=0;n&lt;middle;n++)
for(i=0;i&lt;input;i++)
for(j=0;j&lt;input;j++)
w2[n].b2[0]+=h[n].b[j];
for(n=0;n&lt;middle;n++)
for(i=0;i&lt;input;i++)
sum[n]=sum[n]+w2[n].b2[0];
for(n=0;n&lt;middle;n++)
for(i=0;i&lt;input;i++)
w2[n].b2[0]=w2[n].b2[0]/sum[n];
for(n=0;n&lt;middle;n++)
for(i=0;i&lt;input;i++)
for(j=0;j&lt;input;j++)
h2[n].bh[0]=h2[n].bh[0]+h1[n].b[j]*w2[n].b2[j][0];
for(n=0;n&lt;middle;n++)
for(i=0;i&lt;input;i++)
t[n]=t[n]+h2[n].bh[0]/w2[n].b2[0];
for(n=0;n&lt;middle;n++)
{
r2[n]=t[n]/input;
s2[n]=check(r2,input,middle);
}
/*********************这里为检验输出**********************/
printf("************方案层对准则层的权向量**********\n");
for(i=0;i&lt;input;i++)
{
for(n=0;n&lt;middle;n++)
printf(" %f",w2[n].b2[0]);
printf("\n");
}
printf("最大特征根为:");
for(n=0;n&lt;middle;n++)
printf(" \n%f ",r2[n]);
/*********************************************************/
for(n=0;n&lt;middle;n++)
if(s2[n]==0)
{printf("未通过一致性检验,请重新输入!");}
for(n=0;n&lt;input;n++)
for(i=0;i&lt;middle;i++)
w[n]=w[n]+w1[0]*w2.b2[n][0];
printf("\n*****************输出结果*****************\n");
for(t1=0;t1&lt;input;t1++)
printf(" 方案%d ",t1+1);
printf("\n");
for(t1=0;t1&lt;input;t1++)
printf(" %f ",w[t1]);
printf("\n");
} </DIV>
发表于 2005-1-27 22:35:20 | 显示全部楼层
这里有一个,用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 &lt;&gt; 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 &lt;&gt; 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 &gt; j Or i = j Then
Text3((i - 1) * List_n + j).Enabled = False
Text3((i - 1) * List_n + j).BackColor = &amp;H868754
End If
Next j
Next i
End Sub

您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-6-5 20:10 , Processed in 0.053225 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表