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