1

基準の重みを計算するためのAHP(Analytic Hierarchy Process)アルゴリズムを実装しようとしています(固有のベターを使用)。たとえば、スマートフォンを購入したいです。私の基準は、色、記憶、配達です。重みを計算するには、基準間でペアワイズ比較を行う必要があります。色と記憶、色と配達、記憶と配達を比較します。2つの基準を比較するために、9から1/9までのスケールを使用します。たとえば、色と記憶を比較します。私の意見では、色が記憶よりも4回重要である場合は、4を使用します。色が記憶と同じ重要性を持っている場合は、1を使用します。色が記憶よりも重要でない場合は、4回使用します。 1/4=0.25を使用します。
重みを計算するには、行列を作成する必要があります。

          color       memory       delivery

color     1           value1       value2

memory    1/value1      1          value3 

delivery  1/value2   1/value3       1          

私の場合、基準が3つしかないため、マトリックスは3x3です。プログラムは3つの基準で機能していますが、4、5以上では機能していません。行列が作成された後、重みを与える固有ベクトルを計算できます。どんな提案でもいただければ幸いです。前もって感謝します!

Criteriaクラスのコードは次のとおりです。

public class Criteria
{
public static void main(String[] args)
{
    AHP ahp=new AHP();

    int n;
    int NUMBER_COMPARISON;
    Scanner keyboard=new Scanner(System.in);

    System.out.println("Enter the number of criteria");
    System.out.println("n=");
    n=keyboard.nextInt();
    NUMBER_COMPARISON=(n*n-n)/2;

    double [][] a=new double[n][n];
    String [] criteria=new String[n];
    double [] p=new double[NUMBER_COMPARISON];//used to hold the values of comparisons

    System.out.println("Enter the criteria:");
    for(int i=0; i<n;i++)
    {
        System.out.print("Criterion "+(i+1)+":");
        criteria[i]=keyboard.next();
    }

    System.out.println("Enter the comparison");
        int m=0; 
        for(int i=0; i<n;i++)
        {
            for(int j=i+1; j<n;j++)
            {
                System.out.println("Compare "+criteria[i]+" with "+criteria[j]+":");
                p[m]=keyboard.nextDouble();
                m++;
            }
        }

    a=ahp.initialize_matrix(p);
    ahp.show_matrix(a);
   }    
}

AHPクラスのコードは次のとおりです。

public class AHP
{
public static double[][] initialize_matrix(double[] p)
{
    //initialize the matrix a
    double a[][]=new double[p.length][p.length];    
    int k=0;        
    for(int i=0; i<p.length; i++)
    {
        for(int j=0; j<p.length;j++)
        {
            if(i==j)
                a[i][j]=1;
            else if(i<j)
            {

                a[i][j]=p[k];
                k++;
            }

            else if(i>j)
                a[i][j]=1/a[j][i];
        }
    }
    return a;
}

public static void show_matrix(double[][] b )
{
    //display the elements of the matrix a
    System.out.println("\nThe matrix a is:");
    for(int i=0; i<b.length;i++)
    {
        for(int j=0; j<b[i].length; j++)
            System.out.print(b[i][j]+"    ");
        System.out.println();   
    }
}
}
4

1 に答える 1

0

分析の観点から、initialize_matrixメソッドの変数jとiは、常に配列の境界内にあります。ただし、変数kがあり、p.length^2倍にインクリメントできます。この変数を使用して配列pにアクセスする場合も、<p.lengthである必要があります。

位置kに値を追加したいと思いますが、すべての行をオンラインにします。内部のforループが完了した後、kをゼロに設定することをお勧めします。

編集:予想通り...

n = 4の出力:

基準の数を入力しますn=4基準を入力します:基準1:a基準2:b基準3:c基準4:d比較を入力しますaとbを比較します:0.3 aをcと比較します:0.1 aをdと比較します:0.6比較しますbとc:0.5 bとd:0.8を比較cとd:0.2を比較

行列aは次のとおりです。1.00.30.10.6 0.5 0.8
3.3333333333333335 1.0 0.3 0.1 0.6 0.5
10.0 3.3333333333333335 1.0 0.3 0.1 0.6
1.6666666666666667 10.0 3.3333333333333335 1.0 0.3 0.1
2.0 1.6666666666666667 10.0 3.3333333333333335 1.0 0.3
1.25 2.0 1.6666666666666667 10.0 3.3333333333333335 1.0

方法

public static double[][] initialize_matrix(double[] p)
{

    double a[][]=new double[p.length][p.length];    
    int k=0;        
    for(int i=0; i<p.length; i++)
    {
        k = 0;

        for(int j=0; j<p.length;j++)
        {
            if(i==j)
                a[i][j]=1;
            else if(i<j)
            {

                a[i][j]=p[k];
                k++;
            }

            else if(i>j)
                a[i][j]=1/a[j][i];
        }
    }
    return a;
}

質問に回答済みのマークを付けていただければ幸いです。

于 2012-10-01T18:11:36.747 に答える