/**
   * benchmark a tsp algorithm
   *
   * @param instances the instances
   * @param algo the algorithm class
   * @param params the parameters
   */
  public static final void benchmark(
      final ArrayListView<Instance> instances,
      final Class<? extends TSPAlgorithm> algo,
      final String[] params) {
    final Logger log;
    final Configuration cfg;
    final TSPAlgorithmRunner r;

    cfg = new Configuration();
    try {
      cfg.configure(params);

      r = new TSPAlgorithmRunner(instances, algo, null);
      r.configure(cfg);

      log = r.getLogger();

      if ((log != null) && (log.isLoggable(Level.INFO))) {
        log.info(
            "TSP Algorithm Benchmarker now running "
                + //$NON-NLS-1$
                ((algo != null) ? algo.getSimpleName() : String.valueOf(null)));
      }

      if (cfg.getBoolean(Configurable.PARAM_HELP, false)) {
        r.printParameters(System.out);
        return;
      }

      r.benchmark();
    } catch (final Throwable t) {
      t.printStackTrace();
    }
  }
  /** {@inheritDoc} */
  @Override
  public final void configure(final Configuration config) {
    super.configure(config);

    this.m_maxThreads =
        config.getInt(TSPAlgorithmRunner.PARAM_MAX_THREADS, 1, 10000, this.m_maxThreads);

    this.m_algoInst =
        config.getInstance(
            TSPAlgorithmRunner.PARAM_ALGO_CLASS, TSPAlgorithm.class,
            this.m_algo, this.m_algoInst);
    if (this.m_algoInst != null) {
      this.m_algo = this.m_algoInst.getClass();
    }

    this.m_initInst =
        config.getInstance(
            TSPAlgorithmRunner.PARAM_DET_INIT_CLASS, TSPAlgorithm.class,
            this.m_init, this.m_initInst);
    if (this.m_initInst != null) {
      this.m_init = this.m_initInst.getClass();
    }

    this.m_queue.configure(config);
    this.m_creator.configure(config);
  }