我正在尝试实施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
在我的情况下,矩阵是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();
}
}
}
答案 0 :(得分:0)
从分析的角度来看,initialize_matrix方法中的变量j和i总是在数组边界内。 然而,存在变量k,其可以递增p.length ^ 2次。由于您还使用此变量来访问数组p,因此它必须是&lt; 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.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;
}
如果您将问题标记为已回答,我将不胜感激。