private void collectiveVolitiveMovement(boolean overallWeightIncreased) {
		double[] barycenter = new double[dimensions];
		double totalWeight = 0;
		
		// calculating barycenter
		for (int i = 0; i < school.size(); i++) {
			Fish _fish = school.get(i);
			
			for (int j = 0; j < dimensions; j++) {
				barycenter[j] += _fish.getPosition()[j] * _fish.getWeight();
			}
			
			totalWeight += _fish.getWeight();
		}
		
		for (int i = 0; i < dimensions; i++) {
			barycenter[i] /= totalWeight;
		}
		
		// applying barycenter
		for (int i = 0; i < school.size(); i++) {
			Fish _fish = school.get(i);
			double[] schoolVolitivePosition = new double[dimensions];
			
			for (int j = 0; j < dimensions; j++) {
				double product = STEP_VOL * rand.nextDouble() * (_fish.getPosition()[j] - barycenter[j]);
				if (!overallWeightIncreased) product *= -1;
				schoolVolitivePosition[j] = _fish.getPosition()[j] + product;
				
				boolean collision = schoolVolitivePosition[j] < -RANGE || schoolVolitivePosition[j] > RANGE;
				if (collision)
				{
					schoolVolitivePosition[j] = schoolVolitivePosition[j] > 0 ? RANGE : - RANGE;
				}
			}
			
			_fish.setPosition(schoolVolitivePosition);
		}
		
		STEP_VOL -= (INITIAL_STEP_VOL - FINAL_STEP_VOL) / maxIterations;
	}