Python CPLEX 模組簡介


Python CPLEX 模組是 CPLEX 最佳化軟體的介面,CPLEX 是一款強大的工具,用於解決線性規劃和二次規劃問題。對於變數和約束數量眾多的問題,它尤其有用,因為它可以很好地擴充套件以處理此類例項。

Python CPLEX 模組允許使用者使用 Python 程式語言構建最佳化模型,然後使用 CPLEX 求解器求解這些模型。它提供了一系列用於控制求解過程的選項,例如設定求解器的容差以及時間和記憶體使用限制。

Python CPLEX 模組是解決最佳化問題的強大工具,它擁有一系列選項和功能,使其適用於各種應用程式。無論您是處理一個只有少量變數和約束的小型問題,還是處理一個具有數千個變數和約束的大規模問題,Python CPLEX 模組都可以幫助您找到最優解。

Python CPLEX 模組和最佳化問題

我們在各個領域都會遇到最佳化問題,包括運籌學、經濟學和計算機科學。這些問題涉及在一定條件下,找到滿足一組約束和目標的最優解。

例如,在運輸行業中,最佳化問題可能涉及找到將貨物交付到多個目的地最經濟的路線,同時滿足各種約束條件,例如容量和時間限制。

解決最佳化問題可能具有挑戰性,因為即使對於相對較小的例項,可能的解決方案數量也可能非常龐大。這就是 Python CPLEX 模組派上用場的地方。由於在 CPLEX 求解器中實現了先進的演算法,它提供了一種快速可靠的解決最佳化問題的方法。

Python CPLEX 模組:安裝

