⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qp_partial_exact_pricing.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
// Copyright (c) 1997-2007  ETH Zurich (Switzerland).// All rights reserved.//// This file is part of CGAL (www.cgal.org); you may redistribute it under// the terms of the Q Public License version 1.0.// See the file LICENSE.QPL distributed with CGAL.//// Licensees holding a valid commercial license may use this file in// accordance with the commercial license agreement provided with the software.//// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.//// $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.3-branch/QP_solver/include/CGAL/QP_solver/QP_partial_exact_pricing.h $// $Id: QP_partial_exact_pricing.h 38453 2007-04-27 00:34:44Z gaertner $// //// Author(s)     : Sven Schoenherr//                 Bernd Gaertner <gaertner@inf.ethz.ch>//                 Franz Wessendorp //                 Kaspar Fischer#ifndef CGAL_QP_PARTIAL_EXACT_PRICING_H#define CGAL_QP_PARTIAL_EXACT_PRICING_H// includes#include <CGAL/QP_solver/QP__partial_base.h>CGAL_BEGIN_NAMESPACE// =================// class declaration// =================template < typename Q, typename ET, typename Tags >class QP_partial_exact_pricing;// ===============// class interface// ===============template < typename Q, typename ET, typename Tags >class QP_partial_exact_pricing : public QP__partial_base<Q,ET,Tags> {    // self    typedef  QP_pricing_strategy<Q,ET,Tags>       Base;    typedef  QP__partial_base<Q,ET,Tags>          Partial_base;    typedef  QP_partial_exact_pricing<Q,ET,Tags>  Self;    // types from the pricing base class    typedef  typename Tags::Is_nonnegative           Is_nonnegative;    typedef  typename Partial_base::Index_iterator        Index_iterator;    typedef  typename Partial_base::Index_const_iterator  Index_const_iterator;  public:    // creation    QP_partial_exact_pricing( bool     randomize = false,			       Random&  random    = default_random);    // operations    int  pricing(int& direction );        // creation    ~QP_partial_exact_pricing(){ };  private:    int pricing_helper(int& direction, Tag_true  /*is_in_standard_form*/);    int pricing_helper(int& direction, Tag_false /*is_in_standard_form*/);};// ----------------------------------------------------------------------------// =============================// class implementation (inline)// =============================// constructiontemplate < typename Q, typename ET, typename Tags >  inlineQP_partial_exact_pricing<Q,ET,Tags>::QP_partial_exact_pricing( bool  randomize, Random&  random)    : Base( "partial exact"),      Partial_base( randomize, random){ }    // operationstemplate < typename Q, typename ET, typename Tags >int  QP_partial_exact_pricing<Q,ET,Tags>::pricing(int& direction ){  return (pricing_helper(direction, Is_nonnegative()));}template < typename Q, typename ET, typename Tags >int  QP_partial_exact_pricing<Q,ET,Tags>::pricing_helper(int& /*direction*/, Tag_true /*is_in_standard_form*/){    Index_const_iterator  it, min_it;    ET mu, min_mu = this->et0;    // loop over all active non-basic variables    CGAL_qpe_debug {	this->vout() << "active variables:" << std::endl;    }    for ( it = this->active_set_begin(); it != this->active_set_end(); ++it) {        // don't price artificial variables	if (this->solver().is_artificial( *it) ||	    this->solver().is_basic( *it))  // added by kf	  continue;	// compute mu_j	mu = mu_j( *it);	CGAL_qpe_debug {	    this->vout() << "  mu_" << *it << ": " << mu << std::endl;	}	// new minimum?	if ( mu < min_mu) { min_it = it; min_mu = mu; }    }    // no entering variable found so far?    if ( ( min_mu == this->et0) && ( this->inactive_set_begin() <                                     this->inactive_set_end())) {	// loop over all inactive non-basic variables	CGAL_qpe_debug {	    this->vout() << "inactive variables:" << std::endl;	}	Index_const_iterator  active_it;	for ( it = this->inactive_set_begin(); it != this->inactive_set_end(); ++it) {	    // don't price artificial variables	    if (this->solver().is_artificial( *it)) continue;	    	    // compute mu_j	    mu = mu_j( *it);	    CGAL_qpe_debug {		this->vout() << "  mu_" << *it << ": " << mu << std::endl;	    }	    // candidate for entering?	    if ( mu < this->et0) {		// make variable active		active_it = it;		activating( active_it);		// new minimum?		if ( mu < min_mu) { min_it = active_it; min_mu = mu; }	    }	}    }    CGAL_qpe_debug {       this->vout() << std::endl;    }    // return index of entering variable, if any    if ( min_mu < this->et0) {	int  j = *min_it;	entering_basis( min_it);	return j;    }    // no entering variable found    return -1;}template < typename Q, typename ET, typename Tags >int  QP_partial_exact_pricing<Q,ET,Tags>::pricing_helper(int& direction, Tag_false /*is_in_standard_form*/){    Index_const_iterator  it, min_it;    int                   min_j = -1;    ET                    mu, min_mu =  this->et0;    // loop over all active non-basic variables    CGAL_qpe_debug {	this->vout() << "active variables:" << std::endl;    }    for ( it = this->active_set_begin(); it != this->active_set_end(); ++it) {        // don't price artificial variables	if (this->solver().is_artificial( *it) ||	    this->solver().is_basic( *it))  // added by kf	  continue;	// compute mu_j	mu = this->mu_j( *it);	if (price_dantzig (*it, mu, this->et0, min_j, min_mu, direction))	  min_it = it;    }    // no entering variable found so far?    if ( ( min_j == -1) && ( this->inactive_set_begin() <                             this->inactive_set_end()))       {	// loop over all inactive non-basic variables	CGAL_qpe_debug {	    this->vout() << "inactive variables:" << std::endl;	}	Index_const_iterator  active_it;	for ( it = this->inactive_set_begin(); 	      it != this->inactive_set_end(); ++it) {	  // don't price basics/artificials	  CGAL_qpe_assertion (!this->solver().is_basic(*it));	  if (this->solver().is_artificial( *it)) continue;	    	  // compute mu_j	  mu = mu_j( *it);	  CGAL_qpe_debug {	    this->vout() << "  mu_" << *it << ": " << mu << std::endl;	  }	  // candidate for entering?	  if ( is_improving(*it, mu, this->et0)) {	    // make variable active	    active_it = it;	    activating( active_it);	    // new minimum?	    if (price_dantzig (*active_it, mu, this->et0, 			       min_j, min_mu, direction))	      min_it = active_it;	  }	}      }    CGAL_qpe_debug {       this->vout() << std::endl;    }    // return index of entering variable, if any    if ( min_j >= 0) {      CGAL_qpe_assertion(min_j == *min_it);      entering_basis( min_it);      return min_j;    }    // no entering variable found    return -1;}CGAL_END_NAMESPACE#endif // CGAL_QP_PARTIAL_EXACT_PRICING_H// ===== EOF ==================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -