2012-09-28 134 views
0

我正在尝试为项目编程遗传算法,并且难以保持不同的功能。我一直在阅读基于策略的设计,这似乎是解决问题的方法,但我并不真正了解如何实现它。在基于策略的设计中彼此交互的策略

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

回答

0

我对基于策略的设计原则不是很熟悉(对不起),但是当我读到你的问题时,我觉得你需要类似纯虚拟类(作为接口)来帮助你完成它。

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

首先:创建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类将他们分别继承,:SolutionSetBase和FitnessSetBase:

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 

    ... 
} 

现在,我们的algortihm可以使用两种类型的参数运行。我们是否真的需要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对象,并把它传递给这个选择。由于上传和虚拟功能,它将正常工作。如果我过于复杂的话,请原谅我 - 最近我在C++方面远远不够(最近在C#上工作),因此可能会误解语法,但逻辑应该是一样的。