網站首頁 編程語言 正文
文章目錄
- 1.求解器的選擇
- 2.求解器的收斂
- 2.1 相同時間下求解結果
- 2.2 不同時間段求解結果
- 2.3 目標函數變化曲線
- 3.結論
1.求解器的選擇
OR-Tools提供了用于求解 線性規劃和 混合整數規劃問題的 MPSolver 接口容器,易于調用各種不同求解器。gurobi 當然無論在各個問題上性能都要優勝許多,考慮到畢竟是商用求解器,這里主要枚舉開源免費的求解器。
問題類型 | 求解器 |
---|---|
純整數規劃(IP) | CP-SAT |
線性規劃(LP) | Glop |
混合整數規劃(MIP) | SCIP, CP-SAT |
由于MIP問題是最為麻煩難解的,建模時候盡量考慮建成LP或IP,求解速度會快很多。尤其google ortools 整合了SAT/CP solver,CP_SAT 對于一部分MIP問題也可以求解,部分問題效果比SCIP好很多。
2.求解器的收斂
做一個簡單的數值實驗對比不同求解器的求解速度。構建一個小規模整數規劃問題,算例都一樣,模型也一樣,唯一的區別即求解器不同,這里測試GUROBI,CP_SAT,SCIP三個比較常用的求解器。
ortools調用solver.
solver = pywraplp.Solver.CreateSolver('SCIP') # GUROBI SCIP CP_SAT
2.1 相同時間下求解結果
先用gurobi求解算例,14s后得到最優解,設定求解時間為14s,再依次求解CP_SAT,SCIP,結果如下表所示。
求解器 | 求解時間(s) | 是否最優解 | obj |
---|---|---|---|
gurobi | 14 | 是 | 9190.0 |
CP_SAT | 14 | 是 | 9190.0 |
SCIP | 14 | 否 | 9305.49 |
(CP_SAT 在規定時間內同樣求得最優解,但如果不加限制求解依然不會停止,這里可能是求解器數值問題)
2.2 不同時間段求解結果
我們設定不同的停止時間,觀察求解器的求解情況,可以看到gurobi無論是在初始解以及最后的收斂上都要技高一籌,其實在第7s時就已經找到了最優解,但程序最終停止時間是14s,剩余的這段時間大概就是驗優的過程。我設置的算例為IP,CP_SAT表現略遜gurobi但也不錯,但SCIP在短時間內陷入了局部最優,跳出局部最優需要更多的時間,顯然這就是不同求解器內部性能的一個差異了。
limit Time(s) | gurobi | CP_SAT | SCIP |
---|---|---|---|
1 | 9215.0 | 9241.0 | 9305.49 |
2 | 9215.0 | 9215.5 | 9305.49 |
3 | 9215.0 | 9215.0 | 9305.49 |
5 | 9209.5 | 9211.5 | 9305.49 |
7 | 9190.0 | 9199.5 | 9305.49 |
10 | opt | 9196.0 | 9305.49 |
12 | opt | 9205.5 | 9305.49 |
14 | opt | 9190.0 | 9305.49 |
2.3 目標函數變化曲線
上面用一個小規模算例簡單比較了一下三個求解器的求解性能,為了更好的看到求解器gap變化情況,這里將算例規模適當擴大(算例太大了過于費時),給予不同的停止時間,繪制目標函數隨時間變化曲線。結果很顯著,對于整數規劃問題CP_SAT效果明顯優于SCIP。
求解器內部搜索、剪枝算法有差異,尤其到接近最優解時,容易圍繞最優解震蕩,耗費大量的時間,在調用時需要注意,最好限制GAP或時間。這里參考知乎回答:
3.結論
- gurobi的收斂性能很好,但商業求解器價格昂貴,在一些小規模case上尤其IP使用google的CP_SAT是個不錯的替代選項;
- 在使用時有必要限定求解時間和gap,尤其在不要求最優解的情況下;
原文鏈接:https://blog.csdn.net/DCXY71/article/details/124228024
相關推薦
- 2022-06-01 Kubernetes(K8S)入門基礎內容介紹_云和虛擬化
- 2023-04-08 C/C++如何實現兩矩陣相乘之模擬法_C 語言
- 2022-03-30 Android?Room數據庫加密詳解_Android
- 2022-06-08 golang操作rocketmq的示例代碼_Golang
- 2022-08-13 Spring中@Bean注解的作用以及如何使用
- 2022-04-28 C/C++的關鍵字之static你了解嗎_C 語言
- 2022-10-14 Redisson之分布式鎖解決商品秒殺簡單示例
- 2022-10-15 C語言詳細分析不同類型數據在內存中的存儲_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支