层次分析法(C#)代码

层次分析法的数学公式都蛮简单,主要就是几个矩阵的运算。但是实际代码的编写过程中新手会觉得数字类型的转换比较麻烦,我也是上网各种搜索才解决。

 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型的二维数组
    }

posted @ 2017-04-15 15:36  长风-  阅读(2298)  评论(0编辑  收藏  举报