層次分析法(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型的二維數組
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM