当前位置: 首页 > article >正文

c++ 调用 gurobi 库,cmake,mac

gurobi 一般使用 python 调用,官方的培训会议及资料大部分也都基于 python。

由于最近上手了 c++,因此想试试 c++ 怎么调用 gurobi。但我发现,c++ 调用第三方库比 python 或 java 要复杂不少。python 中直接 import 第三方库,java 加载第三方库的 jar 之后也能直接使用。但是对于 c++ 调用第三方库,要有以下几个步骤:

  • 告诉 c++ 第三方库与头文件的地址
  • 必须让 c++ 去链接第三方库(link library)

python 或 java 只需第一步或者更简单,而 c++ 多了第二步。对于 c++,编译和链接过程分为两个独立阶段:编译(compilation)和链接(linking),调用第三方库时,仅仅通过 #include 包含头文件是不够的,必须在链接阶段提供库文件(.a、.dylib 等),以便将代码与库的实现连接起来。

  • 头文件(.h):
    • 仅包含声明(接口),如函数原型、类定义。
    • 示例:gurobi_c++.h 定义了 GRBEnv 类的构造函数,但不实现。
  • 库文件(.a、.dylib 等):
    • 包含实现(二进制代码)。
    • 示例:libgurobi_c++.a 包含 GRBEnv 的具体逻辑。

#include 只告诉编译器“这些函数存在”,但链接器根据库文件需要知道“这些函数在哪里”。

Mac 上用 c++ 还有更麻烦些,不能用 VS studio,只能用 CMake 了。但是 CMake 在 mac 上很多时候不能通过 findpackage 找到库的地址,只能指定添加库的地址。

下面是我在一个子文件夹的 cmakelist.txt 文件里的内容。

  • 记得要在主文件夹下的 cmakelist.txt 中通过 addsubdirectory() 将当前子文件夹添加到主文件夹里
set(RUN_NAME LP) # 设置运行程序的名字

# 创建可执行程序,需要运行的 cpp 文件放在这里
add_executable(${RUN_NAME}
        #        gurobi_test.cpp
        gurobi_examples/mip1_c++.cpp
)

# 设置 Gurobi 路径(根据你的安装调整)
set(GUROBI_HOME "/Library/gurobi1201/macos_universal2") # gurobi 的安装地址
set(GUROBI_INCLUDE_DIR "${GUROBI_HOME}/include") # 头文件路径
set(GUROBI_LIB_DIR "${GUROBI_HOME}/lib") # 库文件路径

# 将路径添加到搜索地址
include_directories(${GUROBI_LIB_DIR})
include_directories(${GUROBI_INCLUDE_DIR})

# 链接 Gurobi 库,这个静态库与动态库都需要
target_link_libraries(${RUN_NAME}
        "${GUROBI_LIB_DIR}/libgurobi_c++.a" # .a 是静态库
        "${GUROBI_LIB_DIR}/libgurobi120.dylib" # .dylib 是动态库
)

一个 gurobi 的 cpp 例子:

#include <iostream>
#include "gurobi_c++.h"

int main() {
    try {
        // 创建 Gurobi 环境
        GRBEnv env = GRBEnv();
        env.set(GRB_IntParam_OutputFlag, 1); // 启用输出

        // 创建模型
        GRBModel model = GRBModel(env);
        model.set(GRB_StringAttr_ModelName, "Production_Optimization");

        // 添加决策变量
        GRBVar xA = model.addVar(0.0, GRB_INFINITY, 0.0, GRB_CONTINUOUS, "x_A"); // 产品 A
        GRBVar xB = model.addVar(0.0, GRB_INFINITY, 0.0, GRB_CONTINUOUS, "x_B"); // 产品 B

        // 设置目标函数:maximize 30x_A + 40x_B
        GRBLinExpr objective = 30.0 * xA + 40.0 * xB;
        model.setObjective(objective, GRB_MAXIMIZE);

        // 添加约束
        // 约束 1: x_A + 2x_B <= 100
        GRBLinExpr constr1 = xA + 2.0 * xB;
        model.addConstr(constr1 <= 100, "Resource1");

        // 约束 2: 3x_A + x_B <= 150
        GRBLinExpr constr2 = 3.0 * xA + xB;
        model.addConstr(constr2 <= 150, "Resource2");

        // 优化模型
        model.optimize();

        // 检查优化状态
        int status = model.get(GRB_IntAttr_Status);
        if (status == GRB_OPTIMAL) {
            std::cout << "Optimal solution found:\n";
            std::cout << "x_A = " << xA.get(GRB_DoubleAttr_X) << "\n";
            std::cout << "x_B = " << xB.get(GRB_DoubleAttr_X) << "\n";
            std::cout << "Objective value = " << model.get(GRB_DoubleAttr_ObjVal) << "\n";
        } else {
            std::cout << "No optimal solution found. Status = " << status << "\n";
        }
    } catch (GRBException e) {
        std::cout << "Gurobi error code = " << e.getErrorCode() << "\n";
        std::cout << e.getMessage() << "\n";
    } catch (...) {
        std::cout << "Unknown error during optimization\n";
    }

    return 0;
}
}

运行结果:

Optimal objective  2.400000000e+03
Optimal solution found:
x_A = 40
x_B = 30
Objective value = 2400

http://www.kler.cn/a/575884.html

相关文章:

  • 计算机毕业设计SpringBoot+Vue.js网络海鲜市场系统(源码+文档+PPT+讲解)
  • 动态规划背包刷题
  • 城市智慧路灯的 (运营 管理 运维)实现方案和技术架构
  • C++ primier plus 函数探幽第二部分
  • SyntaxError: Invalid regular expression flag “x“
  • 豆包大模型 MarsCode AI 刷题专栏 001
  • ZT41 【模板】单源最短路Ⅰ ‖ 无权图
  • C++—string类的模拟实现
  • 【ThreeJS Basics 09】Debug
  • PyTorch全精度训练和混合精度训练简单对比:全精度训练一定比混合精度训练更准确吗?
  • STM32之软件SPI
  • uv:高性能 Python 包和项目管理工具使用教程
  • 【MATLAB源码-第271期】基于matlab的雷达发射回波模拟,包括匹配滤波,加窗旁瓣控制,以及MTD处理。
  • 如何实现区域灰质体积、皮层厚度、低频振幅等影像学特征的病例-对照分析差异分析
  • 基于JavaScript的PDF翻译、PDF文档解析系统开发实践,二次开发可商业化,目前包含PDF加载、放大、缩小、翻译、旋转、创建等功能
  • Java 中操作 R:深度整合与高效应用
  • 【认知管理1:从疾病中获得启发 关键字摘取】
  • git-filter-repo 清除大文件教程
  • 【Proteus仿真】【51单片机】智能家居检测与控制系统
  • mfc140u.dll是什么?当程序遭遇mfc140u.dll问题:快速恢复正常的秘诀