Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AHP算法仅适用于3个标准_Java_Algorithm_Ahp - Fatal编程技术网

Java AHP算法仅适用于3个标准

Java AHP算法仅适用于3个标准,java,algorithm,ahp,Java,Algorithm,Ahp,我正试图实现一种层次分析算法,用特征向量计算准则的权重。例如,我想买一部智能手机。我的标准是:颜色、记忆、传递。为了计算权重,我必须对标准进行成对比较。我会比较颜色与记忆,颜色与传递,记忆与传递。 为了比较两个标准,我们使用了从9到1/9的量表。 例如,我将颜色与记忆进行比较:如果我认为颜色比记忆重要4倍,我将使用4,如果颜色与记忆具有相同的重要性,我将使用1,如果颜色比记忆不重要4倍,我使用1/4=0.25。 为了计算权重,我必须建立一个矩阵: color me

我正试图实现一种层次分析算法,用特征向量计算准则的权重。例如,我想买一部智能手机。我的标准是:颜色、记忆、传递。为了计算权重,我必须对标准进行成对比较。我会比较颜色与记忆,颜色与传递,记忆与传递。 为了比较两个标准,我们使用了从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或更多标准。在矩阵建立之后,我可以计算特征向量,这将给我权重。任何建议都将不胜感激。提前谢谢你

以下是标准类的代码:

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();   
    }
}
}

从分析角度来看,初始化_矩阵方法中的变量j和i始终位于数组边界内。 但是,有一个变量k,它可以增加p.length^2倍。当您还使用此变量访问数组p时,它必须 我想你想在位置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.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.66666667 10.0 3.3333335 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;
}

如果您能将问题标记为已回答,我将不胜感激。

如果您有3个以上的标准,那么问题到底是什么?程序是否引发异常?线程main java.lang.ArrayIndexOutOfBoundsException中的异常:AHP为6。initialize_matrixAHP.java:21,Criteria.mainCriteria.java:61对于n个标准,比较次数等于n*n-n/2。对于n=3,比较次数为3。我想这就是为什么它为n=3工作的程序。例如,对于n=4,比较次数为6,程序抛出异常。这就是为什么您看不到异常的原因,因为在这种情况下数组大小也是3。但是,看看我的更新。我按照你的建议,对于n=4,比较数为6。我的矩阵应该是3x3,但如果我进行更改,程序将显示矩阵6x6。因此,我意识到应该在方法的headerAHP类中进行更正:public static double[][]initialize_matrixdouble[]p,int n,也就是double a[][]=new double[n][n];forint i=0;我