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