有人可以与我分享一个使用Branch和bound方法来解决Set Cover问题的java程序吗? 以下是我到目前为止的情况。因此,在每个阶段,算法应该采用一个集合并获得问题的两个实例:1。从数组列表中选择第一个集合2.不要从arraylist中获取第一个集合。 在这一点上,我坚持如何开始分支和绑定。
import java.util。*;
public class BranchAndBound {
static int bestSoFar=100;
static int count=0;
public static void main(String args[]){
//create the universe
int numU = 10;
MySets universe = new MySets();
for(int i=1;i<=numU;i++){
universe.add(i);
}
//create each set
MySets s1 = new MySets();
MySets s2 = new MySets();
MySets s3 = new MySets();
MySets s4 = new MySets();
MySets s5 = new MySets();
ArrayList<MySets> s=new ArrayList<MySets>();
//elements
s1.add(1);s1.add(2);s1.add(3);s1.add(8);s1.add(9);s1.add(10);
s2.add(1);s2.add(2);s2.add(3);s2.add(4);s2.add(5);
s3.add(4);s3.add(5);s3.add(7);
s4.add(5);s4.add(6);s4.add(7);
s5.add(6);s5.add(7);s5.add(8);s5.add(9);s5.add(10);
s.add(s1);s.add(s2);s.add(s3);s.add(s4);s.add(s5);
branchAndBound(universe,s,0);
}
public static void branchAndBound(MySets U,ArrayList<MySets> listSets,int countSelected){
MySets universe = new MySets();
universe.addAll(U);
ArrayList<MySets> s=new ArrayList<MySets>();
s.addAll(listSets);
MySets selectedSet= new MySets();
selectedSet.addAll(listSets.get(0));
count++;
universe.removeAll(selectedSet);//the universe now contains the elements still need to be covered
listSets.remove(0);//remove the first elemeent from the list
displaySet(selectedSet, "selected set");
displaySet(universe, "universe");
while(!universe.isEmpty() && !listSets.isEmpty()){
branchAndBound(universe,listSets,count);
}
}
public static void displaySet(MySets s, String name){
System.out.print(name+"==>");
Iterator it=s.iterator();
while(it.hasNext()){
Integer value=(Integer)it.next();
System.out.print(+value+" ");
}//while
System.out.println();
}//displaySet
}
答案 0 :(得分:2)
我相信您之前提出了类似问题,并提出了相关问题here。正如那里所指出的,Set Covering是NP-Hard。因此,不知道存在多项式算法。当您从问题的细节中抽象出来时,它是一个整数程序(IP)。因此,您可以使用任何通用IP解算器,例如MS-Excel中提供的解算器。使用分支定界方法解决所有一般整数规划问题。因此,您不需要专门针对Set Covering。您需要做的就是将集合覆盖问题表示为整数程序,并将其提供给解决方案,解决其余部分。 SO上的人不太可能有现成的代码可供您分享。整数编程/线性编程(构成整数编程的基础)代码非常详细和专业。