策略在基于策略的设计中相互作用
Policies interacting with one another in policy-based design
我正试图为一个项目编程一个遗传算法,但很难将不同的函数分开。我一直在阅读基于策略的设计,这似乎是一个问题的解决方案,但我真的不知道如何实现它
我有一个OptimizerHost,它继承了SelectionPolicy(用于确定评估哪些解决方案)和FitnessPolicy(用于确定任何给定解决方案的适合度)。问题是,我不知道这两项政策如何相互沟通。该算法的大部分在SelectionPolicy中实现,但它仍然需要能够检查其解决方案的适合性。我唯一能想到的就是在OptimizerHost本身中实现SelectionPolicy算法,这样它就会从FitnessPolicy继承它需要的东西。但这似乎一开始就忽略了使用政策的意义。我是不是误解了什么?
我不太熟悉基于策略的设计原则(抱歉),但当我读到你的问题时,我觉得你需要像纯虚拟类(作为接口)这样的东西来帮助你完成它。
问题是,如果之前没有声明,你就不能使用另一个的东西:这是基本规则。因此,您需要使用和虚拟接口告诉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#上工作),所以可能把语法误认为是东西,但逻辑应该是一样的。
- C++17中的并行执行策略
- 运行时执行策略不同
- 编译器上的策略数据结构不起作用
- 我应该在简单的策略游戏中为各个派系使用类吗 - C++
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 没有执行策略的 std::transform_reduce 是可移植的吗?
- C++ 运算符修改/元编程策略,用于不那么冗长的语法
- 使用 Qt5 SQL 进行异步数据库访问的策略
- C++基于策略的设计:继承与组合
- 当PSO细粒度策略对使用AdsGetObject MSDN API的Windows操作系统生效时,如何获取用户密码到期日
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- Kotlin、NDK和C++的相互作用
- 如何实例化基于输入的策略模式
- 使用策略模式设计软件时出现的问题
- 在发送源代码时省略未使用的boost src文件的策略
- 使用 redis 进行日志缓存:是否可以创建逐出到 PostgreSQL 的逐出策略?
- CMAKE:前导或尾随空格(策略CMP0004)
- 转换非常长的字符串文本C++以满足最大行长策略
- 在插入顺序已知时填充 Eigen3 稀疏矩阵的策略
- 策略在基于策略的设计中相互作用