當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy optimize.milp用法及代碼示例


本文簡要介紹 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 = 0u = 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 的序列,可選

優化問題的線性約束。參數可能是以下之一:

  1. 單個 LinearConstraint 對象

  2. 可以轉換為 LinearConstraint 對象的單個元組為 LinearConstraint(*constraints)

  3. 完全由類型 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_ub_lb_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]

我們不會通過舍入到最接近的整數來獲得正確的解決方案。

本教程中給出了其他示例。

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.optimize.milp。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。