在安裝 Python CPLEX 模組之前,需要滿足一些先決條件。這些包括:

  • 安裝 Python - Python CPLEX 模組需要在您的系統上安裝 Python。如果您尚未安裝 Python,可以從 Python 官方網站 (https://python.club.tw/) 下載。

  • 安裝 CPLEX Optimization Studio - Python CPLEX 模組是 CPLEX Optimization Studio 的介面,CPLEX Optimization Studio 是一個單獨的軟體包。您可以從 IBM 網站 (https://www.ibm.com/products/ilog-cplex-optimization-studio) 下載 CPLEX Optimization Studio。

安裝了這些先決條件後,您可以繼續安裝 Python CPLEX 模組。以下是需要遵循的步驟:

開啟終端並執行以下命令以安裝模組

pip install cplex

如果安裝成功,您應該會看到一條訊息指示模組已安裝。

驗證安裝,您可以嘗試在 Python 指令碼中匯入模組:

import cplex
print(cplex.__version__)

如果匯入成功並列印版本號,則 Python CPLEX 模組已安裝並可以使用。

Python CPLEX 模組:基本用法

現在您已經安裝了 Python CPLEX 模組,讓我們看看如何使用它來解決最佳化問題。

匯入模組

第一步是在您的 Python 指令碼中匯入模組:

import cplex

設定最佳化問題

接下來,您需要定義要解決的最佳化問題。這包括指定問題的型別(線性或二次)、變數和約束的數量以及目標函式。

這是一個使用三個變數和兩個約束的線性最佳化問題的示例

problem = cplex.Cplex()
problem.variables.add(
	ub=[10, 10, 10], 
	lb=[0, 0, 0], 
	names=["x1", "x2", "x3"]
)

新增約束

設定最佳化問題後,下一步是新增約束。約束是解決方案必須滿足的條件。

在 Python CPLEX 模組中,使用 `linear_constraints.add()` 方法新增約束。此方法將係數列表、變數名稱列表和右側值作為引數。

以下是在上面定義的最佳化問題中新增兩個約束的示例:

problem.linear_constraints.add(rhs=[20, 30], senses=["L", "L"], names=["c1", "c2"])
problem.linear_constraints.set_coefficients(
   [("c1", "x1", 10), ("c1", "x2", 6),
	 ("c1", "x3", 4), ("c2", "x1", 5),
	 ("c2", "x2", 4), ("c2", "x3", 5)]
)

第一個約束 (c1) 指定 10x1 + 6x2 + 4x3 的和必須小於或等於 20。第二個約束 (c2) 指定 5x1 + 4x2 + 5x3 的和必須小於或等於 30。

新增目標函式

定義約束後,下一步是新增目標函式。目標函式指定最佳化問題的目標,例如最小化或最大化特定值。

在 Python CPLEX 模組中,使用 `objective.set_sense()` 和 `objective.set_linear()` 方法新增目標函式。`set_sense()` 方法接受一個字串引數,該引數指定目標是最小化 (“min”) 還是最大化 (“max”)。`set_linear()` 方法接受係數列表和變數名稱列表作為引數。

以下是在上面定義的最佳化問題中設定最大化目標的示例:

problem.objective.set_sense(problem.objective.sense.maximize)
problem.objective.set_linear(zip(["x1", "x2", "x3"], [1, 2, 3]))

此目標函式指定目標是最大化 1x1 + 2x2 + 3x3 的值。

解決最佳化問題

完全定義最佳化問題後,下一步是解決它。這是使用 Cplex 物件的 `solve()` 方法完成的。

problem.solve()

檢索解決方案

解決最佳化問題後,您可以使用 Cplex 物件的各種方法檢索解決方案。例如,要獲取最優目標值,您可以使用 `solution.get_objective_value()` 方法:

objective_value = problem.solution.get_objective_value()
print("Optimal objective value:", objective_value)

要獲取最優解處變數的值,您可以使用 `solution.get_values()` 方法:

print("Variable values:", problem.solution.get_values())

完整程式碼

讓我們看看使用 Python CPLEX 模組解決最佳化問題的完整示例:

示例

# Import the Python CPLEX module
import cplex

# Create a Cplex object to represent the optimization problem
problem = cplex.Cplex()

# Add three variables to the problem, with upper and lower bounds of 0 and 10
problem.variables.add(ub=[10, 10, 10], lb=[0, 0, 0], names=["x1", "x2", "x3"])

# Add two constraints to the problem
problem.linear_constraints.add(rhs=[20, 30], senses=["L", "L"], names=["c1", "c2"])

# Set the coefficients for the variables in the constraints
problem.linear_constraints.set_coefficients(
	[("c1", "x1", 10), ("c1", "x2", 6), 
	 ("c1", "x3", 4), ("c2", "x1", 5), 
	 ("c2", "x2", 4), ("c2", "x3", 5)]
)

# Set the objective function to maximize 1x1 + 2x2 + 3x3
problem.objective.set_sense(problem.objective.sense.maximize)
problem.objective.set_linear(zip(["x1", "x2", "x3"], [1, 2, 3]))

# Solve the optimization problem
problem.solve()

# Print the optimal objective value
print("Optimal objective value:", problem.solution.get_objective_value())

# Print the values of the variables at the optimal solution
print("Variable values:", problem.solution.get_values())

輸出

以下是執行程式時將看到的輸出:

Version identifier: 22.1.0.0 | 2022-03-25 | 54982fbec
CPXPARAM_Read_DataCheck                          1
Tried aggregator 1 time.
No LP presolve or aggregator reductions.
Presolve time = 0.09 sec. (0.00 ticks)

Iteration log . . .
Iteration:     1   Dual objective     =            15.000000
Optimal objective value: 15.0
Variable values: [0.0, 0.0, 5.0]

Python CPLEX 模組:實際應用

以下是可以使用 Python CPLEX 模組解決的一些實際最佳化問題的示例:

供應鏈最佳化

在供應鏈行業中,公司經常面臨最佳化其網路中商品和物料流動的挑戰。這可能涉及查詢倉庫的最佳位置,確定最經濟的運輸路線以及安排生產和交付以滿足需求。

Python CPLEX 模組可用於透過對供應鏈的各個組成部分進行建模並找到最大限度地降低成本或最大限度地提高利潤的解決方案來解決這些型別的最佳化問題。

投資組合最佳化

在金融領域,投資者通常試圖透過選擇最大化收益並最小化風險的資產組合來最佳化其投資組合。Python CPLEX 模組可用於透過對不同資產的預期收益和風險進行建模,並找到實現所需風險和收益水平的最佳資產組合來解決此類最佳化問題。

網路設計

在網路領域,公司可能需要設計用於資料通訊或運輸的高效網路。這可能涉及查詢網路中路由器或節點的最佳放置位置,或確定資料或貨物流經網路的最有效路線。

Python CPLEX 模組可用於透過對網路進行建模並找到最大限度地降低成本或最大限度地提高效能的解決方案來解決這些型別的最佳化問題。

結論

在本教程中,我們解釋瞭如何使用 Python CPLEX 模組來解決最佳化問題。我們已經介紹了安裝和使用模組的基礎知識,以及一些用於自定義解決方案過程和擴充套件到大規模問題的更高階選項。我們還討論瞭如何在分散式環境中使用該模組。

更新於:2024年2月20日

瀏覽量:690

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告