1. 程式人生 > >SCIP | 數學規劃求解器SCIP超詳細的使用教程

SCIP | 數學規劃求解器SCIP超詳細的使用教程

前言

小夥伴們大家好呀!繼上次lp_solve規劃求解器的推文出來以後,大家都期待著更多求解器的具體介紹和用法。小編哪敢偷懶,這不,趕在考試周之際,又在忙裡偷閒中給大家送上一篇SCIP規劃求解的推文教程。快一起來看看吧。

Part1 慣例科普篇

What is SCIP?

官方的介紹:

SCIP is currently one of the fastest non-commercial solvers for mixed integer programming (MIP) and mixed integer nonlinear programming (MINLP).

It is also a framework for constraint integer programming and branch-cut-and-price. It allows for total control of the solution process and the access of detailed information down to the guts of the solver.

SCIP is a framework for Constraint Integer Programming oriented towards the needs of mathematical programming experts who want to have total control of the solution process and access detailed information down to the guts of the solver. SCIP can also be used as a pure MIP and MINLP solver or as a framework for branch-cut-and-price.

SCIP is implemented as C callable library and provides C++ wrapper classes for user plugins. It can also be used as a standalone program to solve mixed integer programs given in various formats such as MPS, LP, flatzinc, CNF, OPB, WBO, PIP, etc. Furthermore, SCIP can directly read ZIMPL models.
有關SCIP概述及其演算法的實現原理方法更多詳情,可以點選下面連結下載相關文件:

SCIP的更詳細描述:

有關凸與非凸MILPS的全域性優化的非線性求解特徵:

SCIP Optimization

SuiteSCIP優化套件是用於生成和求解混合整數非線性規劃模型混合整數線性規劃模型整數約束規劃模型的工具集。 它由以下部分組成:

  • SCIP mixed integer (linear and nonlinear) programming solver and constraint programming framework
  • SoPlex linear programming solver
  • ZIMPL mathematical programming language
  • UG parallel framework for mixed integer (linear and nonlinear) programs
  • GCG generic branch-cut-and-price solver

使用者可以使用建模語言ZIMPL輕鬆生成線性,混合整數和混合整數二次約束的規劃模型。 得到的模型可以直接載入到SCIP中並求解。 在解決方案過程中,SCIP可以使用SoPlex作為底層LP求解器。

上面五個元件都可以獲得它們的原始碼,並且都是免費的。因此它們是用於學術研究和混合整數程式設計的理想工具。

可以點選下面連結下載SCIP Optimization Suite:
https://scip.zib.de/index.php#download

目前最新版本是SCIP version 6.0.0。

支援以下平臺:

  • Linux
  • Mac
  • Windows
  • SunOS
  • Android

SCIP的特點

對於SCIP,它主要有以下幾個優點:

  • very fast standalone solver for linear programming (LP), mixed integer programming (MIP), and mixed integer nonlinear programming (MINLP)
  • framework for branching, cutting plane separation, propagation, pricing, and Benders' decomposition,
  • large C-API, C++ wrapper classes for user plugins
  • interfaces to other applications and programming languages (contained in source code packages or available from http://github.com/SCIP-interfaces):

Python
Java
AMPL
GAMS
MATLAB

  • open LP solver support:

CPLEX
Gurobi
XPress
Mosek
SoPlex
QSopt
CLP.

  • highly flexible through many possible user plugins

Part2 基礎入門篇

SCIP-下載和安裝前面介紹了這麼多,終於要動手擼一擼程式碼了。想必各位小夥伴也迫不及待了吧。不過這裡再強調兩句,SCIP和SCIP Optimization Suite的區別就是前者是一個工具,後者是一個工具集。後者包含了前者之外,還包含了其他的求解器。

下載:
前面已經給出了下載地址,大家根據自己的平臺下載相應的檔案即可。小編系統平臺是Windows 10 64bit的。所以就下載了:

安裝的話,照舊一路向西。需要注意的是,這裡把這些勾選以下,免得後續出現麻煩:

關於SCIP的說明文件,訪問(https://scip.zib.de/定位到右上角Documentation,版本選6.0即可。

0) 好了現在興高采烈開啟命令列,輸入SCIP:

納尼?劇本好像不是這麼寫的啊。

是什麼問題呢?(敲黑板),剛剛即使勾選了把SCIP Optimization Suite新增到系統路徑裡面,可能對某些情況並不會成功(可能是被防毒軟體攔截了)。所以咱們還是要手動新增一下。

如下圖:右鍵此電腦-屬性。然後按下圖操作:

找到我們SCIPOptSuite 6.0.0的安裝路徑,把它複製下來:

然後新增到PATH變數裡面:

然後再回到命令列。(注意要重啟一下命令列)輸入SCIP:

大功告成。

SCIP-簡單上手那麼,怎麼用SCIP求解一個規劃問題呢?例如下面一個簡單的例子:
Max z = x1 + 2 x2 + 3 x3 + x4
Subject To
- x1 + x2 + x3 + 10 x4 <= 20
x1 - 3 x2 + x3 <= 30
x2 - 3.5 x4 = 0
0 <= x1 <= 40
2 <= x4 <= 3

SCIP支援以下格式的檔案:

部分格式檔案說明可以點選下面的連結(個別需要科學上網):

在這裡我們選擇CPLEX lp files格式的檔案作為演示。將上述模型改寫為CPLEX lp files格式便可以用SCIP讀取並且求解。例如我們在D:\scip目錄下建立一個simple.lp檔案,輸入以下程式碼:
Maximize
obj: x1 + 2 x2 + 3 x3 + x4
Subject To
c1: - x1 + x2 + x3 + 10 x4 <= 20
c2: x1 - 3 x2 + x3 <= 30
c3: x2 - 3.5 x4 = 0
Bounds
0 <= x1 <= 40
2 <= x4 <= 3
General
x4
End

儲存。

在我們的命令列模式下,進入到D:\scip這個目錄。

然後輸入以下命令:
1) 首先進入scip:> scip

