貪心算法及優化RSO實現

問題域:一個給定的由元素組聚合合成的數據集,從中選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");
    

}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章