Leela zero是一个开源围棋项目,https://github.com/leela-zero/leela-zero
编译很容易,根据官方文档:

Example of compiling - Windows

# Clone github repo
git clone https://github.com/leela-zero/leela-zero
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程序,见:
https://github.com/sxcong/mfcleela
目前简单实现了人机对弈和悔棋两个功能。
主要功能在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实现。
09-05 02:54