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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/984717.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL性能调优实战手册:从慢查询到执行计划全解析

一、调优流程四步走 &#x1f680; 当我们遇到数据库调优问题的时候&#xff0c;该如何思考呢? 这里把思考的流程整理成下面这张图。 整个流程划分成了观察&#xff08;Show status&#xff09;和 行动(Action&#xff09;两个部分。字母S的部分代表观察&#xff08;会使用相…

算法007——三数之和

力扣——三数之和&#xff08;点击跳转&#xff09; 做这道三数之和的题之前一定要先看我的上一篇笔记——两数之和&#xff08;点击跳转&#xff09;&#xff0c;只有把这个弄清楚这个 三数之和 才能明白 因为要去重&#xff0c;我们可以先将数组排序 我们先固定一个数&…

智慧城市智慧社区项目建设方案

一、项目背景 在全球化进程加速的今天&#xff0c;城市化问题日益凸显&#xff0c;传统的城市管理模式已难以满足现代社会对高效、智能化管理的需求。智慧城市和智慧社区的概念应运而生&#xff0c;其核心目标是通过信息技术手段&#xff0c;提升城市资源的利用效率&#xff0…

文件上传漏洞(upload靶场)

目录 Pass-01&#xff1a;前端绕过 方法一&#xff1a;浏览器禁用js 方法二:直接修改或删除js脚本 方法三&#xff1a;修改后缀绕过 Pass-02:服务器检测 Pess-03:黑名单绕过 Pass-04:.htaccess文件 Pass-05:windows特性和user.ini 方法一&#xff1a;php.自动解析为ph…

C++学习之QT综合项目二经典翻金币小游戏及打包

1.项目简介及创建 #include "chooselevelscene.h" #include <QMenuBar> #include <QMenu> #include <QPainter> #include "mypushbutton.h" #include <QTimer> #include <QDebug> #include <QLabel> #include…

前端项目中export和import的作用

之前写过代码&#xff0c;但是那个时候是使用jspdivcss写页面&#xff0c;jquery负责页面数据展示和数据请求。近期在学习前端&#xff0c;发现有export和import&#xff0c;想起了之前没用过&#xff0c;就研究搜索了一下&#xff0c;发现这个是在 ES6中添加的&#xff0c;难怪…

JVM 类加载原理之双亲委派机制(JDK8版本)

对 Java 程序的运行过程而言&#xff0c;类的加载依赖类加载器完成&#xff0c;而在 Java 默认的类加载器又分为启动类加载器、扩展类加载器和应用程序类加载器三种&#xff0c;但是一个类通常仅仅需要被加载一次即可&#xff0c;双亲委派机制即规定各个类该被何种类加载器加载…

【每日学点HarmonyOS Next知识】对话框去掉圆角、数组拼接、自定义对话框依附某个控件、平移动画、页面栈管理

1、 HarmonyOS CustomDialog怎么去掉左右和底部的透明以及圆角&#xff1f; CustomDialog怎么去掉左右和底部的透明以及圆角 设置customStyle为true即可开启使用自定义样式。设置borderRadius为0去掉圆角属性。 属性用法参考文档&#xff1a;https://developer.huawei.com/c…

坐落于杭州的电商代运营公司品融电商

坐落于杭州的电商代运营公司品融电商 在中国电商行业蓬勃发展的浪潮中&#xff0c;品融电商&#xff08;PINKROON&#xff09;作为一家扎根杭州的新锐品牌管理公司&#xff0c;凭借其独特的全域增长方法论和实战经验&#xff0c;迅速崛起为行业标杆。自2020年成立以来&#x…

【python爬虫】酷狗音乐爬取练习

注意&#xff1a;本次爬取的音乐仅有1分钟试听&#xff0c;仅作学习爬虫的原理&#xff0c;完整音乐需要自行下载客户端。 一、 初步分析 登陆酷狗音乐后随机选取一首歌&#xff0c;在请求里发现一段mp3文件&#xff0c;复制网址&#xff0c;确实是我们需要的url。 复制音频的…

Vue3 路由的历史记录 如何不允许浏览器前进后退 在函数中使用路由切换组件 路由的重定向

