コード例 #1
0
ファイル: Annealing.cpp プロジェクト: ParadoxBlack/Pea
TSP Anneal::anneal(TSP Tsp, double coolingRate)
{
	double temperature = pow((double)tsp.getDimension(), 2) * 1000.0;
	double absoluteTemperature = 0.00001;
	this->tsp = Tsp;
	dimension = tsp.getDimension();
	Greedy greedy;

	currentOrder = greedy.greedy(tsp).getSolution();
	//currentOrder.resize(dimension);
	//for (int i = 0; i < dimension; i++) currentOrder[i] = i;

	vector<int> bestOrder = currentOrder;

	int iteration = -1;
	
	double deltaDistance = 0;

	double distance = getTotalDistance(currentOrder);
	double bestDistance = distance;
	uniform_real_distribution<double> distribution(0.0, 1.0);
	default_random_engine generator;

	while (temperature > absoluteTemperature)
	{
		nextOrder = getNextOrder(currentOrder);

		deltaDistance = getTotalDistance(nextOrder) - distance;


		if ((deltaDistance < 0) || (distance > 0 && exp(-deltaDistance / temperature) > distribution(generator)))
		{
			currentOrder = nextOrder;

			distance = deltaDistance + distance;
		}

		if (distance < bestDistance) bestOrder = currentOrder;
		else if (distance > bestDistance * 1.5)
		{
			currentOrder = bestOrder;
			distance = bestDistance;
		}


		temperature *= coolingRate;

		iteration++;
	}

	tsp.updateSolution(bestOrder);
	return tsp;
}
コード例 #2
0
int main()
{
    std::cout << "=== Exercise 03 from Chapter 04 ===" << std::endl;

    std::vector<double> distances = collectDistances();

    std::cout << "Total distance: " << getTotalDistance(distances) << std::endl;
    std::cout << "Smallest distance: " << getSmallestDistance(distances)
              << std::endl;
    std::cout << "Largest distance: " << getLargestDistance(distances)
              << std::endl;
    std::cout << "Mean distance: " << getMeanDistance(distances) << std::endl;

    return 0;
}
コード例 #3
0
ファイル: Display.cpp プロジェクト: rxk8345/Cyclometer
void displayDistance(){
	int a,b,c,d;

	double totalDis = getTotalDistance();

	if(totalDis >= 1000 ){
		// only allow display four digits, max display 9999
		a = 9;
		b = 9;
		c = 9;
		setDecimalAnode2(true);
		d = 9;
	}else{
		//3 digit + decimal
		a = totalDis / 100;
		b = (totalDis - a * 100) / 10;
		c = (totalDis - a * 100 - b * 10);
		setDecimalAnode2(true);
		d = (totalDis - a * 100 - b * 10 - c) * 10;
	}

	displayNumbers(a,b,c,d);
}