使用 Gurobi 和 C++ 解决 IP
Solving a IP with Gurobi and C++
我尝试用 gurobi 解决一个非常简单的 IP,运行 它来自 c++(来源:http://rmlewi.people.wm.edu/~rmlewi/sciclone/docs/gurobi/quickstart/node5.html):
#include <iostream>
#include "gurobi_c++.h"
using namespace std;
int main(int argc,
char *argv[])
{
try {
GRBEnv env = GRBEnv();
GRBModel model = GRBModel(env);
// Create variables
GRBVar x = model.addVar(0.0, 1.0, -1.0, GRB_BINARY, "x");
GRBVar y = model.addVar(0.0, 1.0, -1.0, GRB_BINARY, "y");
GRBVar z = model.addVar(0.0, 1.0, -2.0, GRB_BINARY, "z");
// Integrate new variables
model.update();
// Add constraint: x + 2 y + 3 z <= 4
GRBLinExpr expression;
expression += x;
expression += 2*y;
expression += 3*z;
model.addConstr(expression <= 4, "c0");
// Add constraint: x + y >= 1
model.addConstr(x + y >= 1, "c1");
// Optimize model
model.optimize();
cout << x.get(GRB_StringAttr_VarName) << " "
<< x.get(GRB_DoubleAttr_X) << endl;
cout << y.get(GRB_StringAttr_VarName) << " "
<< y.get(GRB_DoubleAttr_X) << endl;
cout << z.get(GRB_StringAttr_VarName) << " "
<< z.get(GRB_DoubleAttr_X) << endl;
cout << "Obj: " << model.get(GRB_DoubleAttr_ObjVal) << endl;
} catch(GRBException e) {
cout << "Error code = " << e.getErrorCode() << endl;
cout << e.getMessage() << endl;
} catch(...) {
cout << "Exception during optimization" << endl;
}
cout << "Hello, World!" << endl;
return 0;
为了构建它,我使用以下 CMake 文件:
cmake_minimum_required(VERSION 3.2)
project(gurobitest)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp)
add_executable(gurobitest ${SOURCE_FILES})
if (GUROBI_INCLUDE_DIR)
# in cache already
set(GUROBI_FOUND TRUE)
set(GUROBI_INCLUDE_DIRS "${GUROBI_INCLUDE_DIR}" )
set(GUROBI_LIBRARIES "${GUROBI_LIBRARY};${GUROBI_CXX_LIBRARY}" )
else (GUROBI_INCLUDE_DIR)
find_path(GUROBI_INCLUDE_DIR
NAMES gurobi_c++.h
PATHS "/Library/gurobi604/mac64/include"
"$ENV{GUROBI_HOME}/include"
"C:\libs\gurobi604\include"
#CMAKE_ROOT_PATH "/Library/gurobi604/mac64"
)
find_library( GUROBI_LIBRARY
NAMES gurobi
gurobi45
gurobi46
gurobi50
gurobi51
gurobi52
gurobi55
gurobi56
gurobi60
libgurobi_c++.a
libgurobi60.so
PATHS "$ENV{GUROBI_HOME}/lib"
"/Library/gurobi604/mac64/lib"
"/Library/gurobi604/mac64/lib"
"C:\libs\gurobi604\lib"
)
find_library( GUROBI_CXX_LIBRARY
NAMES gurobi_c++
libgurobi60.so
libgurobi_c++.a
PATHS "$ENV{GUROBI_HOME}/lib"
"/Library/gurobi604/mac64/lib"
"C:\libs\gurobi604\lib"
)
set(GUROBI_INCLUDE_DIRS "${GUROBI_INCLUDE_DIR}" )
set(GUROBI_LIBRARIES "${GUROBI_LIBRARY};${GUROBI_CXX_LIBRARY}" )
endif(GUROBI_INCLUDE_DIR)
include_directories(${GUROBI_INCLUDE_DIR})
target_link_libraries(gurobitest ${GUROBI_CXX_LIBRARY})
target_link_libraries(gurobitest ${GUROBI_LIBRARY})
但是,我编译的时候总是遇到问题。然后出现如下错误信息:
Linking CXX executable gurobitest
Undefined symbols for architecture x86_64:
似乎所有 grub 命令都不为人所知。
如果这很重要,我会使用 mac。有什么有用的提示吗?
我的一个朋友找到了答案。最后一部分不完全正确:
include_directories( ${GUROBI_INCLUDE_DIRS} )
target_link_libraries( gurobitest ${GUROBI_LIBRARIES} )
set (CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -stdlib=libstdc++")
set (CMAKE_SHARED_LINKER_FLAGS "-lgurobi_c++ -lgurobi60, --as-needed")
显然标志设置不正确。
我尝试用 gurobi 解决一个非常简单的 IP,运行 它来自 c++(来源:http://rmlewi.people.wm.edu/~rmlewi/sciclone/docs/gurobi/quickstart/node5.html):
#include <iostream>
#include "gurobi_c++.h"
using namespace std;
int main(int argc,
char *argv[])
{
try {
GRBEnv env = GRBEnv();
GRBModel model = GRBModel(env);
// Create variables
GRBVar x = model.addVar(0.0, 1.0, -1.0, GRB_BINARY, "x");
GRBVar y = model.addVar(0.0, 1.0, -1.0, GRB_BINARY, "y");
GRBVar z = model.addVar(0.0, 1.0, -2.0, GRB_BINARY, "z");
// Integrate new variables
model.update();
// Add constraint: x + 2 y + 3 z <= 4
GRBLinExpr expression;
expression += x;
expression += 2*y;
expression += 3*z;
model.addConstr(expression <= 4, "c0");
// Add constraint: x + y >= 1
model.addConstr(x + y >= 1, "c1");
// Optimize model
model.optimize();
cout << x.get(GRB_StringAttr_VarName) << " "
<< x.get(GRB_DoubleAttr_X) << endl;
cout << y.get(GRB_StringAttr_VarName) << " "
<< y.get(GRB_DoubleAttr_X) << endl;
cout << z.get(GRB_StringAttr_VarName) << " "
<< z.get(GRB_DoubleAttr_X) << endl;
cout << "Obj: " << model.get(GRB_DoubleAttr_ObjVal) << endl;
} catch(GRBException e) {
cout << "Error code = " << e.getErrorCode() << endl;
cout << e.getMessage() << endl;
} catch(...) {
cout << "Exception during optimization" << endl;
}
cout << "Hello, World!" << endl;
return 0;
为了构建它,我使用以下 CMake 文件:
cmake_minimum_required(VERSION 3.2)
project(gurobitest)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp)
add_executable(gurobitest ${SOURCE_FILES})
if (GUROBI_INCLUDE_DIR)
# in cache already
set(GUROBI_FOUND TRUE)
set(GUROBI_INCLUDE_DIRS "${GUROBI_INCLUDE_DIR}" )
set(GUROBI_LIBRARIES "${GUROBI_LIBRARY};${GUROBI_CXX_LIBRARY}" )
else (GUROBI_INCLUDE_DIR)
find_path(GUROBI_INCLUDE_DIR
NAMES gurobi_c++.h
PATHS "/Library/gurobi604/mac64/include"
"$ENV{GUROBI_HOME}/include"
"C:\libs\gurobi604\include"
#CMAKE_ROOT_PATH "/Library/gurobi604/mac64"
)
find_library( GUROBI_LIBRARY
NAMES gurobi
gurobi45
gurobi46
gurobi50
gurobi51
gurobi52
gurobi55
gurobi56
gurobi60
libgurobi_c++.a
libgurobi60.so
PATHS "$ENV{GUROBI_HOME}/lib"
"/Library/gurobi604/mac64/lib"
"/Library/gurobi604/mac64/lib"
"C:\libs\gurobi604\lib"
)
find_library( GUROBI_CXX_LIBRARY
NAMES gurobi_c++
libgurobi60.so
libgurobi_c++.a
PATHS "$ENV{GUROBI_HOME}/lib"
"/Library/gurobi604/mac64/lib"
"C:\libs\gurobi604\lib"
)
set(GUROBI_INCLUDE_DIRS "${GUROBI_INCLUDE_DIR}" )
set(GUROBI_LIBRARIES "${GUROBI_LIBRARY};${GUROBI_CXX_LIBRARY}" )
endif(GUROBI_INCLUDE_DIR)
include_directories(${GUROBI_INCLUDE_DIR})
target_link_libraries(gurobitest ${GUROBI_CXX_LIBRARY})
target_link_libraries(gurobitest ${GUROBI_LIBRARY})
但是,我编译的时候总是遇到问题。然后出现如下错误信息:
Linking CXX executable gurobitest
Undefined symbols for architecture x86_64:
似乎所有 grub 命令都不为人所知。 如果这很重要,我会使用 mac。有什么有用的提示吗?
我的一个朋友找到了答案。最后一部分不完全正确:
include_directories( ${GUROBI_INCLUDE_DIRS} )
target_link_libraries( gurobitest ${GUROBI_LIBRARIES} )
set (CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -stdlib=libstdc++")
set (CMAKE_SHARED_LINKER_FLAGS "-lgurobi_c++ -lgurobi60, --as-needed")
显然标志设置不正确。