00001 #line 187 "lw/scil.lw"
00002 #include<scil/scil.h>
00003
00004 using namespace SCIL;
00005 using namespace LEDA;
00006
00007 ILP_Problem_::ILP_Problem_(Opt_Sense os_, subproblem* b,
00008 Subproblem_Generator* sg,
00009 Subproblem_Selector* ss, Solution_Saver* s)
00010 : os(os_), root(b), sub_gen(sg), sub_sel(ss), sol_save(s)
00011 { };
00012
00013 ILP_Problem_::ILP_Problem_() {
00014 root=0;
00015 sub_gen=0;
00016 sub_sel=0;
00017 sol_save=0;
00018 };
00019
00020 #line 210 "lw/scil.lw"
00021 void ILP_Problem_::optimize() {
00022 subproblem_result bs;
00023 subproblem* act_bound=root;
00024 root->add_sym_constraint(int_cons);
00025 nSP=0;
00026
00027 while(act_bound!=nil) {
00028 cout<<nSP<<"th subproblem "<<act_bound->rank()<<" rank "
00029 <<sol_save->obj_value()<<" best known solution\n";
00030
00031 bs=act_bound->compute(sol_save);
00032
00033 if(bs==br_branch) {
00034 nSP+=sub_gen->generate(act_bound, sub_sel);
00035 };
00036
00037 if((bs==br_fathom) && (act_bound!=root))
00038 delete act_bound;
00039
00040 act_bound=sub_sel->select();
00041 if(act_bound!=nil) act_bound->expand();
00042 }
00043 }
00044
00045
00046 #line 240 "lw/scil.lw"
00047 var ILP_Problem_::add_binary_variable(double d) {
00048 return root->add_binary_variable(d);
00049 };
00050
00051 var ILP_Problem_::add_integer_variable(double d, int lb, int ub) {
00052 return root->add_integer_variable(d, lb, ub);
00053 };
00054
00055 var ILP_Problem_::add_continous_variable(double d, double lb, double ub) {
00056 return root->add_continous_variable(d, lb, ub);
00057 };
00058
00059 var ILP_Problem_::add_integer_variable(var_obj* va) {
00060 return root->add_integer_variable(va);
00061 };
00062
00063 var ILP_Problem_::add_continous_variable(var_obj* va) {
00064 return root->add_continous_variable(va);
00065 };
00066
00067 cons ILP_Problem_::add_basic_constraint(cons_sense s, double d) {
00068 return root->add_basic_constraint(s, d);
00069 };
00070
00071 cons ILP_Problem_::add_basic_constraint(cons_obj* co) {
00072 return root->add_basic_constraint(co);
00073 };
00074
00075 void ILP_Problem_::add_sym_constraint(sym_constraint* sc) {
00076 root->add_sym_constraint(sc);
00077 };
00078
00079 double ILP_Problem_::solution(var v) {
00080 return sol_save->get_value(v);
00081 };
00082
00083 Integrality_Constraint* ILP_Problem_::integrality_constraint() {
00084 return int_cons;
00085 };