层次分析法的数学公式都蛮简单,主要就是几个矩阵的运算。但是实际代码的编写过程中新手会觉得数字类型的转换比较麻烦,我也是上网各种搜索才解决。
protected void AHP(object sender,EventArgs e)
{
string jz = Request.Form["name3"];
string[] p;
p = jz.Split(',');
string[] P = GetValue(p);
int weishu = ws(P);
double[,] Array = splice(P, weishu);//构建比较矩阵
//按列向量归一化
double[,] Array1 = new double[weishu, weishu];
for(int i = 0; i< weishu; i++)
{
double sumb = 0;
//求列向量的和
for(int j = 0; j < weishu; j++)
{
sumb += Array[j, i];
}
for(int j = 0; j < weishu; j++)
{
Array1[j, i] = Array[j, i] / sumb;
}
}
//对Array1的行进行求和
double[,] Array2 = new double[weishu, 1];
for(int i = 0; i < weishu; i++)
{
for(int j = 0; j < weishu; j++)
{
Array2[i, 0] += Array1[i, j];
}
}
//对矩阵Array2进行归一化
double sum1 = 0;
for(int i = 0; i < weishu; i++)
{
sum1 += Array2[i, 0];
}
for(int i = 0; i < weishu; i++)
{
Array2[i, 0] = Array2[i, 0] / sum1;
}
//进行一致性校验
double suma = 0;
double lamda = 0;
double CI = 0;
double[] sum = new double[weishu];
for(int i = 0; i < weishu; i++)
{
for(int j = 0; j < weishu; j++)
{
sum[i] += Array[i, j] * Array2[j, 0];
}
}
for(int i = 0; i < weishu; i++)
{
suma += sum[i] / Array2[i, 0];
}
lamda = suma / weishu;
CI = (lamda - weishu) / (weishu - 1);
double[] RI = { 0, 0, 0.58, 0.9, 1.12, 1.24, 1.31, 1.41, 1.45 };
//bool Result = false;
double CR;
CR = CI / RI[weishu-1];
if (CR < 0.1)
{
/*Result = true;*///通过一致性校验
label1.Text = "一致性校验通过。";
}
else
{
label1.Text = "一致性校验未通过。";
}
}
//将字符串里面的分数转换成double型
static string[] GetValue(string[] str)
{
string[] fenshu=new string[str.Length];
for(int i = 0; i < str.Length; i++)
{
//fenshu[i] = Convert.ToDouble(str[i]);
if (str[i].IndexOf("/") > 0)
{
string fenzi = str[i].Substring(0, str[i].IndexOf('/'));
string fenmu = str[i].Split('/')[1];
//fenshu[i] = Convert.ToDouble(fenzi[i]).ToString("0.0000");
fenshu[i] = Convert.ToDouble(Convert.ToDouble(fenzi) / Convert.ToDouble(fenmu)).ToString("f4");
}
else
{
fenshu[i] = Convert.ToDouble(str[i]).ToString("f4");
}
}
return fenshu;
}
static int ws(string[] sz)
{
int szws;
//szws = sz.Length;
szws = Convert.ToInt32(Math.Sqrt(sz.Length));
return szws;
}
//将所输出的String格式数据转换成double型矩阵
static double[,] splice(string[] Str, int mywsl)
{
//string[] str;
//str = oldStr.Split(' ');
int mylength;
mylength = Str.Length;//获取整个一维数组的长度
double[] xinArray = new double[mylength];
//char[] xinArray1 = new char[mylength];
//字符串像double数组的复制
for (int i = 0; i < mylength; i++)
{
xinArray[i] = Convert.ToDouble(Str[i]);
}
double[,] Array = new double[mywsl, mywsl];
StringBuilder jz = new StringBuilder();
int m = 0;
for(int i = 0; i < mywsl; i++)
{
for(int j = 0; j < mywsl; j++)
{
Array[i, j] = Convert.ToDouble(xinArray[m]);
m++;
}
}
return Array;//返回一个double型的二维数组
}