LEMON 簡介
LEMON 是 COIN-OR(提供了大量的運籌學(xué)相關(guān)算法如B&C等) 開源項目下的一個組件般渡,是一個圖論算法庫,提供了圖論組合優(yōu)化中幾乎所有的基礎(chǔ)算法拉背。
LEMON最大的優(yōu)勢有三點:
1. 運行效率高
依據(jù)LEMON的自己的官網(wǎng)說明文檔(Introduction to LEMON)盒蟆,LEMON表現(xiàn)出了比BGL更高運行效率咐柜,可以說是目前最快的圖論算法庫。
2. 數(shù)據(jù)結(jié)構(gòu)簡單易用通孽,方便上手
在逐漸熟悉了LEMON的基本操作之后序宦,由衷感嘆LEMON中無向圖 ListGraph 比BGL中的undirectedS好用太多!由于BGL的無向圖不支持reverse_edge操作背苦,導(dǎo)致很多簡單的操作都要大費周折互捌。還有g(shù)raph map,LEMON的屬性安裝特別直觀易懂行剂,有python基礎(chǔ)的一看就懂疫剃,相比之下BGL簡直反人類!
3. 可以方便的輸出eps格式的網(wǎng)絡(luò)可視化圖像
這是一個非常令人驚喜的功能硼讽,c++下做可視化一直是個很麻煩的東西巢价。LEMON下使用graphToEps()函數(shù),直接即可生成eps格式圖像固阁,簡單有效的程度甚至超越networkx+matplotlib的組合壤躲!
在VS2015環(huán)境下編譯 LEMON庫
由于各方面的原因,最終還是決定在windows下搭建平臺备燃。雖然官方的說明文檔提供了一定的搭建指導(dǎo)說明碉克,但是使用環(huán)境非常古老加之還有疏漏的地方,對初學(xué)者而言非常不友善并齐。本人在折騰了兩天之后漏麦,終于成功搭建客税。
以下詳細介紹了在windows10 x64+VS2015的環(huán)境下編譯并調(diào)用開發(fā)LEMON庫的全過程。
準(zhǔn)備工作
必要工具 :
- VS2015(理論上2008以上版本皆可撕贞,但本人未經(jīng)嘗試)
- lemon1.3.1 源碼 http://lemon.cs.elte.hu/pub/sources/lemon-1.3.1.zip
- cmake 3.6.2 64位安裝包 https://cmake.org/files/v3.6/cmake-3.6.2-win64-x64.msi
可選工具: - ghost script 9.19 https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs919/gs919w64.exe
- gsview 5.0 http://www.gsview.com/downloads/gsview_setup_6.0.exe
正式開始編譯
-
安裝cmake 需選擇add-path更耻,其他一路next
add-path - 安裝ghost script和gsview ,一路next即可
- 解壓lemnon1.3.1捏膨,本文中解壓到D盤根目錄秧均,即解壓后得到目錄D:/lemon1.3.1。(也可解壓至其他路徑)
- 在D:/lemon1.3.1下建立新文件夾号涯,命名為build
-
運行cmake-gui
運行cmake-gui -
如圖所示填寫路徑目胡。第一項是源碼所在位置,第二項是目標(biāo)位置链快。然后點擊左下角 Configure
-
選擇編譯環(huán)境誉己,切記需要在x64環(huán)境下使用的選擇 xxx Win64
-
點擊finish后,稍等片刻域蜗,結(jié)果如圖所示
-
再次點擊configure巫延,然后點擊generate,帶自動生成完成后地消,即可關(guān)閉cmake炉峰。
- 打開build文件夾,雙擊打開LEMON.sln
-
將左上角活動配置改為Release
- 項目->生成項目脉执,或者F7疼阔。編譯成功結(jié)果如下圖所示:
調(diào)用LEMON庫
- 新建項目->空項目
- 左上角活動配置設(shè)為Release和x64
- 項目->屬性->VC++目錄,包含目錄添加:
D:\lemon-1.3.1\build
和D:\lemon-1.3.1
兩項半夷;鏈接器->常規(guī)->附加庫目錄 添加D:\lemon-1.3.1\build\lemon\Release
婆廊;鏈接器->輸入->附加依賴項 添加lemon.lib
;
一個簡單的例子
#include <iostream>
#include <lemon/list_graph.h>
using namespace std;
using namespace lemon;
void main()
{
ListGraph G;
ListGraph::Node u, v;
u = G.addNode();
v = G.addNode();
G.addEdge(u, v);
for (ListGraph::EdgeIt e(G);e!=INVALID;++e)
{
cout << G.id(G.u(e)) << "--" << G.id(G.v(e)) << endl;
}
}
運行結(jié)果