knapsack greedyKnapsack(vector<pair<double,int>> sortedSack, knapsack sack) { int sackIndex; // outer for loop is iterating through sortedSack ratios // look for highest ratio item for (int i = 0; i < sack.getNumObjects(); i++) { // use second value of sorted sack pair as index sackIndex = sortedSack.at(i).second; //get ratio for specific sack(sackIndex) double ratioKnap; double valKnap = sack.getValue(sackIndex); double costKnap = sack.getCost(sackIndex); ratioKnap = valKnap / costKnap; if (sack.getCost() + sack.getCost(sackIndex) <= sack.getCostLimit()) { sack.select(sackIndex); } } for (int k = 0; k < sack.getNumObjects(); k++) { cout<<sack.isSelected(k)<<endl; } return sack; }
/** * Uses a greedy algorithm to find the best solution * @param k the knapsack to use * @param t the time limit */ void greedySolve(knapsack &k) { calculateValueCostRatios(k); while (k.getCost() < k.getCostLimit()) { checkTimeLimit(); int best = getBestObject(k); if (best == -1) break; k.select(best); valueCostRatio[best] = 0; } }
/** * @param k knapsack to find a solution for * @return new knapsack with a random solution */ knapsack randomSolution(knapsack &k) { int i = 0; while (checkValid(k) && i < k.getNumObjects()) { int random = rand() % 2; if (random == 1 && (k.getCost() + k.getCost(i)) < k.getCostLimit()) k.select(i); else k.unSelect(i); i++; } return k; }
/** * Selects the current best object to select * @param k the knapsack to use */ int getBestObject(knapsack &k) { int best = -1; for (int i = 0; i < k.getNumObjects(); i++) { if (best == -1 || valueCostRatio[i] > valueCostRatio[best]) { if (valueCostRatio[i] > 0 && k.getCost(i) <= (k.getCostLimit() - k.getCost())) { best = i; } } } return best; }
void exhaustiveKnapsack(knapsack sack, int timeLimit) { // Get start time to be used in while loop time_t startTime; time(&startTime); // a while loop that expires when time limit is complete by checking difference of // start time and current time at every loop while (true) { // Get current time and stop when greater than input time limit time_t newTime; time(&newTime); if (difftime(newTime, startTime) > timeLimit) { cout << "Time limit expired"; break; } // Put main code here // Update current weight in sack every iteration of while loop int itemsSelected = 0; int currentWeight = 0; for (int i = 0; i < sack.getNumObjects(); i++) { itemsSelected++; currentWeight = sack.getCost(i) + currentWeight; } // Create random index to put into sack srand(time(NULL)); int randNum = rand() % sack.getNumObjects(); // if item isn't selected, and there is enough space, then select item if ((sack.isSelected(randNum) == false) && sack.getCost(randNum) + currentWeight <= sack.getCostLimit()) { sack.select(randNum); } // Need an exit case where there is no more items that can fit in the sack else if (sack.getCost(randNum) + currentWeight > sack.getCostLimit()) { // need to record sack weight and value and items when this happens (and there are // no more items that can legally be added) } } }
/** * Check if a knapsack contains a valid selection * @param k the knapsack instance to check */ bool checkValid(knapsack &k) { return (k.getCost() < k.getCostLimit()); }