Esempio n. 1
0
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;
}
Esempio n. 2
0
/**
 * 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;
	}
}
Esempio n. 3
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;
}
Esempio n. 4
0
/**
 * 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)
		}
		

	}
}
Esempio n. 6
0
/**
 * Check if a knapsack contains a valid selection
 * @param k the knapsack instance to check
 */
bool checkValid(knapsack &k)
{
	return (k.getCost() < k.getCostLimit());
}