boip.cpp
1.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#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;
}