路由的历史记录模式 第一种push push会保留所有的切换记录&#xff0c;通过操作浏览器的前进后退&#xff0c;可以返回刚才浏览的页面 第二章replace replace不会保留路由的切换记录&#xff0c;不支持浏览器的前进后退 在函数中使用路由切换组件 页面挂载3秒后&#x…

【CSS3】金丹篇

目录 标准流概念元素类型及排列规则块级元素行内元素行内块元素 标准流的特点打破标准流 浮动基本使用清除浮动额外标签法单伪元素法双伪元素法&#xff08;推荐&#xff09;overflow 法 Flex 布局Flex 组成主轴对齐方式侧轴对齐方式修改主轴方向弹性盒子伸缩比弹性盒子换行行对…

解锁DeepSpeek-R1大模型微调:从训练到部署,打造定制化AI会话系统

目录 1. 前言 2.大模型微调概念简述 2.1. 按学习范式分类 2.2. 按参数更新范围分类 2.3. 大模型微调框架简介 3. DeepSpeek R1大模型微调实战 3.1.LLaMA-Factory基础环境安装 3.1大模型下载 3.2. 大模型训练 3.3. 大模型部署 3.4. 微调大模型融合基于SpirngBootVue2…

深入理解string:从模拟实现看本质

文章目录 摘要&#xff1a;一、引言二、string的模拟实现2.1 string类的定义 三、深拷贝和深赋值3.1 深浅拷贝构造函数3.2 深赋值运算符 四、总结五、附录5.1 完整代码6.2 测试用例 六、致谢 摘要&#xff1a; 本文将通过模拟实现一个简单的 String 类&#xff0c;深入探讨字符…

Unity组件TrailRenderer屏幕滑动拖尾

Unity组件TrailRenderer屏幕滑动拖尾 介绍制作总结 介绍 今天要做一个拖动效果&#xff0c;正好用到了TrailRenderer这个组件&#xff0c;正好分享一下 效果参考如下&#xff1a; 制作 1.创建空物体TrailObject添加组件TrailRenderer 下面的材质可以根据自己想要制作的效果去…

laravel中 添加公共/通用 方法/函数

一&#xff0c;现在app 下面创建Common目录&#xff0c;然后在创建Common.php 文件 二&#xff0c;修改composer.json文件 添加这个到autoload 中 "files": ["app/Common/Common.php"]"autoload": {"psr-4": {"App\\": &quo…

C#程序加密与解密Demo程序示例

目录 一、加密程序功能介绍 1、加密用途 2、功能 3、程序说明 4、加密过程 5、授权的注册文件保存方式 二、加密程序使用步骤 1、步骤一 ​编辑2、步骤二 3、步骤三 4、步骤四 三、核心代码说明 1、获取电脑CPU 信息 2、获取硬盘卷标号 3、机器码生成 3、 生成…

批量将 Excel 转换 PDF/Word/CSV以及图片等其它格式

Excel 格式转换是我们工作过程当中非常常见的一个需求&#xff0c;我们通常需要将 Excel 转换为其他各种各样的格式。比如将 Excel 转换为 PDF、比如说将 Excel 转换为 Word、再比如说将 Excel文档转换为图片等等。 这些操作对我们来讲都不难&#xff0c;因为我们通过 Office 都…

【报错】微信小程序预览报错”60001“

1.问题描述 我在微信开发者工具写小程序时&#xff0c;使用http://localhost:8080是可以请求成功的&#xff0c;数据全都可以无报错&#xff0c;但是点击【预览】&#xff0c;用手机扫描二维码浏览时&#xff0c;发现前端图片无返回且报错60001&#xff08;打开开发者模式查看日…

概念|RabbitMQ 消息生命周期 待消费的消息和待应答的消息有什么区别

目录 消息生命周期 一、消息创建与发布阶段 二、消息路由与存储阶段 三、消息存活与过期阶段 四、消息投递与消费阶段 五、消息生命周期终止 关键配置建议 待消费的消息和待应答的消息 一、待消费的消息&#xff08;Unconsumed Messages&#xff09; 二、待应答的消息…