本文簡要介紹 python 語言中 scipy.optimize.milp
的用法。
用法:
scipy.optimize.milp(c, *, integrality=None, bounds=None, constraints=None, options=None)#
Mixed-integer 線性規劃
解決以下形式的問題:
其中 是決策變量的向量; 、 、 、 和 是向量; 是一個矩陣, 是必須是整數的決策變量的索引集。 (在這種情況下,隻能假設整數值的變量稱為“integral”;它具有“integrality” 約束。)
或者,那是:
最小化:
c @ x
這樣:
b_l <= A @ x <= b_u l <= x <= u Specified elements of x must be integers
默認情況下,
l = 0
和u = np.inf
除非用bounds
指定。- c: 一維密集數組
要最小化的線性目標函數的係數。 c 在問題解決之前被轉換為雙精度數組。
- integrality: 一維密集數組,可選
指示每個決策變量的完整性約束類型。
0
:連續變量;沒有完整性約束。1
:整數變量;決策變量必須是整數界限.2
:Semi-continuous變量;決策變量必須在界限或取值0
.3
:Semi-integer變量;決策變量必須是整數界限或取值0
.默認情況下,所有變量都是連續的。在解決問題之前,完整性被轉換為整數數組。
- bounds: scipy.optimize.Bounds,可選
決策變量的界限。在解決問題之前,下限和上限將轉換為雙精度數組。
Bounds
對象的keep_feasible
參數被忽略。如果未指定,則所有決策變量都被約束為非負數。- constraints: scipy.optimize.LinearConstraint 的序列,可選
優化問題的線性約束。參數可能是以下之一:
單個
LinearConstraint
對象可以轉換為
LinearConstraint
對象的單個元組為LinearConstraint(*constraints)
完全由類型 1. 和 2 的對象組成的序列。
在問題解決之前,所有的值都被轉換為雙精度,約束係數的矩陣被轉換為
scipy.sparse.csc_array
的實例。LinearConstraint
對象的keep_feasible
參數被忽略。- options: 字典,可選
求解器選項字典。可識別以下鍵。
- 顯示 布爾(默認值:
False
) 如果要在優化期間將優化狀態指示器打印到控製台,則設置為
True
。- node_limit 整數,可選
停止之前要求解的最大節點數(線性規劃鬆弛)。默認沒有最大節點數。
- 預解決 布爾(默認值:
True
) 預求解嘗試識別瑣碎的不可行性,識別瑣碎的無界性,並在將問題發送給主求解器之前對其進行簡化。
- time_limit 浮點數,可選
分配給解決問題的最大秒數。默認是沒有時間限製。
- mip_rel_gap 浮點數,可選
MIP 求解器的終止標準:當原始目標值與雙目標邊界之間的差距(按原始目標值縮放)<= mip_rel_gap 時,求解器將終止。
- 顯示 布爾(默認值:
- res: OptimizeResult
scipy.optimize.OptimizeResult
的一個實例。該對象保證具有以下屬性。- 狀態 int
一個整數,表示算法的退出狀態。
0
:找到最佳解決方案。1
:達到迭代或時間限製。2
:問題不可行。3
:問題是無限的。4
:其他;詳情見消息。- 成功 bool
True
當找到最佳解決方案時,False
否則。- 信息 str
算法退出狀態的字符串說明符。
以下屬性也將存在,但值可能是
None
,具體取決於解決方案狀態。- x ndarray
在滿足約束條件的同時最小化目標函數的決策變量的值。
- 樂趣 浮點數
目標函數
c @ x
的最優值。- mip_node_count int
MILP 求解器求解的子問題或“nodes” 的數量。
- mip_dual_bound 浮點數
MILP 求解器對最優解下限的最終估計。
- mip_gap 浮點數
原始目標值與雙重目標界限之間的差異,按原始目標值縮放。
參數 ::
返回 ::
注意:
milp
是 HiGHS 線性優化軟件 [1] 的包裝。該算法是確定性的,它通常會找到中等挑戰性的mixed-integer線性程序(如果存在)的全局最優值。參考:
[1]Huangfu, Q.、Galabova, I.、Feldmeier, M. 和 Hall, J. A. J.“HiGHS - 用於線性優化的高性能軟件。” https://highs.dev/
[2]Huangfu, Q. 和 Hall, J. A. J. “並行化對偶修正單純形法”。數學規劃計算, 10 (1), 119-142, 2018. DOI: 10.1007/s12532-017-0130-5
例子:
考慮 https://en.wikipedia.org/wiki/Integer_programming#Example 處的問題,該問題表示為兩個變量的最大化問題。由於
milp
要求將問題表示為最小化問題,因此決策變量的目標函數係數為:>>> import numpy as np >>> c = -np.array([0, 1])
注意負號:我們通過最小化目標函數的負數來最大化原始目標函數。
我們將約束的係數收集到數組中,例如:
>>> A = np.array([[-1, 1], [3, 2], [2, 3]]) >>> b_u = np.array([1, 12, 12]) >>> b_l = np.full_like(b_u, -np.inf)
由於這些約束沒有下限,我們定義了一個變量
b_l
,其中充滿了表示負無窮大的值。scipy.optimize.linprog
的用戶可能對此不熟悉,因為它隻接受A_ub @ x <= b_u
形式的 “less than”(或 “upper bound”)不等式約束。通過接受b_l <= A_ub @ x <= b_u
的b_l
和b_u
約束,milp
可以輕鬆地簡潔地指定 “greater than” 不等式約束、“less than” 不等式約束和等式約束。這些數組被收集到單個
LinearConstraint
對象中,例如:>>> from scipy.optimize import LinearConstraint >>> constraints = LinearConstraint(A, b_l, b_u)
默認情況下強製執行決策變量的非負邊界,因此我們不需要為邊界提供參數。
最後,問題表明兩個決策變量都必須是整數:
>>> integrality = np.ones_like(c)
我們解決這樣的問題:
>>> from scipy.optimize import milp >>> res = milp(c=c, constraints=constraints, integrality=integrality) >>> res.x [1.0, 2.0]
請注意,我們是否解決了鬆弛問題(沒有完整性約束):
>>> res = milp(c=c, constraints=constraints) # OR: >>> # from scipy.optimize import linprog; res = linprog(c, A, b_u) >>> res.x [1.8, 2.8]
我們不會通過舍入到最接近的整數來獲得正確的解決方案。
本教程中給出了其他示例。
相關用法
- Python SciPy optimize.minimize_scalar用法及代碼示例
- Python SciPy optimize.minimize用法及代碼示例
- Python SciPy optimize.rosen_der用法及代碼示例
- Python SciPy optimize.line_search用法及代碼示例
- Python SciPy optimize.rosen用法及代碼示例
- Python SciPy optimize.shgo用法及代碼示例
- Python SciPy optimize.root用法及代碼示例
- Python SciPy optimize.fmin用法及代碼示例
- Python SciPy optimize.NonlinearConstraint用法及代碼示例
- Python SciPy optimize.KrylovJacobian用法及代碼示例
- Python SciPy optimize.toms748用法及代碼示例
- Python SciPy optimize.linprog_verbose_callback用法及代碼示例
- Python SciPy optimize.bracket用法及代碼示例
- Python SciPy optimize.diagbroyden用法及代碼示例
- Python SciPy optimize.bisect用法及代碼示例
- Python SciPy optimize.isotonic_regression用法及代碼示例
- Python SciPy optimize.golden用法及代碼示例
- Python SciPy optimize.brute用法及代碼示例
- Python SciPy optimize.newton用法及代碼示例
- Python SciPy optimize.fsolve用法及代碼示例
- Python SciPy optimize.Bounds用法及代碼示例
- Python SciPy optimize.fixed_point用法及代碼示例
- Python SciPy optimize.rosen_hess用法及代碼示例
- Python SciPy optimize.nnls用法及代碼示例
- Python SciPy optimize.broyden1用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.optimize.milp。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。