gpt4 book ai didi

java - AHP 算法仅适用于 3 个标准

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:08 26 4
gpt4 key购买 nike

我正在尝试实现 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();
}
}
}

最佳答案

从分析的角度来看,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;
}

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

关于java - AHP 算法仅适用于 3 个标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12677925/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com