0

我正在尝试为一个项目编写遗传算法,并且很难将不同的功能分开。我一直在阅读基于策略的设计,这似乎是解决问题的方法,但我并不真正了解如何实现它。

我有一个 OptimizerHost,它继承自一个 SelectionPolicy(用于确定评估哪些解决方案)和一个 FitnessPolicy(用于确定任何给定解决方案的适用性)。问题是我无法弄清楚这两种策略如何相互通信。算法的大部分是在 SelectionPolicy 中实现的,但它仍然需要能够检查其解决方案的适用性。我唯一能想到的就是在 OptimizerHost 本身中实现 ​​SelectionPolicy 算法,这样它就会从 FitnessPolicy 继承它需要的东西。但这似乎首先忽略了使用策略的意义。我是不是误会了什么?

4

1 回答 1

0

我对基于策略的设计原则(抱歉)不是很熟悉,但是当我读到你的问题时,我觉得你需要像纯虚拟类(作为接口)这样的东西来帮助你解决它。

问题是,如果之前没有声明,你不能使用其他的东西:这是基本规则。因此,您需要使用和虚拟接口说 SelectPolicy,FitnessPolicy 有一些成员要使用。请按照示例进行操作,并根据您的算法需求进行相应更改。

首先:为 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。我们真的需要 xxxBase 类型吗?实际上并非如此,只要我们有 SolutionPolicy 和 FitnessPolicy 类的公共接口,我们就可以使用它们;但是使用这种方式,我们将“逻辑”与问题分开了。

现在,我们的选择策略算法可以引用策略类,然后调用所需的函数。请注意,策略类也可以调用彼此的类。所以现在这是一个有效的情况:

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 对象并将它传递给这个 Selector。由于向上转换和虚函数,它将正常工作。

如果我把事情复杂化了,请原谅我——我最近离 C++ 有点远(最近在 C# 上工作)因此可能把语法弄错了,但逻辑应该是一样的。

于 2012-09-28T22:15:34.257 回答