📄 t-eoexternaleo.cpp
字号:
// to avoid long name warnings#ifdef _MSC_VER#pragma warning(disable:4786)#endif#include <iostream>#include <stdexcept> // runtime_error #include <eoEvalFuncPtr.h>#include <other/external_eo>#include <utils/eoRNG.h>using namespace std;struct UserDefStruct{ int a; float b; double c; enum Enum { just, another, test } d;};std::ostream& operator<<(std::ostream& os, const UserDefStruct& str){ return os << str.a << ' ' << str.b << ' ' << str.c << ' ' << static_cast<int>(str.d) << ' ';}istream& operator>>(istream& is, UserDefStruct& str){ is >> str.a; is >> str.b; is >> str.c; int i; is >> i; str.d = static_cast<UserDefStruct::Enum>(i); return is;}UserDefStruct RandomStruct(){ std::cout << "RandomStruct\n"; UserDefStruct result; result.a = rng.random(5); result.b = rng.uniform(); result.c = rng.uniform(); result.d = UserDefStruct::another; return result;}// reading and writingbool UserDefMutate(UserDefStruct& a){ std::cout << "UserDefMutate\n"; a = RandomStruct(); // just for testing if (rng.flip(0.1f)) a.d = UserDefStruct::test; else a.d = UserDefStruct::another; return true;}bool UserDefBinCrossover(UserDefStruct& a, const UserDefStruct& b){ std::cout << "UserDefBinCrossover\n"; if (rng.flip(0.5)) a.a = b.a; if (rng.flip(0.5)) a.b = b.b; if (rng.flip(0.5)) a.c = b.c; if (rng.flip(0.5)) a.d = b.d; return true;}bool UserDefQuadCrossover(UserDefStruct& a, UserDefStruct& b){ std::cout << "UserDefQuadCrossover\n"; if (rng.flip(0.5)) swap(a.a, b.a); if (rng.flip(0.5)) swap(a.b, b.b); if (rng.flip(0.5)) swap(a.c, b.c); if (rng.flip(0.5)) swap(a.d, b.d); return true;}float UserDefEvalFunc(const UserDefStruct& a){ std::cout << "UserDefEvalFunc\n"; return a.b;}int main(){ typedef UserDefStruct External; typedef float FitnessType; typedef eoExternalEO<float, External> EoType; eoExternalInit<FitnessType, External> init(RandomStruct); eoExternalMonOp<FitnessType, External> mutate(UserDefMutate); eoExternalBinOp<FitnessType, External> cross1(UserDefBinCrossover); eoExternalQuadOp<FitnessType, External> cross2(UserDefQuadCrossover); // eoExternalEvalFunc<FitnessType, External> eval(UserDefEvalFunc); EoType eo1; init(eo1); EoType eo2; init(eo2); std::cout << "before mutation " << eo1 << '\n'; mutate(eo1); std::cout << "after mutation " << eo1 << '\n'; cross1(eo1, eo2); std::cout << "after crossover " << eo1 << '\n'; cross2(eo1,eo2);};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -