1

我正在尝试实现 AHP(分析层次过程)算法来计算标准的权重(使用特征向量)。例如,我想买一部智能手机。我的标准是:颜色、内存、交货。为了计算权重,我必须在标准之间进行成对比较。我会将颜色与内存进行比较,颜色与交付进行比较,将内存与交付进行比较。为了比较 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          

在我的情况下,矩阵是 3x3,因为我只有 3 个标准。该程序适用于 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

The matrix a is: 1.0 0.3 0.1 0.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 回答