private void doWalk(Ant ant) {

		//set reachable and shuffle it
		ACOUtil.changeReachable(reachable, 0);
		ACOUtil.shuffleArray(reachable, rand);
		ant.setWorkUnitIndex(0, reachable[0]);

		for (int step = 1; step < indexes.length; step++) {

			//1]
			int previousIndex = ant.getWorkUnitIndex(step-1);

			//2] compute probabilities for next step
			double probabilitySum = 0.0;
			for (int candidate = step%subProjectActivities; 
					candidate < reachable.length; candidate++) {

				int workIndex = reachable[candidate];

				probabilities[workIndex] =
						Math.pow(trails[previousIndex][workIndex], α) *
						heuristics[previousIndex][workIndex];
				probabilitySum += probabilities[workIndex];

			}

			//3] normalize probabilities
			for (int candidate = step%subProjectActivities; 
					candidate < reachable.length; candidate++) {
				int workIndex = reachable[candidate];
				probabilities[workIndex] = probabilities[workIndex] / probabilitySum;
			}

			//4] next step selection
			double number = rand.nextDouble();
			probabilitySum = 0.0;
			int selectedCandidate = -1;
			for (int candidate = step%subProjectActivities; 
					candidate < reachable.length; candidate++) {

				int workIndex = reachable[candidate];
				probabilitySum += probabilities[workIndex];

				if (number <= probabilitySum) {
					selectedCandidate = candidate;
					break;
				}

			}

			//5]
			if (selectedCandidate == -1) {
				selectedCandidate = reachable.length-1;
			}

			int tmp = reachable[step%subProjectActivities];
			reachable[step%subProjectActivities] = reachable[selectedCandidate];
			reachable[selectedCandidate] = tmp;
			ant.setWorkUnitIndex(step, reachable[step%subProjectActivities]);

			//6] goto activities of other subproject
			if ((step+1) % subProjectActivities == 0) {
				ACOUtil.changeReachable(reachable, step+1);
				ACOUtil.shuffleArray(reachable, rand);
			}
		}

		//evaluate ant solution
		ant.evaluate();
	}