boip.cpp 1.93 KB
#include <vector>
#include <iostream>
#include <utility>
#include <limits>
#include <cmath>
#include <cfloat>
#include <cstdlib>
#include <algorithm>

#include <boost/format.hpp>


#include "boip.h"


Boip::Boip()
{
}

Boip::Boip(int coef1, int coef2, float lambdaMin, float lambdaMax, float U2) :
    coef1_(coef1), coef2_(coef2), lambdaMin_(lambdaMin), lambdaMax_(lambdaMax), U2_(U2)
{
}


Boip::Boip(const Boip& that) :
    coef1_(that.coef1_), coef2_(that.coef2_), lambdaMin_(that.lambdaMin_), lambdaMax_(that.lambdaMax_), U2_(that.U2_)
{
    ip_ = new IP ();
    ip_ = that.ip_;
}

Boip::~Boip()
{
    delete ip_;
}


//add balas jeroslow constraint
void Boip::add_bj_ct(BoipSolution& s){

    int row = ip_->make_constraint(IP::LO, 0, 0);
    int B(0);
    std::vector < double > v = s.get_v_();
    for (size_t i = 0, size = v.size(); i != size; i++)
    {
        if (v[i] > 0.5){
            ip_->add_constraint(row, v_[i], 1);
            B++;
        }
        else {
            ip_->add_constraint(row, v_[i], -1);
        }
    }
    ip_->chg_constraint(row, IP::UP, -DBL_MAX, B-1);

}

//solve ip
int Boip::solve(BoipSolution& s){

    int status = ip_->solve();
    if(status == 0)
    {
        //recover first objective value
        double obj1(ip_->get_obj());

        //recover decision variable values
        std::vector < double > v = std::vector < double > (v_.size());
        for (size_t i = 0, size = v_.size(); i != size; i++)
        {
            v[i] = ip_->get_value(int(v_[i]));
        }

        //recover second objective value

        s.set_v_(v);
        s.set_obj1_(float(obj1));
        s.set_obj2_(0.0);
    }
    return 	status;
}

Boip& Boip::operator=(const Boip& that)
{
    coef1_ = that.coef1_;
    coef2_ = that.coef2_;
    lambdaMin_ = that.lambdaMin_;
    lambdaMax_ = that.lambdaMax_;
    U2_ = that.U2_;
    IP * local_ip = new IP ();
    local_ip = that.ip_;
    delete ip_;
    ip_ = local_ip;
    return *this;
}