2) 然後讀取我們的模型檔案:> read simple.lp

3) 求解我們的問題:> optimize

4) 輸出一大堆資訊以後,問題已經求解完畢。我們把solution顯示出來:> display solution

OK,至此,問題已經求解完畢。

有關SCIP的更多使用,使用help命令可以檢視詳細說明:

關於CPLEX lp files,可以訪問下面連結檢視詳細說明: (http://lpsolve.sourceforge.net/5.5/CPLEX-format.htm

Part3 實戰篇

python下使用SCIP

平臺還是Windows10 64位。
先用pip把SCIP的包給裝上:
pip install pyscipopt

然後記得把環境變數給配置好了。(不知道的同學會去看【SCIP-下載和安裝】PATH路徑的配置)。
1、進入Python,匯入相應的模組:
>> from pyscipopt import Model

2、建立一個例項模型.
>> model = Model("Example") # model name is optional

3、通過模型求解相關問題,舉一個栗子, e.g.:
>> x = model.addVar("x")
>> y = model.addVar("y", vtype="INTEGER")
>> model.setObjective(x + y)
>> model.addCons(2x - yy >= 0)
>> model.optimize()

更多詳細說明可以檢視這個:
https://github.com/SCIP-Interfaces/PySCIPOpt

Java下使用SCIP

java下使用SCIP比較麻煩的是,需要自己編譯後才能呼叫。這裡簡要說明一下編譯過程(不想了解的可以跳到第4)步,編譯好的檔案小編會分享給大家的。):
環境:Windows 10 64位、jdk 64位
注意路徑都不要有中文!!!注意路徑都不要有中文!!!

1) 小編在這裡使用的是Cmake+VS2017編譯(所以在此之前確保你安裝了Cmake和相關的C編譯器)。首先到
https://github.com/SCIP-Interfaces/JSCIPOpt
下載整個專案下來,解壓到某個資料夾,在命令列下進入該資料夾:

2) 進來以後,建立一個build目錄,以用來生成相關檔案,然後進入build目錄

進來以後,輸入cmake .. -G "Visual Studio 15 2017 Win64" 進行相關配置。注意你的編譯器,我這裡用的是vs2017所以是"Visual Studio 15 2017 Win64",其他編譯器設定成相應的名字,比如vs2015就是"Visual Studio 14 2015 Win64"等等。
3) 最後,輸入cmake --build . --config "Release" 進行編譯。

4) 在build\Release目錄下得到我們的成品然後把jscip.dll檔案拷貝到C:\Windows\System32,後續程式設計過程需要用到這個dll,以便編譯器找到它。:

至此,編譯已經完成。

如何在專案裡呼叫SCIP的介面呢?小編還是先新建一個工程testscip為大家講解:

1) 新建好一個java工程以後,右鍵專案,選擇Properties,和上次一樣,把我們編譯出來的scip.jar給匯入到工程裡面:

