贪心算法及优化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");
}
}
贪心算法:每次寻找集合中最大的元素组,并将其剔除在数据集中,循环查找下一个最大元素组,直到选取了用户给定的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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- 我是运营,我没有假期