樽中酒不空
分类: c/c
2019-05-20 16:41:59
# clone github repo
git clone
cd leela-zero
git submodule update --init --recursive
cd msvc
double-click the leela-zero2015.sln or leela-zero2017.sln corresponding
to the visual studio version you have.
# build from visual studio 2015 or 2017
唯一遇到的麻烦就是github有时下载非常慢。 leela zero本身是基于gtp协议的程序,如果不使用第三方客户端的话,启动后需要在命令行下手动输入命令下棋。出于调试和移植的目的,这里用mfc改写了一下,增加了一个简单的ui,然后调用leelaapp.c里面的代码,整合成了一个独立的demo程序,见:
。
目前简单实现了人机对弈和悔棋两个功能。
主要功能在leelaapp这个class中,比如:
void leelaapp::init() { // set up engine parameters gtp::setup_default_parameters(); cfg_cpu_only = true; cfg_num_threads = std::min(smp::get_num_cpus(), size_t{ max_cpus }); cfg_num_threads = 2; cfg_allow_pondering = false; cfg_max_playouts = 100; cfg_timemanage = timemanagement::fast; cfg_timemanage = timemanagement::off; cfg_max_visits = uctsearch::unlimited_playouts; //cfg_max_visits = 3200; // default to self-play and match values. //cfg_fpu_root_reduction = cfg_noise ? 0.0f : cfg_fpu_reduction; cfg_fpu_root_reduction = 0.25; //parse_commandline(argc, argv); // disable io buffering as much as possible std::cout.setf(std::ios::unitbuf); std::cerr.setf(std::ios::unitbuf); std::cin.setf(std::ios::unitbuf); setbuf(stdout, nullptr); setbuf(stderr, nullptr); init_global_objects(); maingame = std::make_unique(); /* set board limits */ maingame->init_game(board_size, komi); time_settings("0 10 1"); }
基本都是leela-zero的原始代码,只是改用mfc界面下调用。
根据这个demo程序,界面再优化一下,完善一下功能,可以做一个简单的围棋客户端了。
这里最大的问题是:leela-zero每次启动加载权重文件,如果有时间把权重文件分析好,放到内存缓存起来,这样每次启动客户端会节省很多时间。
这个程序是用vc2017写的,只是在leela zero的源码上增加啊界面,同样道理,使用qt,c#等开发工具一样能实现同样效果。同样也可以在android和ios实现。