一、簡介
linprog是一個優化問題的算法函數,主要用於解決線性規劃問題。線性規劃問題即在滿足線性約束條件的前提下,求解線性函數的最小值或最大值的過程。該函數可以求解一個線性規劃問題,且返回的結果可以直接使用或用於其他計算中。
二、使用
使用linprog函數通常需要傳遞一些參數。其中最基本的參數為c,即需要最小化或最大化的線性目標函數。還有A_ub、b_ub、A_eq、b_eq這四個參數。其中A_ub、b_ub是對代表不等式線性約束方程的矩陣和向量(即≤約束條件),而A_eq、b_eq對應代表等式約束方程的矩陣和向量。
需要注意一些參數的格式要求。例如,c參數必須是長度為N的一維向量,而不是矩陣。A_ub是m×N的矩陣,b_ub是長度為m的向量,A_eq和b_eq具有類似的格式。當然,在某些情況下,某些約束條件可以丟失或缺失。
三、樣例
下面給出一個目標函數最小化的樣例。該問題需要最小化3×1+4×2,約束條件為-1×1+2×2≤4、1×1+x2≤5以及x2≥-3。
from scipy.optimize import linprog
c = [-3, 4]
A = [[-1, 2], [1, 1]]
b = [4, 5]
bounds = ((None, None), (None, None))
res = linprog(c, A_ub=A, b_ub=b, bounds=bounds)
print(res)
輸出結果為:
fun: -22.0
message: 'Optimization terminated successfully.'
nit: 4
slack: array([0., 0.])
success: True
x: array([2., 3.])
其中,x值表示優化的變量結果,最小值為-22。該問題實現的約束條件結果: -1(2) + 2(3) = 4和 1(2) + 1(3) = 5都滿足約束條件,因此輸出結果看到slack的值被設置為0。
四、注意事項
在一些問題中,A_ub向量不是完全滿足“≤”的約束條件。例如A_ub可能包含多於滿足線性方程組的約束,有時也可能包含不等式約束條件“A_ubx≤b_ub”中漏掉的不等式。在這種情況下,可以使用bounds參數來代替A_ub和b_ub約束條件:
bounds = [(None, None), (-3, None)]
res = linprog(c, A_ub=A, b_ub=b, bounds=bounds)
print(res)
在這個例子中,為變量x2添加下界-3,原因是這是未包含在原始A_ub和b_ub設置中的約束。
一些其他參數也可以通過傳遞options字典參數來設置。例如,選項中可能需要設置tol,即算法終止前的過渡容許誤差,以及設置maxiter選項來限制算法的最大迭代次數。
options = {"tol": 1e-4, "maxiter": 1000}
res = linprog(c, A_ub=A, b_ub=b, bounds=bounds, options=options)
print(res)
這裡展示的是調用linprog函數的基本示例。需要注意不同問題的求解方式和對各個參數的細節設置。但總的來說,linprog可以解決複雜的約束規劃問題。
原創文章,作者:ODRU,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/133079.html