Esempio n. 1
0
value_disambiguator::result_type
value_disambiguator::operator()(ast::measure& measure)
{
  value_disambiguation::measure_interpretations
  interpretations(measure, time_signature, prev_duration, prev_doubled_tuplets);

  if (!interpretations.contains_complete_measure() && !interpretations.empty()) {
    if (!anacrusis) {
      anacrusis = interpretations;
      prev_duration = 0;
      prev_doubled_tuplets.clear();
      return true;
    }

    if (anacrusis->completes_uniquely(interpretations)) {
      for (auto& lhs: *anacrusis) {
        for (auto& rhs: interpretations) {
          if (duration(lhs) + duration(rhs) == time_signature) {
            lhs.accept(), rhs.accept();
            prev_duration = duration(rhs);
            prev_doubled_tuplets = rhs.get_doubled_tuplets();
            anacrusis.reset();
            return true;
          }
        }
      }
    }
  }

  if (interpretations.size() == 1) {
    auto &proxied_measure = interpretations.front();
    proxied_measure.accept();
    prev_duration = duration(proxied_measure);
    prev_doubled_tuplets = proxied_measure.get_doubled_tuplets();
    return true;
  }

  if (interpretations.empty()) {
    report_error(measure.id, L"No possible interpretations");
  } else {
    std::wstringstream s;
    s << interpretations.size() << L" possible interpretations:";
    for (auto& interpretation: interpretations) {
      rational const score(interpretation.harmonic_mean());
      s << std::endl
        << boost::rational_cast<float>(score) << L": " << interpretation;
    }
    report_error(measure.id, s.str());
  }
  return false;
}
Esempio n. 2
0
//---------------------------------------------------------------------------
bool AntSolver2::solve( int numSteps )
{
	init();	

	vector<int> uninstantiatedVariables( problem->getNumVars(), 0 );	
	vector<int> numSatisfiedConstraints( numAnts );	
	vector< vector<double> > valuesScore( problem->getNumVars() );

	calculateValuesScore( valuesScore );

	MinConflicts *minConflicts = NULL;
	if ( useLocalSearch )
	{
		minConflicts = MinConflicts::create( problem );
	}

	int maxSatisfiedConstraints;

	int i, j;

	for ( i = 0; i < numSteps; i++ )
	{

		maxSatisfiedConstraints = 0;
		vector< CSPInterpretation > interpretations( numAnts );
		for ( j = 0; j < numAnts; j++ )
		{			
			int numVars = problem->getNumVars();

			// Initialize the vector of uninstantiated variables
			int k;
			for ( k = 0; k < numVars; k++ )
			{
				uninstantiatedVariables[k] = k;
			}

			// Build a path			
			
			interpretations[j].setNumVariables( problem->getNumVars() );
			for ( k = 0; k < problem->getNumVars(); k++ )
			{
				// Pick a variable.
				int variable = pickUninstantiatedVariable( interpretations[j], uninstantiatedVariables , problem->getNumVars() - k );
				// pick a value from this variable
				int value    = pickValue( variable, valuesScore );

				interpretations[j].setVariableValue( variable, value );
			}

			if ( useLocalSearch )
			{
				minConflicts->localSearch( interpretations[j], interpretations[j] );
			}

			numSatisfiedConstraints[j] = problem->getNumSatisfiedConstraints( interpretations[j] );
			if ( numSatisfiedConstraints[j] == problem->getConstraintList()->getNumConstraints() )
			{
				result = interpretations[j];
				stepsPerformed = i;
				if ( minConflicts )
					minConflicts->release();
				return true;
			}
			if ( numSatisfiedConstraints[j] > maxSatisfiedConstraints )
			{
				maxSatisfiedConstraints = numSatisfiedConstraints[j];
			}
		}

		// Now that we've built all assignments
		// let's choose the best ones
		// Only the assignmenst with the max number of satisfied
		// constraints will lay pheromone
		for ( j = 0; j < numAnts; j++ )
		{
			if ( numSatisfiedConstraints[j] == maxSatisfiedConstraints )
			{
				layPheromone( interpretations[j] );
			}
		}

		//cout << "Step " << i << ", maxSatisfiedConstraints: " << maxSatisfiedConstraints << endl;
		cout << i << ", " << maxSatisfiedConstraints << endl;
		//if ( i % 10 == 0 )
		{
			//printPheromones ( i, maxSatisfiedConstraints );
		}
	}

	stepsPerformed = i;

	if ( useLocalSearch )
	{
		minConflicts->release();
	}

	return false;
}