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.cppgurobi_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"); // 产品 AGRBVar xB = model.addVar(0.0, GRB_INFINITY, 0.0, GRB_CONTINUOUS, "x_B"); // 产品 B// 设置目标函数:maximize 30x_A + 40x_BGRBLinExpr objective = 30.0 * xA + 40.0 * xB;model.setObjective(objective, GRB_MAXIMIZE);// 添加约束// 约束 1: x_A + 2x_B <= 100GRBLinExpr constr1 = xA + 2.0 * xB;model.addConstr(constr1 <= 100, "Resource1");// 约束 2: 3x_A + x_B <= 150GRBLinExpr 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.mzph.cn/pingmian/71967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基于Django的医用耗材网上申领系统【附源码、文档说明】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

Python中很常用的100个函数整理

Python 内置函数提供了强大的工具&#xff0c;涵盖数据处理、数学运算、迭代控制、类型转换等。本文总结了 100 个常用内置函数&#xff0c;并配备示例代码&#xff0c;提高编程效率。 1. abs() 取绝对值 print(abs(-10)) # 10 2. all() 判断所有元素是否为真 print(all([…

Python毕业设计选题:基于django+vue的疫情数据可视化分析系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 员工管理 疫情信息管理 检测预约管理 检测结果…

C#程序结构及基本组成说明

C# 程序的结构主要由以下几个部分组成,以下是对其结构的详细说明和示例: 1. 基本组成部分 命名空间 (Namespace) 用于组织代码,避免命名冲突。通过 using 引入其他命名空间。 using System; // 引入 System 命名空间类 (Class) C# 是面向对象的语言,所有代码必须定义在类或…

Python 编程题 第八节:字符串变形、压缩字符串、三个数的最大乘积、判定字符是否唯一、IP地址转换

字符串变形 swapcase()方法将字符串大小写转换&#xff1b;split()方法将字符串以括号内的符号分隔并以列表形式返回 sinput() ls.split(" ") ll[::-1] s"" for i in l:ai.swapcase()sas" " print(s[0:len(s)-1]) 压缩字符串 很巧妙的方法 …

大语言模型学习--向量数据库基础知识

1.向量 向量是多维数据空间中的一个坐标点。 向量类型 图像向量 文本向量 语音向量 Embedding 非结构化数据转换为向量过程 通过深度学习训练&#xff0c;将真实世界离散数据&#xff0c;投影到高维数据空间上&#xff0c;通过数据在空间中间的距离体现真实世界的相似度 V…

项目工坊 | Python驱动淘宝信息爬虫

目录 前言 1 完整代码 2 代码解读 2.1 导入模块 2.2 定义 TaoBao 类 2.3 search_infor_price_from_web 方法 2.3.1 获取下载路径 2.3.2 设置浏览器选项 2.3.3 反爬虫处理 2.3.4 启动浏览器 2.3.5 修改浏览器属性 2.3.6 设置下载行为 2.3.7 打开淘宝登录页面 2.3.…

蓝桥杯题型

蓝桥杯 蓝桥杯题型分类语法基础艺术与篮球&#xff08;日期问题&#xff09;时间显示&#xff08;时间问题&#xff09;跑步计划&#xff08;日期问题&#xff09;偶串(字符&#xff09;最长子序列&#xff08;字符&#xff09;字母数&#xff08;进制转换&#xff09;6个0&…

【C语言】文件操作篇

目录 文件的基本概念文本文件和二进制文件的差异 文件指针FILE 结构体文件指针的初始化和赋值 文件打开与关闭常见操作文件的打开文件的关闭 常见问题打开文件时的路径问题打开文件失败的常见原因fclose 函数的重要性 文件读写操作常见操作字符读写字符串读写格式化读写二进制读…

【leetcode hot 100 21】合并两个有序链表

解法一&#xff1a;新建一个链表存放有序的合并链表。当list1和list2至少有一个非空时&#xff0c;返回非空的&#xff1b;否则找出两个链表的最小值作为新链表的头&#xff0c;然后依次比较两链表&#xff0c;每次都先插入小的值。 /*** Definition for singly-linked list.*…

