Set Cover问题的分支定界算法?

时间:2010-12-04 15:18:22

标签: java algorithm

有人可以与我分享一个使用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
}

1 个答案:

答案 0 :(得分:2)

我相信您之前提出了类似问题,并提出了相关问题here。正如那里所指出的,Set Covering是NP-Hard。因此,不知道存在多项式算法。当您从问题的细节中抽象出来时,它是一个整数程序(IP)。因此,您可以使用任何通用IP解算器,例如MS-Excel中提供的解算器。使用分支定界方法解决所有一般整数规划问题。因此,您不需要专门针对Set Covering。您需要做的就是将集合覆盖问题表示为整数程序,并将其提供给解决方案,解决其余部分。 SO上的人不太可能有现成的代码可供您分享。整数编程/线性编程(构成整数编程的基础)代码非常详细和专业。