java实现Pareto Optimal算法

//根据对Pareto Optimal算法的理解,用java实现的源代码,贴出来跟大家分享一下
//源代码经测试都是已经可以运行的

public class PO {


public void PO_test(double[][] B){

double A[][] = new double[B.length][B[0].length]; //初始的时候将输出矩阵A设为空
for(int i=0;i<B.length;i++){
for(int j=0;j<B[i].length;j++)
A[i][j]=0;
}
double cc[][] = new double[B.length][B[0].length]; //下面for循环中利用cc存放每次的满足PO的每一行
for(int i=0;i<B.length;i++){
for(int j=0;j<B[i].length;j++)
cc[i][j]=0;
}
int sz1 = B.length;//sz1=size(B,1); 取矩阵B的第一列的个数 为8


int jj=0; //jj为b Vector的下标,初始为0
int kk[] = new int[B.length];//kk(8)={0,0,0,0,0,0,0,0}
for(int i=0;i<sz1;i++){
kk[i]=0;
}

double c[][] = new double[B.length][B[0].length];
for(int i=0;i<sz1;i++){
for(int j=0;j<B[i].length;j++)
c[i][j]=0;
}

//bb=c;//把矩阵c赋给临时变量bb
double bb[][] = new double[B.length][B[0].length];
for(int i=0;i<sz1;i++){
for(int j=0;j<B[i].length;j++)
bb[i][j]=c[i][j];
}

for(int k=0;k<sz1;k++){ //for k=1:sz1 //k从1到8行

int j=0;
//将第k行的元素放进临时变量ak中
double ak[] = new double[B[0].length];
for(int m=0;m<B[k].length;m++){
ak[m]=B[k][m];
}
//这个for循环主要对1到8行中, 用第k行-第i行的值存入临时的bb的第j行中,j自增1
for(int i=0;i<sz1;i++){
if( i!=k){
j=j+1;
for(int n=0;n<B[i].length;n++){// bb(j,:)=ak-B(i,:);
bb[j-1][n]=ak[n]-B[i][n];
}
}
}
//将bb转置
double bbt[][] = new double[B[0].length][B.length];
for(int p=0;p<bb.length;p++)
for(int q=0;q<bb[0].length;q++){
bbt[q][p]=bb[p][q];
}
//testing
//System.out.println("bb.length="+bb.length);
int s=0;
for(int p=0;p<bb.length-1;p++){
for(int q=0;q<bb[0].length;q++){
if(bbt[q][p]<0){
s++;
break;
}
}
}
if(s>6){
jj=jj+1;
//System.out.println("jj="+jj);
kk[jj-1]=k;
for(int m=0;m<ak.length;m++){
cc[jj-1][m]=ak[m];
}
}
/** //此时的j=8,对于当前的bb矩阵的1-8行进行转置,如果任意一一列存在小于0的元素,那么将这行元素放入c中,并且记录行号放入kk中

**/
}
if(jj>0){
//如果jj不等于0,那么说明c矩阵和kk数组中都有元素存在
System.out.println("OutPut Matrix A:");
for(int p=0;p<jj;p++)
{
for(int q=0;q<cc[0].length;q++)
{
A[p][q]=cc[p][q];

System.out.print(A[p][q]+" ");
}
System.out.println();
}

}else{
System.out.println("There are no Pareto points. The result is an empty matrix.");
}
System.out.println("The total number of PO points is:"+jj);
System.out.println("Pareto Optimal points:");
for(int i=0;i<jj;i++){
System.out.print(kk[i]+" ");
}

}


}


//测试用例

public class Run_main {

/**
* @param args
*/
public static void main(String[] args) {
PO po = new PO();
double B[][]={{0 ,-1 ,-2},{1 ,-2 ,-3},{-3, 2, 1},{4 ,0, -2},{2,-2 ,1},{1 ,-1, 2},{2, -1, 1},{0, -2 ,2}};
po.PO_test(B);
}

}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值