我在gurobipy中對我的模型進行了編碼,我想獲得約束矩陣和成本向量。 有什麼方法可以訪問這些嗎?從gurobipy獲取矩陣格式的約束條件
4
A
回答
10
從python API中,沒有一個函數可以從Gurobi模型中獲得矩陣係數,但是您自己寫一個矩陣係數並不難。
列出變量和約束條件很方便。如果你有可變m
一個gurobi模型
dvars = m.getVars()
constrs = m.getConstrs()
會給你的變量和約束的列表。然後可以使用m.getAttr來檢索與變量相關的屬性。爲了獲得目標函數的係數,你查詢「的OBJ」屬性
obj_coeffs = m.getAttr('Obj', dvars)
這會給你的目標係數的列表模型中的每個變量。對於約束矩陣,您可能只需要存儲非零值。我只是把它們存儲在COOrdinate格式
- 行索引
- 列索引
- 係數
在Gurobi蟒蛇每個變量和約束對象有一個索引。我就創建對象映射到指數
var_index = {v: i for i, v in enumerate(dvars)}
constr_index= {c: i for i, c in enumerate(constrs)}
在constrs
列表中的每個約束對象對應於模型的約束字典。每個約束包括其 - 左手邊表達 - 感(< =,==,> =) - 右手側恆定
對於約束矩陣,想要的左手側。它由一個LinExpr
對象表示,您可以通過該模型上的getRow
方法獲得該對象。作爲6.x的Gurobi的,獲得列索引,係數元組的列表,需要像下面
def get_expr_coos(expr, var_indices):
for i in range(expr.size()):
dvar = expr.getVar(i)
yield expr.getCoeff(i), var_indices[dvar]
一個函數來獲取的矩陣,則需要應用此功能,每約束。
def get_matrix_coo(m):
dvars = m.getVars()
constrs = m.getConstrs()
var_indices = {v: i for i, v in enumerate(dvars)}
for row_idx, constr in enumerate(constrs):
for coeff, col_idx in get_expr_cos(m.getRow(constr), var_indices):
yield row_idx, col_idx, coeff
使用此功能,您可以將矩陣存儲到一個結構類似熊貓數據幀
nzs = pd.DataFrame(get_matrix_coos(m),
columns=['row_idx', 'col_idx', 'coeff'])
從這個結構,你可以做的非零模式的基本情節。使用miplib aflow40b基準測試問題。
import matplotlib.pyplot as plt
import pandas as pd
import gurobipy as grb
m = grb.read("miplib/instances/miplib2010/aflow40b.mps.gz")
nzs = pd.DataFrame(get_matrix_coo(m),
columns=['row_idx', 'col_idx', 'coeff'])
plt.scatter(nzs.col_idx, nzs.row_idx,
marker='.', lw=0)
相關問題
- 1. 獲取動態子矩陣並應用約束條件
- 2. scipy.optimize與矩陣約束
- 3. 矩陣約束CPLEX Python API
- 4. 矩陣行和列約束
- 5. 矩陣分割帶約束
- 6. 在矩陣中找到符合特定約束條件的行?
- 7. SQL Server 2008-獲取表約束條件
- 8. 以編程方式獲取uibutton的約束條件
- 9. 獲取矩陣的模式
- 10. 獲取面板的網格包約束
- 11. 關於約束規範矩陣
- 12. SQLServer2000約束條件
- 13. UITableViewCell約束條件
- 14. 獲取矩陣條目的排名?
- 15. 在Java Swing中獲取組件的佈局約束條件
- 16. 查看錶格作爲約束條件
- 17. 格 - 矩陣狀的條
- 18. 動態編寫從矩陣scipy.optimize.minimize的目標函數和約束
- 19. 通配符路由中的格式約束條件
- 20. C++ lambda捕獲約束條件
- 21. POSTGRESQL的約束條件
- 22. 或QueryOver的約束條件
- 23. Mysql的約束與條件
- 24. 列的SQL約束條件
- 25. wCompact hRegular的約束條件
- 26. 檢查約束的條件
- 27. 條件MYSQL的唯一約束條件
- 28. 如何獲取mySQL表格的矩陣
- 29. Excel求解器如何在約束條件下比較2 [n * n]個矩陣
- 30. 獲取元素的當前約束條件
可以提供目標函數和約束?對於變量,我認爲你可以使用for循環迭代通過model.getVars來獲得所有的約束,如果你提供了模型,我可以提供詳細的輸出,因爲可以從模型中獲取所有數據。 – sb0709