我正在尝试实现AHP(Analytic Hierarchy Process)算法来计算准则的权重(使用特征向量)。例如,我想买一部智能手机。我的标准是:颜色,记忆,传递。为了计算权重,我必须在标准之间进行成对比较。我将比较颜色与记忆,颜色与交付,记忆与交付。为了比较两个标准,我们使用从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或更多标准。矩阵建立后,我可以计算特征向量,这将给我weights.Any建议将不胜感激。提前谢谢你!
以下是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();
}
}
}发布于 2012-10-02 02:11:37
从分析的角度来看,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.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;
}如果您能将此问题标记为已回答,我将不胜感激。
https://stackoverflow.com/questions/12677925
复制相似问题