/****************************************************************
* Program Solving the KNAPSACK problem using a heurustic *
* Author Jakub Holy *
* For the subject PAA, LS2002 *
****************************************************************
*/
#include "hw1_heuristic.hh"
#include <iomanip.h>
// --------------------------------------------- CONST etc.
HeurItem::HeurItem(int id, Item& it) : Item (it.weight, it.cost){
HeurItem::id = id;
ratio = it.cost / it.weight;
}//HeurItem constr
// ----------------------------------------------------------
KnapsackProblem::KnapsackProblem(int task_id, int nr_items, int max_load, Item **items){
// Parameters
KnapsackProblem::task_id = task_id;
KnapsackProblem::nr_items = nr_items;
KnapsackProblem::max_load = max_load;
KnapsackProblem::items = items;
// Init other fields
solution = new bool[nr_items]; // normally shall be init. to false manually ...
load = 0;
cost = 0;
// The Vector
// 1. Init the vector: insert items
for(int i=0; i < nr_items; i++){
item_vect.push_back( *(new HeurItem(i, *(items[i]))));
}// items -> item_vect
// 2. Sort the items
sort(item_vect.begin(), item_vect.end(), OptimalityCriterium() );
} // constructor
KnapsackProblem::~KnapsackProblem(){
delete [] items;
delete [] solution;
} //destructor
// --------------------------------------------- SOLVE
void KnapsackProblem::solve(void){
int index = 0;
for (TItem_vect::iterator iter = item_vect.begin(); iter != item_vect.end(); ++iter) {
// Include the item, if not too heavy.
if( ( load + iter->weight ) <= max_load ){
solution[index] = true; // include the item
load += iter->weight; // add its weight to the total load
cost += iter->cost; // add its cost to the total one
} else {
solution[index] = false;
}//if-else
index++;
}// for all elements in the vector
}//solve
// --------------------------------------------- PRINT
void KnapsackProblem::printResult(void){
assert( solution!=0 );
cout << cost<<endl;
}//printResult
//****************************************************************** MAIN
int main(int argc, char **argv){
//Open data file and load the 1st task
if ( argc != 2 ) {
cout << "Error: Wrong number of parameters.\n";
cout << "Use: bruteforce taskfile\n";
}// if wrong input
KnapsackInput *in = new KnapsackInput( argv[1] );
// For all tasks in the file:
do {
// Solve a task
KnapsackProblem *problem = new KnapsackProblem(in->getTaskID(), in->getNr_items(), in->getMax_load(), in->getItems() );
problem->solve();
problem->printResult();
} while ( in->loadNextTask() );
//---------
return 0;
}// main