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.pswp.cn/pingmian/71967.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/71967.shtml
英文地址,請注明出處:http://en.pswp.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 ? …