2) 然後就可以開始寫程式碼了,下面提供了一個example:

 11package testscip;
22import jscip.*;
33
44
55public class testscipMain {
66
77 public static void main(String[] args) {
88 // TODO Auto-generated method stub
99 Scip scip = new Scip();
1010 System.loadLibrary("jscip");
1111
1212 // set up data structures of SCIP
1313 scip.create("LinearExample");
1414
1515 // create variables (also adds variables to SCIP)
1616 Variable x = scip.createVar("x"2.03.01.0, SCIP_Vartype.SCIP_VARTYPE_CONTINUOUS);
1717 Variable y = scip.createVar("y"0.0, scip.infinity(), -3.0, SCIP_Vartype.SCIP_VARTYPE_INTEGER);
1818
1919 // create a linear constraint
2020 Variable[] vars = {x, y};
2121 double[] vals = {1.02.0};
2222 Constraint lincons = scip.createConsLinear("lincons", vars, vals, -scip.infinity(), 10.0);
2323
2424 // add constraint to SCIP
2525 scip.addCons(lincons);
2626
2727 // release constraint (if not needed anymore)
2828 scip.releaseCons(lincons);
2929
3030 // set parameters
3131 scip.setRealParam("limits/time"100.0);
3232 scip.setRealParam("limits/memory"10000.0);
3333 scip.setLongintParam("limits/totalnodes"1000);
3434
3535 

相關推薦

數學規劃求解lp_solve詳細教程

前言 最近小編學了運籌學中的單純形法。於是,很快便按奈不住跳動的心。這不得不讓我拿起紙和筆思考著,一個至關重要的問題:如何用單純形法裝一個完備的13? 恰巧,在我坐在圖書館陷入沉思的時候,一位漂亮的小姐姐靠過來,說:“同學,你是在看線性規劃嗎?你能幫我看看這道題該怎麼解好嗎?” 納尼?

幹貨 數學規劃求解lp_solve詳細教程

sed them 點擊 容易 nic -c tis 彈出 工具箱 前言 最近小編學了運籌學中的單純形法。於是,很快便按奈不住跳動的心。這不得不讓我拿起紙和筆思考著,一個至關重要的問題:如何用單純形法裝一個完備的13? 恰巧,在我坐在圖書館陷入沈思的時候,一位漂亮的×××姐靠

SCIP | 數學規劃求解SCIP詳細的使用教程

前言 小夥伴們大家好呀!繼上次lp_solve規劃求解器的推文出來以後,大家都期待著更多求解器的具體介紹和用法。小編哪敢偷懶,這不,趕在考試周之際,又在忙裡偷閒中給大家送上一篇SCIP規劃求解的推文教程。快一起來看看吧。 Part1 慣例科普篇 What is SCIP? 官方的介

幹貨 | 這裏有份數學規劃求解SCIP詳細的使用教程,請你收下

obi 手動 ipopt -- 圖片 下使用 資料 php lan 前言 小夥伴們大家好呀!繼上次lp_solve規劃求解器的推文出來以後,大家都期待著更多求解器的具體介紹和用法。小編哪敢偷懶,這不,趕在考試周之際,又在忙裏偷閑中給大家送上一篇SCIP規劃求解的推文教程。快

Python高階程式設計——裝飾Decorator詳細講解!

裝飾器decorator,是python語言的重要特性,上面一章節詳細講解了python裝飾器與python閉包的下篇內容,主要講解了什麼是python閉包,python閉包與裝飾器之間到底有什麼區別和聯絡。本文將介紹裝飾器系列文章補充篇,詳細介紹巢狀裝飾器的各部分類容,主要包括巢狀裝飾器的定義,執

手把手教你使用markdown編輯詳細

如何使用markdown編輯器來寫部落格 之前使用markdown格式編寫文件,但是都是一些零零散散的格式,今天有點空閒時間來總結一下markdown的格式,便於自己以後書寫marikdown文件。 目錄 用[TOC]來生成目錄: code如下:

WebRTC VideoEngine詳細教程(二)——整合OPENH264編解碼

http://blog.csdn.net/nonmarking/article/details/47910043 本系列目前共三篇文章,後續還會更新 總述 WebRTC原生支援VP8和VP9,但也可以自行整合H264編解碼器,比較常見

網絡爬蟲學習軟件篇-Python(一)下載安裝(詳細教程,傻瓜式說明)

說明 鍵盤 html window 的人 .org style pychar arm 很早就想學習一下網絡爬蟲了~苦於學藝不精並且過於懶惰以至於遲遲沒有行動~最近因為項目做的也差不多了,就用空學習一下這門新的語言,了解一下新的技術。(PS:真的不會排版醜就醜點吧) 上面

利用Python爬蟲爬取淘寶商品做數據挖掘分析實戰篇,詳細教程

實戰 趨勢 fat sts AI top 名稱 2萬 安裝模塊 項目內容 本案例選擇>> 商品類目:沙發; 數量:共100頁 4400個商品; 篩選條件:天貓、銷量從高到低、價格500元以上。 項目目的 1. 對商品標題進行文本分析 詞雲可視化 2.

linux搭建node環境詳細教程

rect 詳細步驟 命令 存在 rec figure 控制臺 source ins linux 環境搭建詳細步驟 1.訪問官方網址:https://nodejs.org/en/download/ 2.選擇和你服務器版本相關的壓縮包,復制下載鏈接 3.服務器登錄ssh

手把手詳細教程教你Scrapy爬達蓋爾社區,有彩蛋哦!

還需 創建 -c item 編程 編寫代碼 想要 紅色 spider 手把手超詳細教程教你Scrapy爬達蓋爾社區,有彩蛋哦! 繁華落盡and曲終人散 2018-05-17 19:11 好了,廢話不多說,學習代碼就是要學以致用的。不能寫了一遍代碼就讓

64位liunx系統安裝MySQL詳細教程

liunx版本mysql安裝包地址:https://download.csdn.net/download/qq_38545713/10615285 第一步:上傳安裝包到liunx伺服器 下載完成後;ftp上傳到伺服器 /user/local/目錄下,這個自己

IntelliJ IDEA 如何在同一個視窗建立多個專案--詳細教程

一.IntelliJ IDEA與Eclipse的區別       二.在同一個視窗建立多個專案 1.開啟IntelliJ IDEA,點選Create New Project 2.Java Enterprise-->Web Applicatio

CentOS 7.3下Zabbix 4.0監控搭建過程詳細教程

Zabbix是一個高度整合的企業級開源網路監控解決方案,與Cacti、nagios類似,提供分散式監控以及集中的web管理介面。zabbix具備常見商業監控軟體所具備的功能,例如主機效能監控,網路裝置效能監控,資料庫效能監控,ftp等通用協議的監控,能夠靈活利用可定製警告機制,允許使用者對事件傳送基於E-ma

Windows平臺edis安裝包下載詳細教程

簡單的redis安裝包下載使用 目錄 redis安裝包路徑 redis下載教程 redis簡單使用教程 redis安裝包路徑 redis安裝包下載路徑 ridis下載教程 步驟1. 點選下載連結顯示如下:

Windows平臺Redis安裝下載詳細教程

簡單的redis安裝包下載使用 目錄 redis安裝包路徑 redis下載教程 redis簡單使用教程 redis安裝包路徑 redis安裝包下載路徑 ridis下載教程 步驟1. 點選下載連結顯示如下:

Eclipse下如何使用Maven——詳細教程

1.更改工作區jdk設定,目錄必須為jdk目錄,不能是jre目錄 Window->Preferences->Java->Installed JREs->選中原有的jre->edit->更改為jdk目錄 2.最新版的Eclipse中集成了Maven,所以

Perl正則表示式詳細教程

前言 想必學習perl的人,對基礎正則表示式都已經熟悉,所以學習perl正則會很輕鬆。這裡我不打算解釋基礎正則的內容,而是直接介紹基礎正則中不具備的但perl支援的功能。關於基礎正則表示式的內容,可參閱基礎正則表示式。 我第一個要說明的是,perl如何使用正則。還記得當初把《精通正則表示式》的書看了一遍,把p

c++ 網路程式設計(九)TCP/IP LINUX/windows下 多執行緒詳細教程 以及 多執行緒實現服務端

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <process.h> #include <winsock2.h> #include <win

c++ 網路程式設計(九)TCP/IP LINUX/windows下 多執行緒詳細教程 以及 多執行緒實現服務端

原文作者:aircraft 原文連結:https://www.cnblogs.com/DOMLX/p/9661012.html  先講Linux下(windows下在後面可以直接跳到後面看): 一.執行緒基本概念 前面我們講過多程序伺服器,但我們知道它開銷很大