解析輸入模型並一次傳回結果。如果不需要回呼、漸進式,也不需要追蹤解題進度,就可以使用這個類型。
HTTP 要求
POST https://optimization.googleapis.com/v1/mathopt:solveMathOptModel
這個網址使用 gRPC 轉碼語法。
要求主體
要求主體的資料會採用以下結構:
JSON 表示法 |
---|
{ "solverType": enum ( |
欄位 | |
---|---|
solverType |
選用設定。用來以數值表示問題的解題工具。請注意,如果解題工具不支援模型中的特定功能,最佳化程序就會失敗。 |
model |
必要欄位。以數學表示要解決的最佳化問題。 |
parameters |
選用設定。用於控制單一解題的參數。系統會特別處理 enableOutput 參數。如果解題工具支援訊息回呼,只要將其設為 true,伺服器就會註冊訊息回呼。產生的訊息會在 SolveMathOptModelResponse.messages 中傳回。如果是其他解題工具,將 enableOutput 設為 true 將導致錯誤。 |
modelParameters |
選用設定。用於控制輸入模型特有單一解題的參數 (如需模型獨立參數,請參閱 SolveParametersProto)。 |
回應主體
使用 MathOpt 的一元遠距解題回應。
如果成功,回應主體會含有以下結構的資料:
JSON 表示法 |
---|
{
"result": {
object ( |
欄位 | |
---|---|
result |
處理要求中模型的輸出內容說明。 |
messages[] |
如果已使用 SolveParametersProto.enable_output,就會包含支援訊息回呼的解題工具記錄訊息。 |
SolverTypeProto
MathOpt 支援的解題工具。
列舉 | |
---|---|
SOLVER_TYPE_UNSPECIFIED |
|
SOLVER_TYPE_GSCIP |
解決限制整數程式 (SCIP) 解析器 (第三方)。 支援 LP、MIP 和非卷積整數二次方程式問題。不過,系統不會傳回到達網頁的雙重資料。建議使用 GLOP 處理到達網頁。 |
SOLVER_TYPE_GUROBI |
Gurobi 解題工具 (第三方)。 支援 LP、MIP 和非卷積整數二次方程式問題。通常是最快速的選項,但提供特殊授權。 |
SOLVER_TYPE_GLOP |
Google 的 Glop 解題工具 支援使用基本和雙 Simplex 方法的 LP。 |
SOLVER_TYPE_CP_SAT |
Google 的 CP-SAT 解題工具。 支援所有變數均為整數且有限制 (或暗示在 pResolve 後) 的問題。實驗性支援,利用連續變數來重新調度資源及分散問題。 |
SOLVER_TYPE_PDLP |
Google 的 PDLP 解析工具。 支援到達網頁和凸對對角二次方程式目標。使用第一排序方法,而非 Simplex。可以解決非常大型的問題。 |
SOLVER_TYPE_GLPK |
GNU Linear Programming Kit (GLPK) (第三方)。 支援 MIP 和 LP。 執行緒安全:GLPK 會使用執行緒本機儲存空間進行記憶體配置。因此,在建立求解器執行個體時,必須刪除到相同的執行緒,否則 GLPK 會停止運作。相較於用來建立求解器的執行緒,呼叫 求解器::Solve() 似乎沒問題,但 GLPK 並未記錄該執行緒,因此應避免這麼做。 使用 p 解析器解析 LP 時,只有在找出最佳解決方案時,才會傳回解法 (和無邊框)。否則系統不會傳回任何結果。詳情請參閱 glpk-5.0/doc/glpk.pdf 第 40 頁 (來自 glpk-5.0.tar.gz)。 |
SOLVER_TYPE_OSQP |
操作人員分割二次程式 (OSQP) 解題工具 (第三方)。 支援線性限制和線性或卷積二極目標連續問題。使用第一順位方法。 |
SOLVER_TYPE_ECOS |
內嵌 Conic 求解器 (ECOS) (第三方)。 支援 LP 和 SOCP 問題。使用內部點方法 (障礙)。 |
SOLVER_TYPE_SCS |
分割圓錐解析器 (SCS) (第三方)。 支援 LP 和 SOCP 問題。使用第一順位方法。 |
SOLVER_TYPE_HIGHS |
HiGHS 求解器 (第三方)。 支援到達網頁和 MIP 問題 (未執行 convex QP)。 |
SOLVER_TYPE_SANTORINI |
MathOpt 的 MIP 解題工具實作。 速度緩慢/不建議在正式環境中使用。並非 LP 解析器 (未傳回雙資訊資訊)。 |
ModelProto
最佳化問題。MathOpt 支援:- 具有選用有限界限的連續與整數決策變數。- 線性和二次目標 (單一或多個目標),最小化或最大化。- 限制型別的數量,包括:* 線性限制 * 二次限制 * 第二順位限制 * 邏輯限制 >SOS1 與 SOS2 限制條件 >指標限制
根據預設,限制會以「ID 到資料」的形式呈現地圖。不過,我們能以更有效率的「結構式結構」表示線性限制格式。
JSON 表示法 |
---|
{ "name": string, "variables": { object ( |
欄位 | |
---|---|
name |
|
variables |
|
objective |
模型中的主要目標, |
auxiliaryObjectives |
用於多目標模型的輔助目標。 對應金鑰 ID 必須採用 [0, max(int64)]。每個優先順序及每個非空值的名稱都不得重複,且與主要 這個物件中包含 |
linearConstraints |
|
linearConstraintMatrix |
線性限制的變數係數。 如果這項限制的相關變數遭到刪除,系統會將其視為設為零。 需求條件:* LinearConstraintMatrix.row_ids 是 LinearConstraints.ids 的元素。* LinearConstraintMatrix.column_ids 是變數.ids 的元素。* 未指定 0 的矩陣項目。* LinearConstraintMatrix.values 必須全部為有限值。 |
quadraticConstraints |
模型中的二次限制。 這個物件中包含 |
secondOrderConeConstraints |
模型中的第二順位錐體限制。 這個物件中包含 |
sos1Constraints |
模型中的 SOS1 限制,限制最多只能有一個 這個物件中包含 |
sos2Constraints |
模型中的 SOS2 限制,這會限制最多兩個 這個物件中包含 |
indicatorConstraints |
模型中的指標限制,強制規定若二進位「指標變數」設為 1,然後是「默示限制」必須先處於訴訟保留狀態。 這個物件中包含 |
VariablesProto
如下方使用,我們定義「#variables」= size(VariablesProto.ids)。
JSON 表示法 |
---|
{ "ids": [ string ], "lowerBounds": [ number ], "upperBounds": [ number ], "integers": [ boolean ], "names": [ string ] } |
欄位 | |
---|---|
ids[] |
必須為非負數,並嚴格增加。無法使用 max(int64) 值。 |
lowerBounds[] |
長度應等於 #variables,[-inf, inf] 中的值。 |
upperBounds[] |
長度應等於 #variables,其中的值是 (-inf, inf])。 |
integers[] |
長度應等於 #variables。連續變數的值為 false,整數變數則為 true。 |
names[] |
如未設定,系統會假設為所有空白字串。否則,長度應等於 #variables。 所有非空白名稱皆不得重複。 |
ObjectiveProto
JSON 表示法 |
---|
{ "maximize": boolean, "offset": number, "linearCoefficients": { object ( |
欄位 | |
---|---|
maximize |
false 代表最小化,真值最大 |
offset |
必須為有限且不得為 NaN。 |
linearCoefficients |
是對決策變數構成線性的 ObjectiveProto 字詞, 規定:* LinearCoefficiencys.ids 是 VariablesProto.ids 的元素。* 未指定 VariablesProto。* LinearCoefficiencys.values 都必須是「有限」* LinearCoefficiencys.values 可以是零,但這會浪費空間。 |
quadraticCoefficients |
決策變數的二次目標字詞。 除了 SparseDoubleMatrixProto 訊息的規定之外:* quadraticCo 常見 efficiencys.row_ids 的每個元素和 QudraticCo 常見 efficiencys.column_ids 的元素都必須是 VariablesProto.ids 的元素。* 矩陣必須位於上方三角型:每個 i 的二次方程式為二元係數.row_ids[i] <= quadraticCoefficiencys.column_ids[i]。 附註:* 未明確儲存的字詞的係數為零。* quadraticCoefficiencys.coefficiencys 的元素可以為零,但這只會浪費空間。 |
name |
上層郵件在這個欄位上可能會有唯一性要求;例如,請參閱 ModelProto.objectives 和 AuxiliaryObjectivesUpdatesProto.new_objectives。 |
priority |
如為多目標問題,則這個目標相對於其他目標的優先順序 (越低越重要)。這個值必須為正數。此外,在解決問題時,模型中的每個目標優先順序都必須不同。這個狀況尚未在 proto 層級經過驗證,因此模型可能會暫時設定優先順序相同的目標。 |
SparseDoubleVectorProto
雙倍向量的稀疏表示法。
JSON 表示法 |
---|
{ "ids": [ string ], "values": [ number ] } |
欄位 | |
---|---|
ids[] |
必須以所有元素分別排序 (依遞增順序排列)。 |
values[] |
長度必須與 ID 相同。不得包含 NN。 |
SparseDoubleMatrixProto
雙精度矩陣的稀疏表示法。
矩陣會儲存為列 ID、欄 ID 和係數的三倍。這三個向量的長度必須相同。所有 i 的元組 (rowIds[i], columnIds[i]) 都不得重複。項目必須按照列主要順序排列。
JSON 表示法 |
---|
{ "rowIds": [ string ], "columnIds": [ string ], "coefficients": [ number ] } |
欄位 | |
---|---|
rowIds[] |
|
columnIds[] |
|
coefficients[] |
不得包含 NN。 |
LinearConstraintsProto
如下方範例所示,「#線性限制」= size(LinearConstraintsProto.ids)。
JSON 表示法 |
---|
{ "ids": [ string ], "lowerBounds": [ number ], "upperBounds": [ number ], "names": [ string ] } |
欄位 | |
---|---|
ids[] |
必須為非負數,並嚴格增加。無法使用 max(int64) 值。 |
lowerBounds[] |
長度應等於 #Linear 限制條件 ([-inf, inf] 中的值)。 |
upperBounds[] |
長度應等於 #Linear 限制條件,其中的值為 (-inf、inf]。 |
names[] |
如未設定,系統會假設為所有空白字串。否則,長度應等於 #Linear 限制條件。 所有非空白名稱皆不得重複。 |
QuadraticConstraintProto
以下列格式表示的單一二次限制:lb <= total{LinearTerms} + total{quadraticTerms} <= ub。
如果這項限制的相關變數遭到刪除,系統會將其視為設為零。
JSON 表示法 |
---|
{ "linearTerms": { object ( |
欄位 | |
---|---|
linearTerms |
決策變數中屬於線性的字詞。 除了 SparseDoubleVectorProto 訊息的規定外,還要求:* LinearTerms.ids 是 VariablesProto.ids 的元素。* LinearTerms.values 必須為限值,而不是 NaN。 附註:* 省略的變數 ID 的對應係數為零。* LinearTerms.values 可以是零,但這樣做只會浪費空間。 |
quadraticTerms |
決策變數中形成二次的字詞。 除了 SparseDoubleMatrixProto 訊息的要求外,還要求:* quadraticTerms.row_ids 的每個元素和 quadraticTerms.column_ids 的每個元素都必須是 VariablesProto.ids 的元素。* 矩陣必須位於上方三角形:每個 i 的 QudraticTerms.row_ids[i] <= quadraticTerms.column_ids[i]。 附註:* 未明確儲存的字詞的係數為零。* quadraticTerms.coefficiencys 的元素可以為零,但這只是浪費空間。 |
lowerBound |
值必須是 [-inf, inf],且小於或等於 |
upperBound |
值必須是 (-inf、inf],且大於或等於 |
name |
上層郵件在這個欄位上可能會有唯一性要求;例如,請參閱 ModelProto.quadratic_constraints 和 QuadraticConstraintUpdatesProto.new_constraints。 |
SecondOrderConeConstraintProto
下列格式的單一第二順位限制:
||argumentsToNorm
||_2 <= upperBound
,
其中 upperBound
和 argumentsToNorm
的每個元素都是線性運算式。
如果這項限制的相關變數遭到刪除,系統會將其視為設為零。
JSON 表示法 |
---|
{ "upperBound": { object ( |
欄位 | |
---|---|
upperBound |
|
argumentsToNorm[] |
|
name |
上層郵件在這個欄位上可能會有唯一性要求;例如,請參閱 |
LinearExpressionProto
線性運算式的稀疏表示法 (變數加權總和,加上常數偏移)。
JSON 表示法 |
---|
{ "ids": [ string ], "coefficients": [ number ], "offset": number } |
欄位 | |
---|---|
ids[] |
變數 ID。必須以所有元素分別排序 (依遞增順序排列)。 |
coefficients[] |
長度必須與 ID 相同。值必須是有限值,不得為 NaN。 |
offset |
必須為有限值,且不得為 NaN。 |
SosConstraintProto
代表單一 SOS1 或 SOS2 限制的資料。
如果這項限制的相關變數遭到刪除,系統會將其視為設為零。
JSON 表示法 |
---|
{
"expressions": [
{
object ( |
欄位 | |
---|---|
expressions[] |
要套用 SOS 限制的運算式:* SOS1:最多一個元素接受非零值。* SOS2:最多兩個元素只接受非零的值,且必須依照重複順序排列。 |
weights[] |
運算式不得留空或長度相同。如果留空,預設權重為 1、2 ... ...如有此值,則項目不得重複。 |
name |
上層郵件在這個欄位上可能會有唯一性要求;例如,請參閱 ModelProto.sos1_constraints 和 SosConstraintUpdatesProto.new_constraints。 |
IndicatorConstraintProto
代表下列格式單一指標限制的資料:Variable(indicatorId) = (activateOnZero ?0 : 1) ⇒ lowBound <=運算式 <= maxBound。
如果刪除與這項限制相關的變數 (指標或在 expression
中顯示),系統會將其視為設為零。特別是,刪除指標變數代表如果 activateOnZero
為 false,指標限制為空,且如果 activateOnZero
為 true,則指標限制等同於線性限制。
JSON 表示法 |
---|
{
"activateOnZero": boolean,
"expression": {
object ( |
欄位 | |
---|---|
activateOnZero |
如果為 true,則如果指標變數的值為 0,則默示限制必須具有。否則,如果指標變數使用值 1,則該隱含限制必須有效。 |
expression |
必須為包含模型的有效線性運算式:* |
lowerBound |
值必須是 [-inf, inf);但不得為 NaN。 |
upperBound |
值必須包含 (-inf, inf],不得為 NaN)。 |
name |
上層郵件在這個欄位上可能會有唯一性要求;例如,請參閱 |
indicatorId |
對應至二進位變數或未設定的 ID。如未設定,系統會忽略指標限制。設定後,我們要求:* VariablesProto.integers[indicatorId] = true, * VariablesProto.lower_bounds[indicatorId] >= 0, * VariablesProto.upper_bounds[indicatorId] <= 1.這些條件不會經過 MathOpt 驗證,但如果不符合要求,解題工具在解題時就會傳回錯誤。 |
SolveParametersProto
用於控制單一解題的參數。
包含所有解題工具通用的參數,例如timeLimit 和特定解題工具的參數,例如:gscip。如果同時在常用欄位和解題工具專屬欄位中設定值,系統會使用解題工具專用設定。
常見的選用參數為選用且未設定,或是列舉未指定值的列舉,表示使用解析器預設值。
除了使用中的解題器,系統會忽略該解程式專屬參數。
取決於模型的參數 (例如為每個變數設定分支優先順序) 會透過 ModelSolveParametersProto 傳送。
JSON 表示法 |
---|
{ "timeLimit": string, "enableOutput": boolean, "lpAlgorithm": enum ( |
欄位 | |
---|---|
timeLimit |
解題工具應在問題上停留的時間上限 (如未設定,則為無限)。 這個值並非硬性限制,解析時間可能會稍微超過這個值。這個參數一律會傳遞至基礎解題工具,不使用解題工具預設值。 持續時間以秒為單位,最多 9 個小數位數,結尾為「 |
enableOutput |
允許列印解析器實作追蹤記錄。這些追蹤記錄的位置取決於解題工具。SCIP 和 Gurobi 會是標準輸出串流。針對 Glop 和 CP-SAT,這將會 LOG(INFO)。 請注意,如果解題工具支援訊息回呼,且使用者為其註冊回呼,則系統會忽略此參數值,並且不輸出任何追蹤記錄。 |
lpAlgorithm |
解析線性程式的演算法。如果 LP_ALGORITHM_UNSPECIFIED,請使用解題工具預設演算法。 如果是非線性程式,但線性程式設計屬於子常式的問題,解題工具可以使用這個值。例如:MIP 解析器通常只會用於根 LP 解析 (否則使用雙簡簡單 x)。 |
presolve |
建議您在啟動主要演算法之前簡化問題;如果 EMPHASIS_UNSPECIFIED ,則可簡化解答工具預設人力等級。 |
cuts |
盡可能提高 LP 的放鬆程度 (僅限 MIP),或者如果 EMPHASIS_UNSPECIFIED ,則會改用解題工具預設功等級。 注意:停用切割功能可防止回呼在 MIP_NODE 新增切割點,這是特定解題工具。 |
heuristics |
除了完整的搜尋程序 (僅限 MIP) 之外,您更願意找出可行的解決方案;如果您 EMPHASIS_UNSPECIFIED ,則能找到解題工具預設功用等級。 |
scaling |
為提升數值穩定性,盡可能增加數值穩定性,或是如果 EMPHASIS_UNSPECIFIED 則努力解決問題。 |
iterationLimit |
限制基礎演算法的疊代 (例如 Simplex 透視)。具體行為取決於解題工具和演算法,但通常可以設定確定性的解題數 (可能需要進一步設定,例如一個執行緒)。 LP、QP 和 MIP 解析器通常支援 LP、QP 和 MIP 解析器,但如果是 MIP 解析器,則請參閱 nodeLimit。 |
nodeLimit |
限制列舉搜尋中解決的子問題數量 (例如分支和繫結)。對許多解析器而言,這可用來決定性限制運算 (可能需要進一步設定,例如一個執行緒)。 通常適用於 MIP 解題工具,另請參閱 iterationLimit。 |
cutoffLimit |
如果解答工具無法證明沒有基本解決方案的功效至少與截止點相同,就會提早停止。 提前停靠站時,解題工具會傳回終止原因 NO_SOLUTION_FOUND 和限制 CUTOFF,不需要提供任何額外的解決方案資訊。如果沒有提早停靠站,對傳回值沒有影響。 如果您希望系統傳回目標完全為截止時間的解決方案,建議您採用容忍度。 如需更多詳細資料,以及與 bestBoundLimit 搭配使用的比較結果,請參閱使用手冊。 |
objectiveLimit |
解題工具在找到解決方案至少達到這個缺點時,就會立即停止,以終止原因並限制目標。 |
bestBoundLimit |
求解器在確認最大界限等於或等於上限後,就會立即停止。解決原因為 FEASIBLE 或 NO_SOLUTION_FOUND,並限制 OBJECTIVE。 詳情請參閱使用手冊,以及與 CutoffLimit 的比較結果。 |
solutionLimit |
在找出這個可行的解決方案後,求解器會盡早停止,產生終止原因 FEASIBLE 並限制 SOLUTION。設定時必須大於零。通常用來在第一個可行的解決方案中,使用解題工具停止解題。請注意,我們不保證任何傳回的解決方案可達到目標價值。 求解工具通常不會傳回超過解題數的上限,但這並非 MathOpt 強制實行的數目,另請參閱 b/214041169。 目前支援 Gurobi 和 SCIP,以及僅支援值為 1 的 CP-SAT。 |
threads |
設為 1 後必須大於 1。 |
randomSeed |
針對基礎解題工具中的偽隨機號碼產生器的種子。請注意,所有解題工具都會使用虛擬隨機數字來選取項目,例如 LP 演算法的擾動、處理分項規則,以及進行啟發式修正。更動會對解題工具的行為產生顯著影響。 雖然所有解題工具都有種子的概念,但有效的值取決於實際的解題工具。- 古羅比:[0:GRB_MAXINT] (截至 Gurobi 9.0 為 2x10^9)。- GSCIP:[0:2147483647] (為 MAX_INT、kint32max 或 2^31-1)。- GLOP:[0:2147483647] (同上) 在所有情況下,解題器都會收到等於:MAX(0, MIN(MAX_VALID_VALUE_FOR_SOLVER, randomSeed))。 |
absoluteGapTolerance |
MIP 解題工具的絕對最佳容忍度 (主要為)。 絕對 GAP 是指差異的絕對值:* 找到的最佳解決方案目標值 * 搜尋產生的雙重界值。當絕對 GAP 的絕對值達到絕對值 (設定時),解題工具就會停止,然後傳回 TERMINATION_REASON_OPTIMAL。 如果有設定的話,必須大於 0。 另請參閱相對 GapTolerance。 |
relativeGapTolerance |
MIP 解析器的相對最佳容忍度 (主要為)。 相對 GAP 是絕對 GAP 的正規化版本 (根據 absoluteGapTolerance 所定義),正規化與解題工具相關,例如絕對 GAP 除以最佳可行解決方案的目標價值 當相對 GAP 達到最大的相對 GapTolerance (設定時) 時,解題工具即可停止,並傳回 TERMINATION_REASON_OPTIMAL。 如果有設定的話,必須大於 0。 另請參閱 AboluteGapTolerance。 |
solutionPoolSize |
在搜尋時繼續使用 |
LPAlgorithmProto
選取用來解決線性程式的演算法。
列舉 | |
---|---|
LP_ALGORITHM_UNSPECIFIED |
|
LP_ALGORITHM_PRIMAL_SIMPLEX |
(原始) Simplex 方法,通常可以提供初級和雙重溶液、初級/雙光光束,以及基本/雙重解法。 |
LP_ALGORITHM_DUAL_SIMPLEX |
雙 Simplex 方法,通常可以提供初級和雙重溶液、初級/雙光光束,以及基本/雙重解法。 |
LP_ALGORITHM_BARRIER |
屏障,通常也稱為內部點法 (IPM)。通常可以同時提供原始和雙重解決方案。某些實作方式也會針對無限制/不可行的問題產生光線。除非基礎解題工具「跨越」,否則不會提供基礎。用 Simplex 完成 |
LP_ALGORITHM_FIRST_ORDER |
以第一順序方法為基礎的演算法。這兩種解決方案通常會同時產生原始和雙重解決方案,也可能出現原始和/或雙不可行的證書。第一順位方法通常可提供較不準確的解決方案,因此使用者必須謹慎設定解決方案品質參數 (例如容忍度) 並驗證解決方案。 |
EmphasisProto
問題在解決時套用至選用工作上的難度 (如需使用說明,請參閱 SolveParametersProto)。
強調效果用於設定解題工具功能,如下所示:* 如果解題工具不支援此功能,只有 UNSPECIFIED 會永遠有效,任何其他設定通常會產生無效的引數錯誤 (部分解題工具也可能接受 OFF)。* 如果解題工具支援此功能:- 如果設為「UNSPECIFIED」,則會使用基礎預設值。- 如果無法關閉這項功能,關閉時會傳回錯誤。- 如果此功能預設為啟用,解題工具的預設值通常會對應至 MEDIUM。- 如果系統支援此功能,「低」、「中等」、「高」和「高度」一律不會發生錯誤,而會對應到最符合的項目。
列舉 | |
---|---|
EMPHASIS_UNSPECIFIED |
|
EMPHASIS_OFF |
|
EMPHASIS_LOW |
|
EMPHASIS_MEDIUM |
|
EMPHASIS_HIGH |
|
EMPHASIS_VERY_HIGH |
ModelSolveParametersProto
JSON 表示法 |
---|
{ "variableValuesFilter": { object ( |
欄位 | |
---|---|
variableValuesFilter |
會套用至 PrimalSolutionProto 和 PrimalRayProto 變數 (PrimalSolutionProto.variable_values、PrimalRayProto.variable_values) 傳回的稀疏容器。 需求條件:* filterIds 是 VariablesProto.ids 的元素。 |
dualValuesFilter |
這個篩選器會套用至 DualSolutionProto 和 DualRay (DualSolutionProto.dual_values、DualRay.dual_values) 的所有傳回的稀疏容器。 需求條件:* filterIds 是 LinearConstraints.ids 的元素。 |
reducedCostsFilter |
套用至所有傳回 DualSolutionProto 和 DualRay (DualSolutionProto.reduced_costs、DualRay.reduced_costs) 變數傳回的稀疏容器的篩選器。 需求條件:* filterIds 是 VariablesProto.ids 的元素。 |
initialBasis |
暖啟動 Simplex LP 解題工具的選用初始基礎。如果設定,該值預期會根據目前 |
solutionHints[] |
選擇性解決方案提示。如果基礎解題工具只接受一個提示,則會使用第一個提示。 |
branchingPriorities |
選用的分支優先順序。系統會先對值較高的變數分支。未設定優先順序的變數會取得解題工具的預設優先順序 (通常為零)。 需求條件:* subingPriorities.values 必須是有限值。* subingPriorities.ids 必須是 VariablesProto.ids 的元素。 |
SparseVectorFilterProto
此訊息允許查詢/設定 SparseXxxxVector 的特定部分。預設行為不會篩除任何資料。常見的用途是查詢解決方案的某些部分 (只查詢非零的值及/或手動挑選的變數值)。
JSON 表示法 |
---|
{ "skipZeroValues": boolean, "filterByIds": boolean, "filteredIds": [ string ] } |
欄位 | |
---|---|
skipZeroValues |
適用於 SparseBoolVectorProto「0」為 |
filterByIds |
如果設為 true,只會傳回已篩選 ID 中 ID 的值。 |
filteredIds[] |
filterByIds 為 true 時要使用的 ID 清單。如果 filterByIds 為 false,則必須留空。注意:如果此屬性為空白,且 filterByIds 為 true,就表示您想要結果不想要任何資訊。 |
BasisProto
線性節目解決方案的組合特性。
解決線性程式的簡單方法一律會傳回「基本可行的解決方案」這可能會由基礎結合來描述基礎會為每個變數和線性限制指派 BasisStatusProto。
例如:請考慮使用標準格式 LP:min c * x s.t* x = b x >= 0 的變數比限制多,且整列排名 A。
n 為變數數量,以及線性限制的 m 數量。這個問題的有效基礎設計如下:* 所有限制條件的基準狀態皆為「已修正」。* 挑選 m 變數,讓 A 欄以線性獨立的方式指派狀態,並指派「基本」狀態。* 為其餘的 n 至 m 變數指定 AT_LOWER 狀態。
這個基礎的基本解決方案是 A * x = b 的唯一解決方案,所有狀態的變數皆為 AT_LOWER 的下限 (全部零)。如果解決方案同時符合 x >= 0,則產生的解決方案即稱為基本可行解決方案。
JSON 表示法 |
---|
{ "constraintStatus": { object ( |
欄位 | |
---|---|
constraintStatus |
限制依據狀態。 需求條件:* constraintStatus.ids 等於 LinearConstraints.ids。 |
variableStatus |
變數基礎狀態。 需求條件:* constraintStatus.ids 等於 VariablesProto.ids。 |
basicDualFeasibility |
MathOpt 採用這項進階功能,目的是說明不理想到達網頁解決方案的可行性 (最佳解決方案狀態一律為 SOLUTION_STATUS_FEASIBLE)。 單面 LP 的可行性狀態應與相關雙解決方案的可行狀態相同。如果是雙面 LP,在某些極端情況下可能會有所不同 (例如使用基本 id 解決不完整的問題)。 如果您透過 ModelResolveParametersProto.initial_basis 來提供起始值,系統會忽略此值。這個屬性只與 SolutionProto.basis 傳回的基礎相關。 |
SparseBasisStatusVector
以稀疏方式呈現基礎狀態向量。
JSON 表示法 |
---|
{
"ids": [
string
],
"values": [
enum ( |
欄位 | |
---|---|
ids[] |
必須以所有元素分別排序 (依遞增順序排列)。 |
values[] |
長度必須與 ID 相同。 |
BasisStatusProto
到達網頁中的變數/限制狀態。
列舉 | |
---|---|
BASIS_STATUS_UNSPECIFIED |
代表沒有狀態的防護值。 |
BASIS_STATUS_FREE |
變數/限制是免費的 (沒有有限的邊界)。 |
BASIS_STATUS_AT_LOWER_BOUND |
變數/限制在其下限 (必須是有限的) 範圍內。 |
BASIS_STATUS_AT_UPPER_BOUND |
變數/限制在其上下限 (必須是有限的)。 |
BASIS_STATUS_FIXED_VALUE |
變數/限制的下限與上限相同。 |
BASIS_STATUS_BASIC |
變數/限制為基本版。 |
SolutionStatusProto
解題工具請求的原始或雙重解決方案的可行性。
列舉 | |
---|---|
SOLUTION_STATUS_UNSPECIFIED |
代表沒有狀態的防護值。 |
SOLUTION_STATUS_UNDETERMINED |
解題工具未聲明可行性狀態。 |
SOLUTION_STATUS_FEASIBLE |
解題工具宣稱解決方案是可行的。 |
SOLUTION_STATUS_INFEASIBLE |
解題工具覺得解決方案不可行。 |
SolutionHintProto
解題工具建議的起始解決方案。
MIP 解題工具通常只想要基本資訊 (variableValues
),而 LP 解析器則同時需要原始和雙資訊 (dualValues
)。
許多 MIP 解析器都能夠配合:(1) 未指定所有變數的部分解決方案,或 (2) 不可行的解決方案。在這種情況下,解題工具通常會解開子 MIP 來完成/修正提示。
解題工具使用提示的方式 (如果有的話) 會極為取決於解題工具、問題類型和使用的演算法。要確保提示發揮效果,最可靠的方式就是讀取包含及沒有提示的基礎解題工具記錄。
以 Simplex 為基礎的 LP 解題工具通常偏好以初始為基準,而非解決方案提示 (否則需要交叉連結,才能將提示轉換成基本的可行解決方案)。
JSON 表示法 |
---|
{ "variableValues": { object ( |
欄位 | |
---|---|
variableValues |
可能將部分值指派給問題的主要變數。這個子訊息的解題工具無關要求如下:*variableValues.ids 是 VariablesProto.ids 的元素。* varValues.values 必須全部為有限值。 |
dualValues |
(可能部分) 將值指派給問題的線性限制。 需求:*DualValues.ids 是 LinearConstraintsProto.ids 的元素。* DoubleValues.values 必須全部為有限值。 |
SparseInt32VectorProto
整數向量的稀疏表示法。
JSON 表示法 |
---|
{ "ids": [ string ], "values": [ integer ] } |
欄位 | |
---|---|
ids[] |
應排序 (依遞增順序排列),且所有元素都不同。 |
values[] |
長度必須與 ID 相同。 |
SolveResultProto
初級/雙重溶液/光柵輪廓相當複雜,如需完整的說明,請參閱 deprecation_reasons.md。
在確切的合約確定之前,最好只檢查是否已有解決方案/光線,而非依賴終止原因。
JSON 表示法 |
---|
{ "termination": { object ( |
欄位 | |
---|---|
termination |
解題工具停止的原因。 |
solutions[] |
未來解題者應採取的解決方案順序,通常是按以下順序排列:1.提供基本可行解決方案的解決方案 (按最佳原始目標排序)。2. 解決方案的雙重可行解決方案,按最佳雙重目標排序 (未知的雙重目標最糟) 3.其餘解決方案則能以任何順序傳回。 |
primalRays[] |
無限制基元改進的方法,或同樣是雙無能力憑證的指引。通常針對 TerminationReasonProtos UNBOUNDED 和 DUAL_INFEASIBLE 提供 |
dualRays[] |
無限制的雙重改進方向,或同等的原始無能力憑證。通常為 TerminationReasonProto INFEASIBLE 提供。 |
solveStats |
解開程序的統計資料,例如反覆實驗 |
TerminationProto
所有與 Solve() 呼叫都終止相關的所有資訊。
JSON 表示法 |
---|
{ "reason": enum ( |
欄位 | |
---|---|
reason |
值是 TERMINATION_REASON_FEASIBLE 或 TERMINATION_REASON_NO_SOLUTION_FOUND 時,在 |
limit |
除非是 TERMINATION_REASON_FEASIBLE 或 TERMINATION_REASON_NO_SOLUTION_FOUND,否則為 LIMIT_UNSPECIFIED。並非所有解題工具都能夠判斷導致終止的限制,如果無法確定原因,就會使用 LIMIT_UNDETERMINED。 |
detail |
與終止相關的其他一般解題工具專屬資訊。 |
problemStatus |
原始和雙重問題的可行狀態。截至 2023 年 7 月 18 日為止,這則訊息可能已缺少。如果缺少,可在 SolveResultProto.solve_stats 中找到 issueStatus。 |
objectiveBounds |
最佳目標價值之界限。截至 2023 年 7 月 18 日為止,這則訊息可能已缺少。如果缺少此項目,您可以前往 SolveResultProto.solve.stats.best_primal_bound 和 goalsBounds.dual_bound 找到 SolveResultProto.solve.stats.best_dual_bound。 |
TerminationReasonProto
對 Solve() 的呼叫終止的原因。
列舉 | |
---|---|
TERMINATION_REASON_UNSPECIFIED |
|
TERMINATION_REASON_OPTIMAL |
研究發現一個經證實有效的解決方案 (最多可達數值容錯)。 |
TERMINATION_REASON_INFEASIBLE |
原始問題沒有可行的解決方案。 |
TERMINATION_REASON_UNBOUNDED |
原始問題是可行的,並且可在原始問題中找到非凡的理想解決方法。 |
TERMINATION_REASON_INFEASIBLE_OR_UNBOUNDED |
原始問題是無法避免或毫無限制的。如需問題狀態的詳細資訊,請前往 findStats.problem_status。請注意,Grobi 的不受限狀態可在此對應。 |
TERMINATION_REASON_IMPRECISE |
問題已解決為以上其中一個條件 (最理想、不可行、不受限或無法限製或無法遵守),但不符合一或多項容忍要求。確實存在一些原始/雙重解法/射線,但它們略有不可行,或者 (如果問題是幾乎無法解決的),則可能是最佳解決方案目標與最佳解決方案之間有落差。 使用者仍可查詢原始/雙重解法/光線以及解法統計資料,但必須負責處理數值不精確的情況。 |
TERMINATION_REASON_FEASIBLE |
最佳化工具達到某種限制,並傳回最可能可行的解決方案。請參閱 SolveResultProto.limit_detail 的詳細說明。 |
TERMINATION_REASON_NO_SOLUTION_FOUND |
最佳化工具已達到某種限制,但並未找到真正可行的解決方案。請參閱 SolveResultProto.limit_detail 的詳細說明。 |
TERMINATION_REASON_NUMERICAL_ERROR |
演算法發生無法復原的數字錯誤,因此已停止。無法提供解決方案資訊。 |
TERMINATION_REASON_OTHER_ERROR |
上述定義狀態未涵蓋錯誤,因此演算法已停止。無法提供解決方案資訊。 |
LimitProto
當 TerminationReasonProto FEASIBLE 或 NO_SOLUTION_FOUND 的情況下提早停止 Solve()。
列舉 | |
---|---|
LIMIT_UNSPECIFIED |
在非超出限制的情況下 (例如 TERMINATION_REASON_OPTIMAL) 時,此值會是 null。 |
LIMIT_UNDETERMINED |
基礎解題工具不會公開達到哪個上限。 |
LIMIT_ITERATION |
在達到疊代次數上限 (例如 Simplex 或門檻疊代) 後,即停止疊代演算法。 |
LIMIT_TIME |
演算法在使用者指定的計算時間之後停止。 |
LIMIT_NODE |
分支版本和繫結演算法已停止,因為探索了分支和繫結樹狀結構的節點數量上限。 |
LIMIT_SOLUTION |
演算法已找到必要數量所需的解決方案,因此已停止。通常在 MIP 中使用,可讓解題工具傳回第一個可行的解決方案。 |
LIMIT_MEMORY |
演算法用盡記憶體,因此已停止。 |
LIMIT_CUTOFF |
該解題工具是在目標執行時以截斷方式執行 (例如設定了 SolveParameters.cutoff_limit)。使用者不需要任何解決方案都比截止日期差,因此解題工具並沒有至少與截止點差不多的解決方案。通常我們不會再提供解決方案資訊。 |
LIMIT_OBJECTIVE |
演算法找到解決方案或範圍超出使用者設定的限制,因此已停止 (請參閱 SolveParameters.objective_limit 和 SolveParameters.best_bound_limit)。 |
LIMIT_NORM |
演算法已停止,因為疊代常規變得太大。 |
LIMIT_INTERRUPTED |
演算法因中斷信號或使用者中斷要求而停止。 |
LIMIT_SLOW_PROGRESS |
演算法無法繼續推動解決方案,因此已停止。 |
LIMIT_OTHER |
演算法因超出上述任一限制的限製而停止。請注意,當系統無法判斷原因時,會使用 LIMIT_UNDETERMINED,而在已知原因但不適合上述任一替代項目時使用 LIMIT_OTHER。 TerminationProto.detail 可能包含限制的其他資訊。 |
ProblemStatusProto
原始問題的可行狀態,以及解題工具聲明的雙重 (或持續放鬆) 狀態。解題工具無須針對請求傳回憑證 (例如,解題工具可能要求取得基本可行性,而不傳回真正可行的解決方案)。結合這個狀態,詳盡說明解題工具對於解題可行性和無限制的聲明。舉例來說:
- 出現原始和雙重問題的可行狀態,代表原始和受限是可行的,且可能擁有最佳解決方案 (保證沒有線性限制的問題)。
- 最為可行的雙重不可行狀態則代表原始問題未受限 (亦即有各種較佳的解決方案)。
請注意,單獨無法實現的狀態 (即與原始狀態無法確定的同時) 並不表示原始問題無拘無束,因為我們都可能面臨兩個問題都不可能。此外,雖然基本和雙人可行狀態可能代表最佳解決方案確實存在,但這無法保證解決方案確實有找到最佳解決方案。
JSON 表示法 |
---|
{ "primalStatus": enum ( |
欄位 | |
---|---|
primalStatus |
原始問題狀態。 |
dualStatus |
雙問題狀態 (或是兩個連續放鬆的狀態)。 |
primalOrDualInfeasible |
如果設為 true,解題工具聲稱出基本或雙重問題是不可行,但卻不知道哪一個問題 (或兩者都不可行)。只有在 primal_problem_status = two_problem_status = kUndefinedd 時才能設為 true。當預先處理程序判定沒有最佳解決方案時,通常需要提供這些額外資訊 (但無法判斷問題是不可行、無限制,或兩者皆有)。 |
FeasibilityStatusProto
解題工具已聲明擁有權的問題可行性狀態 (即使是理賠之外,無須退還索賠憑證)。
列舉 | |
---|---|
FEASIBILITY_STATUS_UNSPECIFIED |
代表沒有狀態的防護值。 |
FEASIBILITY_STATUS_UNDETERMINED |
求解工具無法聲明狀態。 |
FEASIBILITY_STATUS_FEASIBLE |
解題工具宣稱問題是可行的。 |
FEASIBILITY_STATUS_INFEASIBLE |
解決方案宣稱這是不可行的。 |
ObjectiveBoundsProto
最佳目標價值之界限。
JSON 表示法 |
---|
{ "primalBound": number, "dualBound": number } |
欄位 | |
---|---|
primalBound |
求解器宣稱最佳值等於或大於 (最小化可最小化,以最大化為最大化) primalBound 至解析能力容忍度 (請見下方警告):* primalBound 表示較低 (+inf 表示最小化和 -inf 最大化),如果解析器未宣稱有這類下限,* primalBound 與最佳原始可行解決方案的目標相比,可能更接近最佳值。尤其是,即使未傳回任何基本可行的解決方案,primalBound 也可能是非常重要的。警告:確切的說法是,已有基本解方:* 是可行的 (即能達到解容器容忍度),而 * 具有目標值 primalBound。這種可行的解決方案有點可行,此時 primalBound 比最佳值更勝一籌。將原始可行性容忍度轉譯成 primalBound 的容忍度並不重要,尤其是在可行性容忍度相對較大的時(例如透過 PDLP 解決)。 |
dualBound |
求解器宣稱最佳值等於或更差 (以最小化為最大,以最大化為最大度而言小於) 的雙重邊界 (請見下方警告):*DualBound 是十分簡單的 (-inf 適用於最小化和 +inf 最大化),如果解題器未宣稱有這樣的限制,與 primalBound 類似,某些解題工具即使傳回最佳結果,也可能會發生這種情形。如果 MIP 解題工具不正確,通常仍會回報邊界。* 針對持續發生問題,DualBound 可能比最佳雙可行解決方案的目標更接近最佳價值。對 MIP 而言,DualBound 第一個不重要的值之一,通常是 MIP 到達網頁放鬆的最佳價值。* DualBound 應比 primalBound 與解析器容忍度更出色 (最小化應小於下限,以最大化為最大)。警告:* 如果出現問題持續發生,確切指的是現有的雙重解決方案:* 可以數值 (也就是可達到解容器容忍度),* 則具有目標值 ualBound 值。這種可行的解決方案有點可行,在此情況下,DualBound 可能比最佳值和 primalBound 更明顯。與原始案例類似,將雙可行容忍度轉譯成 DoubleBound 容忍度並不重要,尤其是在可行容忍度相對很大的情況下。但部分解題工具提供修正後的 DoubleBound 版本,可能比數字更安全。這個修正版本可透過解題工具的特定輸出內容存取 (例如 PDLP、pdlp_output.convergence_information.更正 ed_dual_objective)。* 對 MIP 解題工具而言,DualBound 可能與雙重解決方案相關聯 (例如 LP 放寬),但這通常會導致解題工具執行的作業相當複雜,而且通常不如 LP 解題工具回報的範圍。 |
SolutionProto
解決方案包含的內容取決於問題種類和解題工具。目前的常見模式為 1。MIP 解題工具只會傳回基本解。2. Simplex LP 解題工具通常會傳回基本模式,以及與這個基礎相關的基本和雙重解決方案。3. 其他持續的解題工具通常會傳回基本和雙重解決方案,而且基本和雙重解決方案必須以解題器相依的方式連結。
必要條件:* 至少必須設定一個欄位;解決方案不得留空
JSON 表示法 |
---|
{ "primalSolution": { object ( |
欄位 | |
---|---|
primalSolution |
|
dualSolution |
|
basis |
|
PrimalSolutionProto
最佳化問題的解決方案。
例如:不妨考慮使用簡單的線性程式:分鐘 * x s.tA * x >= b x >= 0。基本解法是將值指派給 x。如果符合上述參數的 A * x >= b 和 x x 0 皆等於 0,即為可行。下方訊息中的 PrimalSolutionProto 訊息,variableValues 為 x, goalValue 為 c * x。
JSON 表示法 |
---|
{ "variableValues": { object ( |
欄位 | |
---|---|
variableValues |
需求條件:*variableValues.ids 是 VariablesProto.ids 的元素。* varValues.values 必須全部為有限值。 |
objectiveValue |
由基礎解題工具計算的目標值。不得為無限或 NaN。 |
auxiliaryObjectiveValues |
由基礎解題工具計算出的輔助目標值。鍵必須是有效的輔助目標 ID。值不得為無限或 NaN。 這個物件中包含 |
feasibilityStatus |
根據基礎解題工具提供的解決方案可行性狀態。 |
DualSolutionProto
最佳化問題雙重的解決方案。
例如:請將原始雙對線性程式組合:(雙) (雙) 最小值 c * x 最大 b * y s.t.A * x >= b.t.y * A + r = c x >= 0 y,r >= 0。雙邊解為 y (y、r)。如果系統符合上述「雙重」的限制,即是可行的。
在以下訊息中,y 是 TwoValues,r 降低成本,b * y 則是目標值。
JSON 表示法 |
---|
{ "dualValues": { object ( |
欄位 | |
---|---|
dualValues |
需求條件:*DualValues.ids 是 LinearConstraints.ids 的元素。* DoubleValues.values 必須全部為有限值。 |
reducedCosts |
需求條件:* lowCosts.ids 是 VariablesProto.ids 的元素。* lowCosts.values 必須全部為有限值。 |
feasibilityStatus |
根據基礎解題工具提供的解決方案可行性狀態。 |
objectiveValue |
|
PrimalRayProto
改進最佳化問題方向同理可證,這是兩個最佳化問題 有兩個不可使用的證明。
例如:不妨考慮使用簡單的線性程式:分鐘 * x s.tA * x >= b x >= 0 A 初級光是符合 c * x < 的 x0 A * x >= 0 x >= 0 觀察指出有可行的解決方案,任何基底的正倍數加上該解決方案的正倍數仍是可行的,並且提供更理想的目標價值。原始光影也證明雙重最佳化問題是不可行的。
下方訊息中的 PrimalRay 是 x。
JSON 表示法 |
---|
{
"variableValues": {
object ( |
欄位 | |
---|---|
variableValues |
需求條件:*variableValues.ids 是 VariablesProto.ids 的元素。* varValues.values 必須全部為有限值。 |
DualRayProto
一個最佳化的雙重改進方向;等同具有刑事不可抗力的證明
例如:請將原始雙對線性程式組合:(雙) (雙) 最小值 c * x 最大 b * y s.t.A * x >= b.t.y * A + r = c x >= 0 y,r >= 0。雙光為配對 (y, r) 即滿足:b * y >0 y * A + r = 0 y、r >= 0 觀察結果,將正數倍數 (y, r) 加到雙可行解決方案中,可維持雙重可行性並且提高目標 (證明雙數沒有限制)。而且雙光證明犯罪問題是無法避免的。
在下方的訊息 DualRay 中,y 是 twoValues,r 則減少了成本。
JSON 表示法 |
---|
{ "dualValues": { object ( |
欄位 | |
---|---|
dualValues |
需求條件:*DualValues.ids 是 LinearConstraints.ids 的元素。* DoubleValues.values 必須全部為有限值。 |
reducedCosts |
需求條件:* lowCosts.ids 是 VariablesProto.ids 的元素。* lowCosts.values 必須全部為有限值。 |
SolveStatsProto
JSON 表示法 |
---|
{
"solveTime": string,
"problemStatus": {
object ( |
欄位 | |
---|---|
solveTime |
經過 math_opt 由 math_opt 測量的經過實時時鐘時間,大約是 Solver::Solve() 的期間。注意:這不包含模型建構完成的工作。 持續時間以秒為單位,最多 9 個小數位數,結尾為「 |
problemStatus |
原始和雙重問題的可行狀態。 |
simplexIterations |
|
barrierIterations |
|
firstOrderIterations |
|
nodeCount |
|