Ubuntu 24.04.2 安装 PostgreSQL 16 、PostGIS 3

安装 PostgreSQL 16 apt install postgresql-16passwd postgres&#xff0c;修改 postgres 用户密码su postgrespsql -U postgres, 以 postgres 的身份登录数据库alter user postgres with password abc123;\q 退出/etc/postgresql/16/main/postgresql.conf 可修改 #listen_ad…

Spring Boot框架总结(超级详细)

前言 本篇文章包含Springboot配置文件解释、热部署、自动装配原理源码级剖析、内嵌tomcat源码级剖析、缓存深入、多环境部署等等&#xff0c;如果能耐心看完&#xff0c;想必会有不少收获。 一、Spring Boot基础应用 Spring Boot特征 概念&#xff1a; 约定优于配置&#…

postgresql14编译安装脚本

#!/bin/bash####################################readme################################### #先上传postgresql源码包&#xff0c;再配置yum源&#xff0c;然后执行脚本 #备份官方yum源配置文件&#xff1a; #cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS…

AI开发利器:miniforge3无感平替Anaconda3

相信有和我遭遇一样的同学吧&#xff0c;之前装了anaconda用的挺好的&#xff08;可以参考AI开发利器&#xff1a;Anaconda&#xff09;&#xff0c;但是考虑到有可能收到软件侵权的律师函的风险&#xff0c;还是果断找个替代品把anaconda卸载掉。miniforge就是在这样的背景下发…

Reactor中的Flux和Mono的区别

Reactor中的Flux和Mono的区别 在Reactor框架中&#xff0c;Flux 和 Mono 是两个核心的类型&#xff0c;分别用于处理不同的数据流场景。理解它们之间的区别是掌握响应式编程的关键。 1. 基本概念 Flux: 表示一个异步、非阻塞的流&#xff0c;能够发布零个或多个元素。它适用于…

AI-NAS:当存储遇上智能,开启数据管理新纪元

在数据爆炸的时代&#xff0c;NAS&#xff08;网络附加存储&#xff09;已成为个人和企业存储海量数据的利器。然而&#xff0c;面对日益庞大的数据量&#xff0c;传统的NAS系统在文件管理和搜索效率上逐渐力不从心。AI-NAS应运而生&#xff0c;它将NAS与人工智能&#xff08;A…

用 Vue 3.5 TypeScript 做了一个日期选择器(改进版)

上一篇 已经实现了一个日期选择器&#xff0c;只不过是模态窗的形式&#xff0c;这个版本改为文本框弹出&#xff0c;点击空白处可关闭日历 代码也增加了不少 <template><div><!-- 添加文本框 --><div class"date-picker-input-wrapper">&l…

【09】单片机编程核心技巧:变量赋值,从定义到存储的底层逻辑

【09】单片机编程核心技巧&#xff1a;变量赋值&#xff0c;从定义到存储的底层逻辑 &#x1f31f; 核心概念 单片机变量的定义与赋值是程序设计的基础&#xff0c;其本质是通过 RAM&#xff08;随机存储器&#xff09; 和 ROM&#xff08;只读存储器&#xff09; 的协作实现…

【爬虫】开篇词

一、网络爬虫概述 二、网络爬虫的应用场景 三、爬虫的痛点 四、需要掌握哪些技术&#xff1f; 在这个信息爆炸的时代&#xff0c;如何高效地获取和处理海量数据成为一项核心技能。无论是数据分析、商业情报、学术研究&#xff0c;还是人工智能训练&#xff0c;网络爬虫&…

文字转语音chat-tts-ui

去年已经使用过chattts了&#xff0c;但是昨晚想用的时候却记怎么打开了&#xff0c;找了一下以前的笔记 MacOS 下源码部署chat-tts-ui 配置好 python3.9-3.11 环境,安装git &#xff0c;执行命令 brew install libsndfile git python3.10 继续执行 brew install ffmpeg ​ …