c++ 用于MILP的节点计数和LP松弛的GRBCallback

6tr1vspr  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(123)

我正在用C++程序调用Gurobi求解一个MILP问题,我想得到生成的节点数和LP松弛的目标函数值。
对于节点计数,我使用了以下类:

class NodeCounter : public GRBCallback {
    public:
       int nodecnt;
    
        void callback() {
            if (where == GRB_CB_MIPNODE) {
                nodecnt =  getDoubleInfo(GRB_CB_MIPNODE_NODCNT);
            }
        }

};

然后在model.optimize()之前调用函数,如下所示:

// Create an instance of callback class
        NodeCounter callback;

        // Set the callback function
        model.setCallback(&callback);

但是我得到的节点数不正确!
对于LP松弛,我调用Model.relax()来创建MILP的松弛,然后再次求解,我的问题是:如何使用callback得到LP而不需要再次求解LP?

km0tfn4u

km0tfn4u1#

我想与大家分享我目前为止找到的计算生成节点数的解决方案。

class NodeCounter : public GRBCallback
{
public:
    double nodecnt;

    void callback()
    {
        if (where == GRB_CB_MIP)
        {
            nodecnt = getDoubleInfo(GRB_CB_MIP_NODCNT);
        }
    }
};

我注意到,在这个例子中,返回的节点数小于日志文件中声明的节点数1,但是,如果日志文件中声明的节点数是0或1,那么类在这两种情况下都返回0,有没有办法区分后两种情况?

相关问题