您的位置:首页 > 编程语言 > Java开发

贪心算法及优化RSO实现

2015-06-23 09:00 417 查看
问题域:一个给定的由元素组聚合合成的数据集,从中选n次(用户给定),要求最后选取尽量多的元素组(每一个元素不可重复选取)。

贪心算法:每次寻找集合中最大的元素组,并将其剔除在数据集中,循环查找下一个最大元素组,直到选取了用户给定的n次。

RSO:贪心算法剔除已选元素组的过程中进行了大量的更新操作,执行效率低下,RSO可很大程度改善效率地下问题。

代码如下:java实现(greedy即贪心算法)

package demo;

import java.util.ArrayList;

import Ynu.Sei.cpLibrary.BASIC.cpOutput;

import Ynu.Sei.cpLibrary.BASIC.cpRandom;

import Ynu.Sei.cpLibrary.DS.SET;

import Ynu.Sei.cpLibrary.Geometry.geom.util.Matrix;

public class greedy {

    public ArrayList<SET<Integer>>  greedy(int k,ArrayList<SET<Integer>> d){

        ArrayList<SET<Integer>> result=new ArrayList<SET<Integer>>();

        for(;k>0;k--){

            if(d.size()==0)

                break;            

                SET<Integer> s1=this.big_str(d);

                result.add(s1);

                d=updates(s1,d);

                //d.matrix.

        }

        return result;

        }

    public int big_int(ArrayList<SET<Integer>> d){

        int result=0, i=0;

        for(int t=0;t<d.size();t++){

            if(d.get(t).size()>result){

                result=d.get(t).size();

                i=t;

                }//if

            

        }

        return i;

    }

    public SET<Integer> big_str(ArrayList<SET<Integer>> d){

        SET<Integer> s1=new SET<Integer>();

        s1=d.get(this.big_int(d));

        return s1;

    }

public ArrayList<SET<Integer>> updates(SET<Integer> s,ArrayList<SET<Integer>> d){

    ArrayList<SET<Integer>> matrix1=new ArrayList<SET<Integer>>() ;

            for(int t=0;t<d.size();t++){

                if(d.get(t).difference(s)!=null)

                matrix1.add(d.get(t).difference(s));    

                    }//for t

            //    d=matrix1;

    return matrix1;

}

public ArrayList<SET<Integer>> RSO(ArrayList<SET<Integer>> matrix ,int k,double p){

    ArrayList<SET<Integer>> sp=new ArrayList<SET<Integer>> ();

    ArrayList<SET<Integer>> t=new ArrayList<SET<Integer>> ();

    ArrayList<SET<Integer>> rest=new ArrayList<SET<Integer>> ();

    ArrayList<SET<Integer>> U=new ArrayList<SET<Integer>> ();

    SET<Integer> ut=new SET<Integer>();

    if(matrix.size()<3*k){

        t=this.greedy(k,matrix);

    }else{

        for(int i=0;i<matrix.size();i++){

            double temp=cpRandom.uniform(0,1);

                    if(temp>0&&temp<p){

                        sp.add(matrix.get(i));

                        }else rest.add(matrix.get(i));                    

                        }//for matrix.size取样

        

            for(int j=0;j<t.size();j++){

                ut=ut.union(t.get(j));

            }//T的并集

            

            for(int j=0;j<rest.size();j++){

                if(rest.get(j).difference(ut)==null){

                    }else {

                        U.add(rest.get(j));

                    }//else

                

            }//for s-sp

            //System.out.println("哈哈哈哈哈哈哈");

            t=this.greedy(k, U);

            System.out.println(U.size());

            U=null;

            //U=null;

                this.RSO(sp, k, p);

    }//else  U求完了

    

    System.out.println("UUUUU");

    return t;

}

public  ArrayList<SET<Integer>>  selBetter(double p,ArrayList<SET<Integer>> d,int k){

     ArrayList<SET<Integer>> result =new  ArrayList<SET<Integer>> ();int result1 =0;

     ArrayList<SET<Integer>> temp =new  ArrayList<SET<Integer>> ();int temp1=0;

     result=this.greedy(k, d);

     for(int i=0;i<1000;i++){

        temp=this.rso(0.1, d, k);

                    for(int j=0;j<temp.size();j++){

                        temp1=temp1+temp.get(j).size();

                        }

                        for(int k1=0;k1<result.size();k1++){

                            result1=result1+result.get(k1).size();

                        }

        if(result1<temp1){

            result=temp;

        }//if 替换

        temp1=result1=0;

    }//递归完成 for

     return result;

}

public void print(ArrayList<SET<Integer>> result){

    cpOutput out=new cpOutput();int total=0;

    for(int i=0;i<result.size();i++){

        SET<Integer> r1=result.get(i);

        for(int e : r1)

            {//out.print( e+"  ");

            total++;}

        //out.println(" ");

    }

    out.println("并集大小:"+total);

}

public static void main(String args[]){

    

    midtest d=new midtest();

    //d.readtxt("/home/cyl/桌面/kosarak.dat");

    d.readtxt("/home/cyl/桌面/kosarak.dat");

    ArrayList<SET<Integer>> result,result1;

    long start1 =System.currentTimeMillis();

    greedy g=new greedy();

    //result=g.greedy(100, d.matrix);

    //g.print(result);

    long end1=System.currentTimeMillis();

    System.out.println("greedy运行时间:"+(end1-start1)+"ms");

    System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");    

    long start2=System.currentTimeMillis();

    System.out.println("hahaha");

    result1=g.RSO(d.matrix,1000,0.15);    

    g.print(result1);

    long end2=System.currentTimeMillis();

    System.out.println("RSO运行时间:"+(end2-start2)+"ms");

    

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 递归 java 数据