arccos0的个人博客分享 http://blog.sciencenet.cn/u/arccos0

博文

运筹优化工具——————jsoncpp

已有 3204 次阅读 2018-6-28 18:00 |个人分类:运筹学|系统分类:科研笔记|关键词:学者| 工具, 输入输出

 

一、为什么使用Jsoncpp

运筹优化领域的科研人员与工程实践人员最常用的编程语言之一就是c++。它的优势非常明显,就是执行效率高。我之前尝试过,相同的逻辑使用matlab和c++,两者的运行速度相差10~20倍左右。

但是c++在处理文件输入输出时没有matlab或者python那么简洁方便。大多数运筹优化的从业人员并非擅长于编程,因为我们绝大多数来自于应用数学系、工业工程系、管理科学系等。尤其是在写c++代码时,输入输出的编写会占用我们大量的宝贵时间,而我们其实只想把时间更多地花在问题的核心——建模、算法上。

所以为了更快地实现“输入输出部分”,本文介绍Jsoncpp供各位在工作学习中使用。

二、什么是Json和Jsoncpp

Json是JavaScript Object Notation的简称。具体的含义可以参考维基百科https://en.wikipedia.org/wiki/JSON。简单地说就是“key-value”类型的数据都可以用Json格式保存。举个例子,使用gurobi或者cplex时,有一些我们可调的与优化性能相关的参数,诸如:MIPGap等,又或者是设计元启发式算法时(比如遗传算法、禁忌搜索等)有很多参数需要我们调整。那么我们就可以用如下的格式表达:

{

       “MIPGAP”: 0.001,

       “GA_MutationRate”: 0.05,

       “GA_CrossOverRate”: 0.2

}

  这就是一个典型Json格式的数据。

  Jsoncpp是C++解析Json格式的常用解析库之一。解析Json就仰仗它啦~~

三、Jsoncpp的安装及vs2010环境配置

Jsoncpp的最新下载地址:https://github.com/open-source-parsers/jsoncpp

步骤一、

进入地址,点击release后下载最新版

clip_image001.png

clip_image003.png

步骤二、

使用vs2010或者其他工具(官方文档里用的时meson,但是我试了一下,没成功。。。)对jsoncpp进行编译。

clip_image005.png

注意!!在编译的时候如果选择的运行库是MD,那么对你自己的项目进行编译时也必须设置成为MD!!否则会出现大量的Link错误。

clip_image006.png

编译后在目录jsoncpp\makefiles\msvc2010\Release中可以找到:lib_json.lib

 

clip_image008.png

步骤三、

打开你的vs项目,配置Jsoncpp的使用环境。

1)右击“项目”—》配置属性—》附加包含目录,加入jsoncpp下的include文件夹

clip_image010.png

2)附加库目录,加入lib_json.lib文件所在的路径;

clip_image012.png

3)最后把lib_json.lib加入到附加依赖项中

clip_image014.png

四、示例

以”test.json”为例:

clip_image016.png

我们建立一个新的项目,编写以下代码:

int main{
     double mip_gap;
     double mutation_rate;
     double crossover_rate;
     std::ifstream ff("test.json");
     Json::Value root;
     Json::Reader reader;
     reader.parse(ff,root);
     mip_gap=root["MIPGAP"].asDouble();
     mutation_rate=root["GA_MutationRate"].asDouble();
     crossover_rate=root["GA_CrossOverRate"].asDouble();
     std::cout<<"\n"
         <<"MIPGAP is: "<<mip_gap<<"\n"
         <<"GA_MutationRate is: "<<mutation_rate<<"\n"
         <<"GA_CrossOverRate is: "<<crossover_rate<<"\n";
    system("pause");         
}


 

 

    选择release模式后,运行结果如下:

clip_image018.png

五、总结

文件的输入输出对于解决实际的运筹优化问题,虽然谈不上核心,却是必要的环节。处理不好这个环节,可能会严重耽误进程。

比如对科研工作者而言,算法的性能需要经过各种各样的算例测试后才能确定。而算例的生成就需要许多可调节的参数。这些参数尽量能够在“代码的外部”可以调节,从而加快计算实验的效率。反之,在代码中调整就必须多出了“编译”这个步骤,而编译通常是非常耗时间的。当然txt格式的传输也能做到这点,只是txt文件处理“key-value”这样的数据非常繁琐。

 

 





https://m.sciencenet.cn/blog-3353895-1121293.html


0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-19 03:30

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部