0

プロジェクトの遺伝的アルゴリズムをプログラムしようとしていますが、さまざまな機能を別々に保つのに苦労しています。ポリシーベースの設計について調べてきましたが、これは問題の解決策のように思えますが、実装方法がよくわかりません。

SelectionPolicy (評価するソリューションを決定するため) と FitnessPolicy (特定のソリューションの適合性を決定するため) から継承する OptimizerHost があります。問題は、2 つのポリシーがどのように相互に通信できるかを理解できないことです。アルゴリズムの大部分は SelectionPolicy に実装されていますが、それでも解の適合性をチェックできる必要があります。私が考えることができる唯一のことは、OptimizerHost 自体に SelectionPolicy アルゴリズムを実装することです。そうすれば、FitnessPolicy から必要なものを継承します。しかし、それではそもそもポリシーを使用するという点が欠けているように思えます。私は何か誤解していますか?

4

1 に答える 1

0

私はポリシーベースの設計原則にあまり詳しくありませんが (申し訳ありません)、あなたの問題を読んだとき、それを解決するために (インターフェイスとして) 純粋な仮想クラスのようなものが必要だと感じました。

問題は、事前に宣言されていない場合、他のものを使用できないということです。これが基本的なルールです。したがって、FitnessPolicy に使用するメンバがいくつかあることを SelectPolicy に伝えるには、仮想インターフェイスを使用する必要があります。例に従って、必要に応じてアルゴリズムを変更してください。

最初に、SelectionPolicy と FitnessPolicy のインターフェースを作成します。

template <class T> class FitnessPolicyBase
{
  public:

    virtual int Fitness(T fitnessSet); // assuming you have implemented the required classes etc. here - return value can be different of course

  ...
} // write your other FitnessPolicy stuff here

template <class T> class SelectionPolicyBase
{
  public:

   virtual T Selector(FitnessPolicyBase<Solution> evaluator, Set<T> selectionSet); // assuming such a set exists here

   ...  
} // write your other selectionpolicy interface here

さて、これらのクラスを純粋仮想 (仮想関数しか持たない) にしたので、それらを使用することはできず、継承するだけです。これはまさに私たちが行うことです: SelectionPolicy クラスと FitnessPolicy クラスはそれぞれから継承されます:

class SelectionPolicy: public SelectionPolicyBase<Solution> // say, our solutions are of Solution Type...
{
  public:
    virtual Solution Selector(FitnessPolicyBase<Solution> evaluator, Set<Solution> selectionSet);   // return your selected item in this function

  ...
}

class FitnessPolicy : public FitnessPolicy Base<Solution> // say, our solutions are of SolutionSet Type...
{
  public:
    virtual int Fitness(Solution set);   // return the fitness score here

  ...
}

ここで、アルゴリズムは、SolutionSetBase と FitnessSetBase の 2 種類のパラメーターで実行できます。xxxBase 型は本当に必要だったのでしょうか? 実際には、SolutionPolicy クラスと FitnessPolicy クラスのパブリック インターフェイスがある限り、それらを使用できます。しかし、この方法を使用して、「ロジック」を問題から分離しました。

これで、Selection Policy アルゴリズムはポリシー クラスへの参照を取得し、必要な関数を呼び出すことができます。ここで、ポリシー クラスは互いのクラスを呼び出すこともできることに注意してください。したがって、これは現在有効な状況です。

virtual Solution SelectionPolicy::Selector(FitnessPolicyBase<Solution> evaluator, Set<T> selectionSet)
{
  int score = evaluator.Fitness(selectionSet[0]); //assuming an array type indexing here. Change accordingly to your implementation and comparisons etc. 
}

ただし、これが機能するためには、FitnessPolicy オブジェクトを初期化し、それをこのセレクターに渡す必要があります。アップキャストと仮想機能により、正常に動作します。

私が物事を複雑にしすぎていた場合はご容赦ください - 私は最近 C++ から少し離れていたので (最近 C# に取り組んでいます)、構文を何かと間違えたかもしれませんが、ロジックはとにかく同じである必要があります。

于 2012-09-28T22:15:34.257 に答える