Method: mathopt.solveMathOptModel

Giải mô hình đầu vào và trả về kết quả cùng lúc. Hãy sử dụng phương pháp này khi bạn không cần lệnh gọi lại, mức độ gia tăng và không cần theo dõi tiến trình giải quyết.

Yêu cầu HTTP

POST https://optimization.googleapis.com/v1/mathopt:solveMathOptModel

URL sử dụng cú pháp Chuyển mã gRPC.

Nội dung yêu cầu

Nội dung yêu cầu chứa dữ liệu có cấu trúc sau:

Biểu diễn dưới dạng JSON
{
  "solverType": enum (SolverTypeProto),
  "model": {
    object (ModelProto)
  },
  "parameters": {
    object (SolveParametersProto)
  },
  "modelParameters": {
    object (ModelSolveParametersProto)
  }
}
Trường
solverType

enum (SolverTypeProto)

Không bắt buộc. Loại trình giải để giải bài toán này dưới dạng số. Lưu ý rằng nếu một trình giải không hỗ trợ một tính năng cụ thể trong mô hình, thì quy trình tối ưu hoá sẽ không thành công.

model

object (ModelProto)

Bắt buộc. Một biểu diễn toán học của bài toán tối ưu hoá cần giải.

parameters

object (SolveParametersProto)

Không bắt buộc. Các tham số để kiểm soát một lượt giải một lần. Thông số enableOutput được xử lý riêng. Đối với những trình giải quyết hỗ trợ lệnh gọi lại thông báo, nếu bạn đặt giá trị này thành true, thì máy chủ sẽ đăng ký một lệnh gọi lại thông báo. Thông báo kết quả sẽ được trả về trong SolveMathOptModelResponse.messages. Đối với những trình giải toán khác, việc đặt enableOutput thành true sẽ dẫn đến lỗi.

modelParameters

object (ModelSolveParametersProto)

Không bắt buộc. Các tham số để kiểm soát một phép giải duy nhất dành riêng cho mô hình đầu vào (xem SolveParametersProto để biết tham số độc lập của mô hình).

Nội dung phản hồi

Câu trả lời cho bài giải từ xa đơn phân trong MathOpt.

Nếu thành công, phần nội dung phản hồi sẽ chứa dữ liệu có cấu trúc sau:

Biểu diễn dưới dạng JSON
{
  "result": {
    object (SolveResultProto)
  },
  "messages": [
    string
  ]
}
Trường
result

object (SolveResultProto)

Nội dung mô tả kết quả của việc giải quyết mô hình trong yêu cầu.

messages[]

string

Nếu bạn sử dụng SolveParametersProto.enable_output, thì bảng này sẽ chứa thông điệp nhật ký cho những trình giải quyết hỗ trợ lệnh gọi lại thông báo.

SolverTypeProto

Những trình giải mà MathOpt hỗ trợ.

Enum
SOLVER_TYPE_UNSPECIFIED
SOLVER_TYPE_GSCIP

Giải quyết trình giải mã chương trình số nguyên ràng buộc (SCIP) (bên thứ ba).

Hỗ trợ LP, MIP và các bài toán bậc hai số nguyên không lồi. Tuy nhiên, dữ liệu kép cho LP không được trả về. Ưu tiên GLOP cho LP.

SOLVER_TYPE_GUROBI

Trình giải Gurobi (bên thứ ba).

Hỗ trợ LP, MIP và các bài toán bậc hai số nguyên không lồi. Nhìn chung là lựa chọn nhanh nhất nhưng có quy trình cấp phép đặc biệt.

SOLVER_TYPE_GLOP

Công cụ giải quyết Glop của Google.

Hỗ trợ LP bằng các phương thức đơn giản nguyên thuỷ và đơn giản kép.

SOLVER_TYPE_CP_SAT

Trình giải quyết CP-SAT của Google.

Hỗ trợ các vấn đề trong đó tất cả biến đều là số nguyên và bị ràng buộc (hoặc được ngụ ý sau khi presolve). Hỗ trợ thử nghiệm để điều chỉnh quy mô và tách biệt các bài toán bằng các biến liên tục.

SOLVER_TYPE_PDLP

Trình giải quyết PDLP của Google.

Hỗ trợ các mục tiêu bậc hai đường chéo LP và lồi. Sử dụng các phương thức thứ tự đầu tiên thay vì đơn giản. Có thể giải quyết các vấn đề rất lớn.

SOLVER_TYPE_GLPK

Bộ lập trình tuyến tính GNU (GLPK) (bên thứ ba).

Hỗ trợ MIP và LP.

An toàn luồng: GLPK sử dụng bộ nhớ cục bộ luồng để phân bổ bộ nhớ. Do đó, bạn phải huỷ bỏ các thực thể của Trình giải quyết trên cùng một luồng khi chúng được tạo, nếu không GLPK sẽ gặp sự cố. Bạn có thể gọi Solver::Solve() từ một luồng khác ngoài luồng được dùng để tạo Trình giải toán nhưng không được GLPK ghi lại và nên tránh.

Khi giải một LP bằng trình giải sẵn, hàm giải pháp (và các tia không liên kết) chỉ được trả về nếu đã tìm được một nghiệm tối ưu. Nếu không, bạn sẽ không được trả về kết quả nào. Xem glpk-5.0/doc/glpk.pdf page #40 có sẵn từ glpk-5.0.tar.gz để biết chi tiết.

SOLVER_TYPE_OSQP

Trình giải toán của Chương trình bậc hai chia tách toán tử (OSQP) (bên thứ ba).

Hỗ trợ các bài toán liên tục có các điều kiện ràng buộc tuyến tính và mục tiêu bậc hai tuyến tính hoặc lồi. Sử dụng phương thức bậc nhất.

SOLVER_TYPE_ECOS

Embedded Conic Solver (ECOS) (bên thứ ba).

Hỗ trợ các vấn đề về LP và SOCP. Sử dụng phương thức điểm bên trong (rào cản).

SOLVER_TYPE_SCS

Trình giải toán chia tách conic (SCS) (bên thứ ba).

Hỗ trợ các vấn đề về LP và SOCP. Sử dụng phương thức bậc nhất.

SOLVER_TYPE_HIGHS

HiGHS Solver (bên thứ ba).

Hỗ trợ các vấn đề LP và MIP (QP lồi chưa được triển khai).

SOLVER_TYPE_SANTORINI

Tài liệu tham khảo về cách triển khai trình giải mã MIP của MathOpt.

Chậm/không nên dùng cho phiên bản phát hành công khai. Không phải là trình giải LP (không trả về thông tin kép).

ModelProto

Vấn đề về tối ưu hoá. MathOpt hỗ trợ: – Biến quyết định liên tục và số nguyên có giới hạn hữu hạn không bắt buộc. – Các mục tiêu tuyến tính và mục tiêu bậc hai (một hoặc nhiều mục tiêu), ở mức tối thiểu hoặc tối đa hoá. – Một số loại ràng buộc, bao gồm: * Giới hạn tuyến tính * Giới hạn bậc hai * Ràng buộc nón bậc hai * Ràng buộc logic > Các hạn chế đối với SOS1 và SOS2 > Các hạn chế đối với chỉ báo

Theo mặc định, các điều kiện ràng buộc được thể hiện bằng mã "id-to-data" Maps. Tuy nhiên, chúng tôi biểu diễn các quy tắc ràng buộc tuyến tính trong một "cấu trúc mảng" hiệu quả hơn .

Biểu diễn dưới dạng JSON
{
  "name": string,
  "variables": {
    object (VariablesProto)
  },
  "objective": {
    object (ObjectiveProto)
  },
  "auxiliaryObjectives": {
    string: {
      object (ObjectiveProto)
    },
    ...
  },
  "linearConstraints": {
    object (LinearConstraintsProto)
  },
  "linearConstraintMatrix": {
    object (SparseDoubleMatrixProto)
  },
  "quadraticConstraints": {
    string: {
      object (QuadraticConstraintProto)
    },
    ...
  },
  "secondOrderConeConstraints": {
    string: {
      object (SecondOrderConeConstraintProto)
    },
    ...
  },
  "sos1Constraints": {
    string: {
      object (SosConstraintProto)
    },
    ...
  },
  "sos2Constraints": {
    string: {
      object (SosConstraintProto)
    },
    ...
  },
  "indicatorConstraints": {
    string: {
      object (IndicatorConstraintProto)
    },
    ...
  }
}
Trường
name

string

variables

object (VariablesProto)

objective

object (ObjectiveProto)

Mục tiêu chính trong mô hình.

auxiliaryObjectives

map (key: string (int64 format), value: object (ObjectiveProto))

Mục tiêu phụ để sử dụng trong các mô hình đa mục tiêu.

Mã khoá ánh xạ phải nằm trong [0, max(int64)). Mỗi mức độ ưu tiên và mỗi tên không trống phải là duy nhất và cũng phải khác biệt với objective chính.

Một đối tượng chứa danh sách các cặp "key": value. Ví dụ: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

linearConstraints

object (LinearConstraintsProto)

linearConstraintMatrix

object (SparseDoubleMatrixProto)

Hệ số biến cho các ràng buộc tuyến tính.

Nếu một biến có liên quan đến quy tắc ràng buộc này bị xoá, thì biến đó sẽ được xử lý như thể được đặt thành 0.

Yêu cầu: * * tuyến tínhConstraintMatrix.column_ids là phần tử của biến.ids. * Các mục nhập ma trận không được chỉ định là 0. * tất cả tuyến tínhConstraintMatrix.values phải là hữu hạn.

quadraticConstraints

map (key: string (int64 format), value: object (QuadraticConstraintProto))

Các ràng buộc bậc hai trong mô hình.

Một đối tượng chứa danh sách các cặp "key": value. Ví dụ: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

secondOrderConeConstraints

map (key: string (int64 format), value: object (SecondOrderConeConstraintProto))

Các ràng buộc đối với hình nón bậc hai trong mô hình.

Một đối tượng chứa danh sách các cặp "key": value. Ví dụ: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

sos1Constraints

map (key: string (int64 format), value: object (SosConstraintProto))

Các điều kiện ràng buộc của SOS1 trong mô hình. Các điều kiện này ràng buộc rằng tối đa một expression có thể khác 0. Các mục weights không bắt buộc là thông tin triển khai mà trình giải quyết sử dụng để (hy vọng) hội tụ nhanh hơn. Cụ thể hơn, trình giải quyết có thể (hoặc không) sử dụng các trọng số này để chọn các quyết định phân nhánh tạo ra sự "cân bằng" nút con.

Một đối tượng chứa danh sách các cặp "key": value. Ví dụ: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

sos2Constraints

map (key: string (int64 format), value: object (SosConstraintProto))

Các điều kiện ràng buộc SOS2 trong mô hình. Các điều kiện này ràng buộc rằng tối đa hai phần tử của expression có thể khác 0 và các phần tử này phải nằm gần nhau theo thứ tự. Nếu bạn không cung cấp weights, thì thứ tự này sẽ là thứ tự tuyến tính của chúng trong danh sách expressions; nếu xuất hiện weights, các giá trị này sẽ được sắp xếp theo thứ tự tăng dần.

Một đối tượng chứa danh sách các cặp "key": value. Ví dụ: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

indicatorConstraints

map (key: string (int64 format), value: object (IndicatorConstraintProto))

Các hạn chế đối với chỉ báo trong mô hình thực thi việc đó, nếu là một "biến chỉ báo" nhị phân được đặt thành một, sau đó là "quy tắc ràng buộc ngụ ý" phải giữ.

Một đối tượng chứa danh sách các cặp "key": value. Ví dụ: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

VariablesProto

Như sử dụng bên dưới, chúng tôi định nghĩa "#variables" = kích thước(VariablesProto.ids).

Biểu diễn dưới dạng JSON
{
  "ids": [
    string
  ],
  "lowerBounds": [
    number
  ],
  "upperBounds": [
    number
  ],
  "integers": [
    boolean
  ],
  "names": [
    string
  ]
}
Trường
ids[]

string (int64 format)

Phải có giá trị không âm và tăng hoàn toàn. Bạn không thể sử dụng giá trị max(int64).

lowerBounds[]

number

Phải có độ dài bằng #variables, các giá trị trong [-inf, inf).

upperBounds[]

number

Phải có độ dài bằng #variables, các giá trị trong (-inf, inf].

integers[]

boolean

Phải có độ dài bằng #variables. Giá trị là false đối với biến liên tục và true đối với biến số nguyên.

names[]

string

Nếu bạn không đặt chính sách này, giá trị được giả định là toàn bộ chuỗi trống. Nếu không, tên biến phải có độ dài bằng #variables.

Tất cả tên không trống phải khác biệt.

ObjectiveProto

Biểu diễn dưới dạng JSON
{
  "maximize": boolean,
  "offset": number,
  "linearCoefficients": {
    object (SparseDoubleVectorProto)
  },
  "quadraticCoefficients": {
    object (SparseDoubleMatrixProto)
  },
  "name": string,
  "priority": string
}
Trường
maximize

boolean

false là thu nhỏ, true là phóng to

offset

number

Phải là hữu hạn chứ không phải là NaN.

linearCoefficients

object (SparseDoubleVectorProto)

Những số hạng GOALProto tuyến tính trong biến quyết định.

Yêu cầu: * * VariablesProto không được chỉ định tương ứng với 0. * Tuyến tínhHệ số.giá trị phải là hữu hạn. * tuyến tínhHệ số.giá trị có thể bằng 0, nhưng điều này sẽ làm lãng phí không gian.

quadraticCoefficients

object (SparseDoubleMatrixProto)

Những thuật ngữ khách quan có phương trình bậc hai trong biến quyết định.

Các yêu cầu bên cạnh những yêu cầu đối với thông báo SparseDoubleMatrixProto: * Mỗi phần tử của quadraticCoefficients.row_ids và mỗi phần tử của quadraticCoefficients.column_ids phải là một phần tử của VariablesProto.ids. * Ma trận phải là tam giác trên: đối với mỗi i, quadraticCoefficients.row_ids[i] <= quadraticCoefficients.column_ids[i].

Lưu ý: * Những cụm từ không được lưu trữ rõ ràng sẽ có hệ số bằng 0. * Các phần tử của quadraticCoefficients.coefficients có thể bằng 0, nhưng điều này chỉ làm lãng phí không gian.

name

string

Thông báo gốc có thể có các yêu cầu về tính duy nhất đối với trường này; Ví dụ: xem ModelProto.objectives và AuxiliaryTargetsUpdatesProto.new_objectives.

priority

string (int64 format)

Đối với bài tập đa mục tiêu, mức độ ưu tiên của mục tiêu này so với các mục tiêu khác (thấp hơn quan trọng hơn). Giá trị này không được là số âm. Hơn nữa, mỗi mức độ ưu tiên của mục tiêu trong mô hình phải có sự khác biệt tại thời điểm giải quyết. Điều kiện này không được xác thực ở cấp proto, vì vậy, các mô hình có thể tạm thời có các mục tiêu với cùng mức độ ưu tiên.

SparseDoubleVectorProto

Một biểu diễn thưa của vectơ kép đôi.

Biểu diễn dưới dạng JSON
{
  "ids": [
    string
  ],
  "values": [
    number
  ]
}
Trường
ids[]

string (int64 format)

Phải được sắp xếp (theo thứ tự tăng dần) với tất cả các phần tử riêng biệt.

values[]

number

Phải có độ dài bằng mã nhận dạng. Có thể không chứa NaN.

SparseDoubleMatrixProto

Một đại diện thưa thớt của ma trận kép.

Ma trận được lưu trữ dưới dạng bộ ba gồm mã hàng, mã cột và hệ số. Ba vectơ này phải có độ dài bằng nhau. Đối với tất cả i, bộ dữ liệu (rowIds[i], columnIds[i]) phải khác biệt. Các mục nhập phải theo thứ tự lớn trong hàng.

Biểu diễn dưới dạng JSON
{
  "rowIds": [
    string
  ],
  "columnIds": [
    string
  ],
  "coefficients": [
    number
  ]
}
Trường
rowIds[]

string (int64 format)

columnIds[]

string (int64 format)

coefficients[]

number

Có thể không chứa NaN.

LinearConstraintsProto

Như được sử dụng dưới đây, chúng tôi định nghĩa "#giới hạn tuyến tính" = kích thước(LinearConstraintsProto.ids).

Biểu diễn dưới dạng JSON
{
  "ids": [
    string
  ],
  "lowerBounds": [
    number
  ],
  "upperBounds": [
    number
  ],
  "names": [
    string
  ]
}
Trường
ids[]

string (int64 format)

Phải có giá trị không âm và tăng hoàn toàn. Bạn không thể sử dụng giá trị max(int64).

lowerBounds[]

number

Phải có độ dài bằng #tuyến tính, các giá trị trong [-inf, inf).

upperBounds[]

number

Phải có độ dài bằng #tuyến tính, các giá trị trong (-inf, inf].

names[]

string

Nếu bạn không đặt chính sách này, giá trị được giả định là toàn bộ chuỗi trống. Nếu không, phải có độ dài bằng #tuyến tính.

Tất cả tên không trống phải khác biệt.

QuadraticConstraintProto

Điều kiện ràng buộc bậc hai có dạng: lb <= sum{linearTerms} + sum{quadraticTerms} <= ub.

Nếu một biến có liên quan đến quy tắc ràng buộc này bị xoá, thì biến đó sẽ được xử lý như thể được đặt thành 0.

Biểu diễn dưới dạng JSON
{
  "linearTerms": {
    object (SparseDoubleVectorProto)
  },
  "quadraticTerms": {
    object (SparseDoubleMatrixProto)
  },
  "lowerBound": number,
  "upperBound": number,
  "name": string
}
Trường
linearTerms

object (SparseDoubleVectorProto)

Những thuật ngữ tuyến tính trong biến quyết định.

Ngoài các yêu cầu về thông báo SparseDoubleVectorProto, chúng tôi yêu cầu: * linearTerms.ids là phần tử của VariablesProto.ids. * tất cả các giá trị tuyến tính.giá trị phải là hữu hạn và không phải là NaN.

Lưu ý: * Mã biến được bỏ qua có hệ số tương ứng bằng 0. * LinearTerms.values có thể bằng 0, nhưng điều này sẽ làm lãng phí không gian.

quadraticTerms

object (SparseDoubleMatrixProto)

Những thuật ngữ bậc hai trong biến quyết định.

Ngoài các yêu cầu về thông báo SparseDoubleMatrixProto, chúng tôi yêu cầu: * Mỗi phần tử của quadraticTerms.row_ids và mỗi phần tử của quadraticTerms.column_ids phải là một phần tử của VariablesProto.ids. * Ma trận phải là tam giác trên: đối với mỗi i, quadraticTerms.row_ids[i] <= quadraticTerms.column_ids[i].

Lưu ý: * Những cụm từ không được lưu trữ rõ ràng sẽ có hệ số bằng 0. * Các phần tử của quadraticTerms.coefficients có thể bằng 0, nhưng điều này sẽ làm lãng phí không gian.

lowerBound

number

Phải có giá trị bằng [-inf, inf) và nhỏ hơn hoặc bằng upperBound.

upperBound

number

Phải có giá trị trong (-inf, inf] và lớn hơn hoặc bằng lowerBound.

name

string

Thông báo gốc có thể có các yêu cầu về tính duy nhất đối với trường này; Ví dụ: xem ModelProto.quadratic_limitedts và QuadraticConstraintUpdatesProto.new_limitedts.

SecondOrderConeConstraintProto

Quy tắc ràng buộc hình nón bậc hai của biểu mẫu:

||argumentsToNorm||_2 <= upperBound,

trong đó upperBound và mỗi phần tử của argumentsToNorm là một biểu thức tuyến tính.

Nếu một biến có liên quan đến quy tắc ràng buộc này bị xoá, thì biến đó sẽ được xử lý như thể được đặt thành 0.

Biểu diễn dưới dạng JSON
{
  "upperBound": {
    object (LinearExpressionProto)
  },
  "argumentsToNorm": [
    {
      object (LinearExpressionProto)
    }
  ],
  "name": string
}
Trường
upperBound

object (LinearExpressionProto)

argumentsToNorm[]

object (LinearExpressionProto)

name

string

Thông báo gốc có thể có các yêu cầu về tính duy nhất đối với trường này; Ví dụ: xem ModelProto.second_order_cone_constraintsSecondOrderConeConstraintUpdatesProto.new_constraints.

LinearExpressionProto

Biểu diễn thưa thớt của biểu thức tuyến tính (tổng các biến có trọng số, cộng với độ lệch không đổi).

Biểu diễn dưới dạng JSON
{
  "ids": [
    string
  ],
  "coefficients": [
    number
  ],
  "offset": number
}
Trường
ids[]

string (int64 format)

Mã của các biến. Phải được sắp xếp (theo thứ tự tăng dần) với tất cả các phần tử riêng biệt.

coefficients[]

number

Phải có độ dài bằng mã nhận dạng. Giá trị phải là hữu hạn và không được là NaN.

offset

number

Phải là giá trị hữu hạn và không được là NaN.

SosConstraintProto

Dữ liệu để biểu thị một quy tắc ràng buộc SOS1 hoặc SOS2.

Nếu một biến có liên quan đến quy tắc ràng buộc này bị xoá, thì biến đó sẽ được xử lý như thể được đặt thành 0.

Biểu diễn dưới dạng JSON
{
  "expressions": [
    {
      object (LinearExpressionProto)
    }
  ],
  "weights": [
    number
  ],
  "name": string
}
Trường
expressions[]

object (LinearExpressionProto)

Những biểu thức được áp dụng điều kiện ràng buộc SOS1: Tối đa một phần tử nhận giá trị khác 0. * SOS2: Tối đa hai phần tử nhận các giá trị khác 0 và chúng phải nằm cạnh nhau theo thứ tự lặp lại.

weights[]

number

Để trống hoặc có độ dài bằng với biểu thức. Nếu trống, trọng số mặc định là 1, 2, ... Nếu có, các mục nhập phải là duy nhất.

name

string

Thông báo gốc có thể có các yêu cầu về tính duy nhất đối với trường này; Ví dụ: xem ModelProto.sos1_Constraintts và SosConstraintUpdatesProto.new_limitedts.

IndicatorConstraintProto

Dữ liệu để biểu thị một điều kiện ràng buộc chỉ báo duy nhất ở dạng: Variable(indicatorId) = (activateOnZero ? 0 : 1) ⇒ Giới hạn dưới <= biểu thức <= Giới hạn trên.

Nếu một biến liên quan đến quy tắc ràng buộc này (chỉ báo hoặc xuất hiện trong expression) bị xoá, thì biến đó sẽ được xử lý như thể được đặt thành 0. Cụ thể, việc xoá biến chỉ báo có nghĩa là quy tắc ràng buộc chỉ báo sẽ không có gì nếu activateOnZero là false và tương đương với quy tắc ràng buộc tuyến tính nếu activateOnZero là giá trị true.

Biểu diễn dưới dạng JSON
{
  "activateOnZero": boolean,
  "expression": {
    object (SparseDoubleVectorProto)
  },
  "lowerBound": number,
  "upperBound": number,
  "name": string,
  "indicatorId": string
}
Trường
activateOnZero

boolean

Nếu là true, thì nếu biến chỉ báo nhận giá trị 0, thì điều kiện ràng buộc ngầm định phải có. Ngược lại, nếu biến chỉ báo nhận giá trị 1, thì điều kiện ràng buộc ngầm định phải có.

expression

object (SparseDoubleVectorProto)

Phải là một biểu thức tuyến tính hợp lệ đối với mô hình chứa: * Tất cả các điều kiện đã nêu trên SparseDoubleVectorProto, * Tất cả các phần tử của expression.values phải là hữu hạn, * expression.ids là một tập con của VariablesProto.ids.

lowerBound

number

Phải có giá trị trong khoảng [-inf, inf); không được là NaN.

upperBound

number

Phải có giá trị trong (-inf, inf]; không được là NaN.

name

string

Thông báo gốc có thể có các yêu cầu về tính duy nhất đối với trường này; Ví dụ: xem ModelProto.indicator_constraintsIndicatorConstraintUpdatesProto.new_constraints.

indicatorId

string (int64 format)

Mã nhận dạng tương ứng với một biến nhị phân hoặc chưa được đặt. Nếu bạn không đặt chính sách này, giới hạn chỉ báo sẽ bị bỏ qua. Nếu bạn đặt chính sách này, chúng tôi yêu cầu: * VariablesProto.integers[indicatorId] = true, * VariablesProto.lower_bounds[indicatorId] >= 0, * VariablesProto.upper_bounds[indicatorId] <= 1. MathOpt không xác thực những điều kiện này. Tuy nhiên, nếu không đáp ứng điều kiện này, trình giải sẽ trả về lỗi khi giải xong.

SolveParametersProto

Các tham số để kiểm soát một lượt giải một lần.

Chứa cả hai tham số chung cho tất cả trình giải, ví dụ: thời gian và các thông số cho một trình giải cụ thể, ví dụ: gscip. Nếu bạn đặt một giá trị trong cả trường chung và trường cụ thể của trình giải, thì chế độ cài đặt dành riêng cho trình giải sẽ được sử dụng.

Các tham số phổ biến không bắt buộc và không được đặt hoặc một enum không xác định giá trị cho biết rằng trình giải toán mặc định được sử dụng.

Các tham số cụ thể của trình giải cho trình giải không phải là tham số đang sử dụng sẽ bị bỏ qua.

Các thông số phụ thuộc vào mô hình (ví dụ: mức độ ưu tiên phân nhánh được đặt cho từng biến) sẽ được chuyển vào ModelSolveParametersProto.

Biểu diễn dưới dạng JSON
{
  "timeLimit": string,
  "enableOutput": boolean,
  "lpAlgorithm": enum (LPAlgorithmProto),
  "presolve": enum (EmphasisProto),
  "cuts": enum (EmphasisProto),
  "heuristics": enum (EmphasisProto),
  "scaling": enum (EmphasisProto),
  "iterationLimit": string,
  "nodeLimit": string,
  "cutoffLimit": number,
  "objectiveLimit": number,
  "bestBoundLimit": number,
  "solutionLimit": integer,
  "threads": integer,
  "randomSeed": integer,
  "absoluteGapTolerance": number,
  "relativeGapTolerance": number,
  "solutionPoolSize": integer
}
Trường
timeLimit

string (Duration format)

Thời gian tối đa mà người giải toán nên dành cho bài toán đó (hoặc vô hạn nếu không đặt ra thời gian cụ thể).

Giá trị này không phải là giới hạn cố định, thời gian giải có thể vượt quá giá trị này một chút. Thông số này luôn được chuyển đến trình giải cơ bản và không sử dụng trình giải mặc định.

Thời lượng tính bằng giây với tối đa 9 chữ số phân số, kết thúc bằng "s". Ví dụ: "3.5s".

enableOutput

boolean

Cho phép in dấu vết triển khai trình giải trí. Vị trí của các dấu vết đó phụ thuộc vào trình giải. Đối với SCIP và Gurobi, đây sẽ là luồng đầu ra tiêu chuẩn. Đối với Glop và CP-SAT, thao tác này sẽ LOG(INFO).

Xin lưu ý rằng nếu trình giải mã hỗ trợ lệnh gọi lại thông báo và người dùng đăng ký một lệnh gọi lại cho lệnh gọi lại đó, thì giá trị tham số này sẽ bị bỏ qua và không có dấu vết nào được in.

lpAlgorithm

enum (LPAlgorithmProto)

Thuật toán để giải chương trình tuyến tính. Nếu LP_ALGORITHM_UNSPECIFIED, hãy sử dụng thuật toán mặc định của trình giải.

Đối với những bài toán không phải là chương trình tuyến tính nhưng lập trình tuyến tính là một chương trình con, người giải có thể sử dụng giá trị này. Ví dụ: Trình giải MIP thường chỉ sử dụng cách này để giải LP gốc (còn nếu không thì dùng đơn trình kép).

presolve

enum (EmphasisProto)

Nỗ lực đơn giản hoá bài toán trước khi bắt đầu thuật toán chính hoặc mức độ nỗ lực mặc định của trình giải nếu EMPHASIS_UNSPECIFIED.

cuts

enum (EmphasisProto)

Nỗ lực để LP được thư giãn hiệu quả hơn (chỉ dành cho MIP) hoặc mức độ nỗ lực mặc định của trình giải nếu EMPHASIS_UNSPECIFIED.

LƯU Ý: việc tắt đoạn cắt có thể ngăn lệnh gọi lại có cơ hội thêm đoạn cắt tại MIP_TIMESTAMP. Hành vi này tuỳ thuộc vào trình giải quyết.

heuristics

enum (EmphasisProto)

Nỗ lực tìm ra các giải pháp khả thi ngoài những giải pháp gặp phải trong quy trình tìm kiếm hoàn chỉnh (chỉ dành cho MIP) hoặc mức độ nỗ lực mặc định của người giải nếu EMPHASIS_UNSPECIFIED.

scaling

enum (EmphasisProto)

Nỗ lực sửa lại bài toán để cải thiện độ ổn định về số hoặc mức độ nỗ lực mặc định của trình giải nếu EMPHASIS_UNSPECIFIED.

iterationLimit

string (int64 format)

Giới hạn số lần lặp lại của thuật toán cơ bản (ví dụ: các trục đơn giản). Hành vi cụ thể phụ thuộc vào trình giải và thuật toán được sử dụng, nhưng thường có thể đưa ra giới hạn giải quyết định (bạn có thể cần cấu hình thêm, chẳng hạn như một luồng).

Thường được hỗ trợ bởi các trình giải LP, QP và MIP. Tuy nhiên, đối với các trình giải quyết MIP, hãy xem thêmnodeLimit.

nodeLimit

string (int64 format)

Giới hạn về số lượng bài toán phụ được giải quyết trong tìm kiếm liệt kê (ví dụ: nhánh và ràng buộc). Đối với nhiều trình giải, bạn có thể dùng phương pháp này để giới hạn phép tính một cách quyết định (có thể cần thêm cấu hình, chẳng hạn như một luồng).

Thông thường, đối với các trình giải quyết MIP, hãy xem thêm repeatLimit.

cutoffLimit

number

Trình giải sẽ dừng sớm nếu chứng minh được không có lời giải nguyên tố nào ít nhất là tốt bằng điểm cắt.

Khi dừng sớm, trình giải sẽ trả về lý do kết thúc là NO_SOLUTION_FOUND và có giới hạn là CUTOFF, đồng thời không bắt buộc phải cung cấp thêm thông tin về cách giải. Không ảnh hưởng đến giá trị trả về nếu không có điểm dừng sớm.

Bạn nên sử dụng dung sai nếu muốn trả về các giải pháp có mục tiêu chính xác bằng giới hạn.

Hãy xem hướng dẫn sử dụng để biết thêm thông tin chi tiết và so sánh với BestBoundLimit.

objectiveLimit

number

Người giải quyết sẽ dừng lại ngay khi tìm ra giải pháp tốt nhất là trong trường hợp này, với lý do kết thúc KHÔNG THỂ CHIA SẺ và hạn chế MỤC TIÊU.

bestBoundLimit

number

Trình giải sẽ dừng lại ngay khi chứng minh được rằng ràng buộc tốt nhất, ít nhất là điều này, với lý do chấm dứt là FEASIBLE hoặc NO_SOLUTION_FOUND và giới hạn MỤC TIÊU.

Hãy xem hướng dẫn sử dụng để biết thêm thông tin chi tiết và so sánh với bộ hạn mức tối đa.

solutionLimit

integer

Trình giải sẽ dừng lại sớm sau khi tìm thấy nhiều giải pháp khả thi này, với lý do chấm dứt CÓ KHẢ NĂNG VÀ giới hạn GIẢI PHÁP. Phải lớn hơn 0 nếu được đặt. Phương pháp này thường được dùng để khiến trình giải dừng lại ở cách giải khả thi đầu tiên tìm được. Lưu ý rằng chúng tôi không đảm bảo về giá trị mục tiêu cho bất kỳ giải pháp nào được trả về.

Trình giải toán thường sẽ không trả về nhiều lời giải hơn giới hạn lời giải, nhưng điều này không được MathOpt thực thi, hãy xem thêm b/214041169.

Hiện được hỗ trợ cho Gurobi và SCIP, và chỉ hỗ trợ cho CP-SAT với giá trị 1.

threads

integer

Nếu được đặt, giá trị này phải >= 1.

randomSeed

integer

Số ngẫu nhiên cho trình tạo số giả ngẫu nhiên trong trình giải cơ bản. Xin lưu ý rằng tất cả các trình giải đều sử dụng các số giả ngẫu nhiên để chọn những yếu tố như độ nhiễu trong thuật toán LP, quy tắc liên kết và bản sửa lỗi phỏng đoán. Việc thay đổi giá trị này có thể tác động đáng kể đến hành vi của trình giải.

Mặc dù tất cả những trình giải đều có khái niệm hạt giống, nhưng xin lưu ý rằng các giá trị hợp lệ phụ thuộc vào trình giải thực tế. - Gurobi: [0:GRB_MAXINT] (tính đến Gurobi 9.0 là 2x10^9). - GSCIP: [0:2147483647] (là MAX_INT hoặc kint32max hoặc 2^31-1). - GLOP: [0:2147483647] (tương tự như trên) Trong mọi trường hợp, trình giải sẽ nhận được giá trị bằng: MAX(0, MIN(MAX_VALID_VALUE_FOR_SOLVER, randomSeed)).

absoluteGapTolerance

number

Dung sai tối ưu tuyệt đối (chủ yếu) cho trình giải quyết MIP.

GAP tuyệt đối là giá trị tuyệt đối của sự chênh lệch giữa: * giá trị mục tiêu của giải pháp khả thi nhất đã tìm được, * giới hạn kép do tìm kiếm tạo ra. Trình giải có thể dừng khi GAP tuyệt đối đạt mức tuyệt đối (khi được đặt) và trả về TERMINATION_REASON_OPTIMAL.

Phải >= 0 nếu được đặt.

Xem thêm tương đốiGapTolerance.

relativeGapTolerance

number

Dung sai tối ưu tương đối (chủ yếu) cho trình giải quyết MIP.

GAP tương đối là phiên bản chuẩn hoá của GAP tuyệt đối (được định nghĩa theo thuộc tính tuyệt đốiGapTolerance), trong đó quá trình chuẩn hoá phụ thuộc vào trình giải, ví dụ: giá trị GAP tuyệt đối chia cho giá trị mục tiêu của giải pháp khả thi tốt nhất đã tìm được.

Trình giải có thể ngừng khi GAP tương đối đạt mức GAP tương đối cao nhất (khi được đặt) và trả về TERMINATION_REASON_OPTIMAL.

Phải >= 0 nếu được đặt.

Xem thêm AwesomeGapTolerance.

solutionPoolSize

integer

Duy trì tối đa solutionPoolSize giải pháp trong khi tìm kiếm. Nhóm giải pháp thường có 2 hàm: (1) Đối với những trình giải có thể trả về nhiều lời giải, điều này sẽ giới hạn số lượng đáp án sẽ trả về. (2) Một số trình giải quyết có thể chạy phương pháp phỏng đoán bằng cách sử dụng các nghiệm trong nhóm giải pháp. Vì vậy, việc thay đổi giá trị này có thể ảnh hưởng đến đường dẫn của thuật toán. Để buộc trình giải toán lấp đầy nhóm giải pháp, ví dụ: với n phương án hay nhất, đòi hỏi phải có thêm một cấu hình cụ thể cho người giải.

LPAlgorithmProto

Chọn một thuật toán để giải các chương trình tuyến tính.

Enum
LP_ALGORITHM_UNSPECIFIED
LP_ALGORITHM_PRIMAL_SIMPLEX Phương thức đơn giản (tối ưu). Thông thường có thể cung cấp nghiệm nguyên gốc và giải pháp kép, tia nguyên thuỷ/tia kép đối với các vấn đề nguyên thuỷ/kép không giới hạn và cơ sở.
LP_ALGORITHM_DUAL_SIMPLEX Phương thức đơn giản kép. Thông thường có thể cung cấp nghiệm nguyên gốc và giải pháp kép, tia nguyên thuỷ/tia kép đối với các vấn đề nguyên thuỷ/kép không giới hạn và cơ sở.
LP_ALGORITHM_BARRIER Phương pháp rào cản, còn thường được gọi là phương pháp điểm bên trong (IPM). Thường có thể đưa ra cả nghiệm nguyên sơ và nghiệm kép. Một số cách triển khai cũng có thể tạo ra tia đối với các vấn đề không khả thi/không giới hạn. Không có cơ sở trừ phi trình giải quyết cơ bản thực hiện "kết hợp" và kết thúc bằng Simplex.
LP_ALGORITHM_FIRST_ORDER Thuật toán dựa trên phương thức bậc nhất. Các giải pháp này thường sẽ tạo ra cả giải pháp gốc và giải pháp kép, và cũng có thể là chứng chỉ về tính bất khả thi gốc và/hoặc kép. Phương pháp bậc nhất thường sẽ cung cấp các giải pháp có độ chính xác thấp hơn, vì vậy, người dùng nên cẩn thận khi đặt các tham số chất lượng giải pháp (ví dụ: dung sai) và để xác thực giải pháp.

EmphasisProto

Mức độ nỗ lực áp dụng cho một nhiệm vụ không bắt buộc trong khi giải quyết (xem phần SolveParametersProto để sử dụng).

Điểm nhấn được dùng để định cấu hình tính năng trình giải như sau: * Nếu trình giải không hỗ trợ tính năng này thì chỉ UNSPECIFIED sẽ luôn hợp lệ, mọi chế độ cài đặt khác thường sẽ là lỗi đối số không hợp lệ (một số trình giải cũng có thể chấp nhận là TẮT). * Nếu trình giải quyết hỗ trợ tính năng này: – Khi đặt thành UNSPECIFIED, giá trị mặc định cơ bản sẽ được sử dụng. – Khi không thể tắt tính năng này, chế độ TẮT sẽ trả về thông báo lỗi. – Nếu bạn bật tính năng này theo mặc định, thì giá trị mặc định của trình giải toán thường được liên kết với MEDIUM. - Nếu đối tượng địa lý được hỗ trợ, ÍT, TRUNG BÌNH, CAO và RẤT CAO sẽ không bao giờ báo lỗi và sẽ ánh xạ đến kết quả phù hợp nhất của chúng.

Enum
EMPHASIS_UNSPECIFIED
EMPHASIS_OFF
EMPHASIS_LOW
EMPHASIS_MEDIUM
EMPHASIS_HIGH
EMPHASIS_VERY_HIGH

ModelSolveParametersProto

Biểu diễn dưới dạng JSON
{
  "variableValuesFilter": {
    object (SparseVectorFilterProto)
  },
  "dualValuesFilter": {
    object (SparseVectorFilterProto)
  },
  "reducedCostsFilter": {
    object (SparseVectorFilterProto)
  },
  "initialBasis": {
    object (BasisProto)
  },
  "solutionHints": [
    {
      object (SolutionHintProto)
    }
  ],
  "branchingPriorities": {
    object (SparseInt32VectorProto)
  }
}
Trường
variableValuesFilter

object (SparseVectorFilterProto)

Bộ lọc được áp dụng cho tất cả các vùng chứa thưa thớt được trả về có khoá bởi các biến trong PrimalSolutionProto và PrimalRayProto (PrimalSolutionProto.variable_values, PrimalRayProto.variable_values).

Yêu cầu: * filterIds là các phần tử của VariablesProto.ids.

dualValuesFilter

object (SparseVectorFilterProto)

Bộ lọc được áp dụng cho tất cả các vùng chứa thưa được trả về có khoá bởi các điều kiện ràng buộc tuyến tính trong DualSolutionProto và DualRay (DualSolutionProto.dual_values, DualRay.dual_values).

Các yêu cầu: * filterIds là phần tử của LinearConstraints.ids.

reducedCostsFilter

object (SparseVectorFilterProto)

Bộ lọc được áp dụng cho tất cả các vùng chứa thưa thớt được trả về có khoá bằng các biến trong DualSolutionProto và DualRay (DualSolutionProto.reduced_costs, DualRay.reduced_costs).

Yêu cầu: * filterIds là các phần tử của VariablesProto.ids.

initialBasis

object (BasisProto)

Cơ sở ban đầu (không bắt buộc) cho những trình giải LP đơn giản khởi động ấm. Nếu được đặt, giá trị này dự kiến sẽ hợp lệ theo ValidateBasis trong validators/solution_validator.h cho ModelSummary hiện tại.

solutionHints[]

object (SolutionHintProto)

Gợi ý giải pháp (không bắt buộc). Nếu trình giải cơ bản chỉ chấp nhận một gợi ý duy nhất, thì gợi ý đầu tiên sẽ được sử dụng.

branchingPriorities

object (SparseInt32VectorProto)

Mức độ ưu tiên phân nhánh không bắt buộc. Biến có giá trị cao hơn sẽ được phân nhánh trước. Các biến không được đặt mức độ ưu tiên sẽ có mức độ ưu tiên mặc định của trình giải (thường là 0).

Yêu cầu: * phân nhánhƯu tiên.giá trị phải là hữu hạn. * phân nhánhƯu tiên.ids phải là các phần tử của VariablesProto.ids.

SparseVectorFilterProto

Thông báo này cho phép truy vấn/đặt các phần cụ thể của một SparseXxxxVector. Hành vi mặc định là không lọc ra bất kỳ dữ liệu nào. Cách sử dụng phổ biến là chỉ truy vấn các phần của giải pháp (chỉ các giá trị khác 0 và/hoặc chỉ một tập hợp các giá trị biến được chọn thủ công).

Biểu diễn dưới dạng JSON
{
  "skipZeroValues": boolean,
  "filterByIds": boolean,
  "filteredIds": [
    string
  ]
}
Trường
skipZeroValues

boolean

Đối với SparseBoolVectorProto "zero" là false.

filterByIds

boolean

Khi đúng, chỉ trả về các giá trị tương ứng với các mã nhận dạng được liệt kê trong filterIds.

filteredIds[]

string (int64 format)

Danh sách mã nhận dạng cần sử dụng khi filterByIds là true. Phải để trống khi filterByIds là false. LƯU Ý: nếu giá trị này trống và filterByIds là true, tức là bạn không muốn nhận bất kỳ thông tin nào trong kết quả.

BasisProto

Tính chất tổ hợp cho lời giải của một chương trình tuyến tính.

Phương pháp đơn giản để giải các chương trình tuyến tính luôn trả về một "giải pháp cơ bản khả thi" có thể được mô tả một cách kết hợp bằng một Cơ sở. Cơ sở sẽ chỉ định một BasisStatusProto cho mọi biến và điều kiện ràng buộc tuyến tính.

Ví dụ: hãy xem xét một LP dạng chuẩn: min c * x s.t. A * x = b x >= 0 có nhiều biến hơn các điều kiện ràng buộc và có thứ hạng hàng đầy đủ A.

Gọi n là số biến và m số giới hạn tuyến tính. Cơ sở hợp lệ cho bài toán này có thể được xây dựng như sau: * Tất cả các điều kiện ràng buộc sẽ có trạng thái cơ sở là CỐ ĐỊNH. * Chọn m biến sao cho các cột của A độc lập tuyến tính và gán trạng thái BASIC. * Gán trạng thái AT_ hoá cho các biến n – m còn lại.

Giải pháp cơ bản cho cơ sở này là giải pháp duy nhất của A * x = b có tất cả các biến có trạng thái AT_ hoá được cố định ở giới hạn dưới của chúng (tất cả đều bằng 0). Giải pháp thu được được gọi là giải pháp khả thi cơ bản nếu nó cũng thoả mãn x >= 0.

Biểu diễn dưới dạng JSON
{
  "constraintStatus": {
    object (SparseBasisStatusVector)
  },
  "variableStatus": {
    object (SparseBasisStatusVector)
  },
  "basicDualFeasibility": enum (SolutionStatusProto)
}
Trường
constraintStatus

object (SparseBasisStatusVector)

Trạng thái cơ sở ràng buộc.

Yêu cầu: * ConstrainttStatus.ids bằng với LinearConstraints.ids.

variableStatus

object (SparseBasisStatusVector)

Trạng thái cơ sở của biến.

Yêu cầu: * ConstrainttStatus.ids bằng với VariablesProto.ids.

basicDualFeasibility

enum (SolutionStatusProto)

Đây là một tính năng nâng cao được MathOpt sử dụng để mô tả tính khả thi của các giải pháp LP dưới mức tối ưu (giải pháp tối ưu sẽ luôn có trạng thái SOLUTION_STATUS_FEASIBLE).

Đối với LP một phía, giá trị này phải bằng với trạng thái khả thi của giải pháp kép được liên kết. Đối với LP hai phía, dữ liệu này có thể khác trong một số trường hợp hiếm gặp (ví dụ: giải không hoàn chỉnh bằng phương trình đơn giản nguyên tố).

Nếu bạn đang cung cấp cơ sở bắt đầu thông qua ModelSolveParametersProto.initial_basis, thì giá trị này sẽ bị bỏ qua. Hàm này chỉ phù hợp cho cơ sở do SolutionProto.basis trả về.

SparseBasisStatusVector

Biểu diễn thưa thớt của các trạng thái cơ sở.

Biểu diễn dưới dạng JSON
{
  "ids": [
    string
  ],
  "values": [
    enum (BasisStatusProto)
  ]
}
Trường
ids[]

string (int64 format)

Phải được sắp xếp (theo thứ tự tăng dần) với tất cả các phần tử riêng biệt.

values[]

enum (BasisStatusProto)

Phải có độ dài bằng mã nhận dạng.

BasisStatusProto

Trạng thái của một biến/quy tắc ràng buộc trong cơ sở LP.

Enum
BASIS_STATUS_UNSPECIFIED Giá trị bảo vệ biểu thị không có trạng thái.
BASIS_STATUS_FREE Biến/quy tắc ràng buộc là miễn phí (không có giới hạn hữu hạn).
BASIS_STATUS_AT_LOWER_BOUND Biến/quy tắc ràng buộc nằm ở giới hạn dưới (phải là giới hạn hữu hạn).
BASIS_STATUS_AT_UPPER_BOUND Biến/quy tắc ràng buộc nằm ở giới hạn trên (phải là hữu hạn).
BASIS_STATUS_FIXED_VALUE Biến/quy tắc ràng buộc có giới hạn dưới và giới hạn trên hữu hạn giống hệt nhau.
BASIS_STATUS_BASIC Biến/quy tắc ràng buộc là cơ bản.

SolutionStatusProto

Tính khả thi của một nghiệm nguyên thuỷ hoặc một nghiệm kép như người giải đã tuyên bố.

Enum
SOLUTION_STATUS_UNSPECIFIED Giá trị bảo vệ biểu thị không có trạng thái.
SOLUTION_STATUS_UNDETERMINED Trình giải quyết không xác nhận trạng thái khả thi.
SOLUTION_STATUS_FEASIBLE Trình giải quyết tuyên bố giải pháp này là khả thi.
SOLUTION_STATUS_INFEASIBLE Trình giải quyết tuyên bố giải pháp này là không khả thi.

SolutionHintProto

Một giải pháp khởi đầu được đề xuất cho trình giải toán.

Trình giải MIP thường chỉ cần thông tin nguyên tố (variableValues), trong khi trình giải LP cần cả thông tin nguyên tố và thông tin kép (dualValues).

Nhiều trình giải quyết MIP có thể làm việc với: (1) các giải pháp từng phần không nêu rõ tất cả các biến hoặc (2) các giải pháp không khả thi. Trong những trường hợp này, người giải thường giải một MIP phụ để hoàn thành/sửa gợi ý.

Cách trình giải toán sử dụng gợi ý phụ thuộc nhiều vào cách giải, loại bài toán và thuật toán được sử dụng. Cách đáng tin cậy nhất để đảm bảo gợi ý của bạn có hiệu quả là đọc nhật ký trình giải cơ bản có và không có gợi ý.

Trình giải LP dựa trên đơn giản thường thích cơ sở ban đầu hơn là gợi ý giải pháp (nếu không, họ cần kết hợp để chuyển đổi gợi ý thành một giải pháp cơ bản khả thi).

Biểu diễn dưới dạng JSON
{
  "variableValues": {
    object (SparseDoubleVectorProto)
  },
  "dualValues": {
    object (SparseDoubleVectorProto)
  }
}
Trường
variableValues

object (SparseDoubleVectorProto)

Có thể chỉ định một phần các giá trị cho biến nguyên tố của bài toán. Các yêu cầu độc lập với trình giải cho thông báo phụ này là: * variableValues.ids là các phần tử của VariablesProto.ids. * tất cả biếnValues.values phải là hữu hạn.

dualValues

object (SparseDoubleVectorProto)

Chỉ định (có thể một phần) các giá trị cho giới hạn tuyến tính của bài toán.

Yêu cầu: * DualValues.ids là các phần tử của LinearConstraintsProto.ids. * tất cả giá trị DualValues.values phải là hữu hạn.

SparseInt32VectorProto

Một biểu diễn thưa thớt của vectơ int.

Biểu diễn dưới dạng JSON
{
  "ids": [
    string
  ],
  "values": [
    integer
  ]
}
Trường
ids[]

string (int64 format)

Nên được sắp xếp (theo thứ tự tăng dần) với tất cả các phần tử riêng biệt.

values[]

integer

Phải có độ dài bằng mã nhận dạng.

SolveResultProto

Hợp đồng khi giải pháp/tia nguyên tố/kép là phức tạp, hãy xem Summary_reasons.md để biết nội dung mô tả đầy đủ.

Cho đến khi một hợp đồng chính xác được ký kết, cách an toàn nhất là kiểm tra xem có giải pháp/tia hay không thay vì dựa vào lý do chấm dứt.

Biểu diễn dưới dạng JSON
{
  "termination": {
    object (TerminationProto)
  },
  "solutions": [
    {
      object (SolutionProto)
    }
  ],
  "primalRays": [
    {
      object (PrimalRayProto)
    }
  ],
  "dualRays": [
    {
      object (DualRayProto)
    }
  ],
  "solveStats": {
    object (SolveStatsProto)
  }
}
Trường
termination

object (TerminationProto)

Lý do khiến trình giải toán dừng lại.

solutions[]

object (SolutionProto)

Quy ước chung về thứ tự giải pháp mà những người giải quyết trong tương lai nên triển khai là sắp xếp theo: 1. Những giải pháp có một giải pháp cơ bản khả thi, được sắp xếp theo mục tiêu nguyên tắc tốt nhất trước tiên. 2. Các giải pháp có giải pháp khả thi kép, được sắp xếp theo mục tiêu kép tốt nhất (chưa biết mục tiêu kép là mục tiêu kém nhất) 3. Có thể trả về tất cả các giải pháp còn lại theo thứ tự bất kỳ.

primalRays[]

object (PrimalRayProto)

Hướng dẫn cải tiến ban đầu không giới hạn hoặc chứng chỉ tính không khả thi kép tương đương. Thường được cung cấp cho ốtReasonProtos UNBOUNDED và DUAL_INFEASIBLE

dualRays[]

object (DualRayProto)

Hướng dẫn cải tiến kép không giới hạn hoặc chứng chỉ tương đương về tính không khả thi cơ bản. Thường được cung cấp cho Chấm dứt lý doProto KHÔNG THỂ SỬ DỤNG.

solveStats

object (SolveStatsProto)

Số liệu thống kê về quá trình giải quyết, ví dụ: thời gian chạy, số lần lặp lại.

TerminationProto

Tất cả thông tin liên quan đến lý do chấm dứt lệnh gọi đến Solve().

Biểu diễn dưới dạng JSON
{
  "reason": enum (TerminationReasonProto),
  "limit": enum (LimitProto),
  "detail": string,
  "problemStatus": {
    object (ProblemStatusProto)
  },
  "objectiveBounds": {
    object (ObjectiveBoundsProto)
  }
}
Trường
reason

enum (TerminationReasonProto)

Thông tin bổ sung trong limit khi giá trị là TERMINATION_REASON_FEASIBLE hoặc TERMINATION_REASON_NO_SOLUTION_FOUND, hãy xem limit để biết chi tiết.

limit

enum (LimitProto)

Là LIMIT_UNSPECIFIED trừ phi lý do là TERMINATION_REASON_FEASIBLE hoặc TERMINATION_REASON_NO_SOLUTION_FOUND. Không phải trình giải toán nào cũng có thể xác định giới hạn dẫn đến việc chấm dứt. Sử dụng LIMIT_UNDETERMINED khi không thể xác định được nguyên nhân.

detail

string

Thông tin cụ thể khác về việc chấm dứt tài khoản (thường là người giải quyết)

problemStatus

object (ProblemStatusProto)

Trạng thái khả thi cho bài toán nguyên thuỷ và bài toán kép. Kể từ ngày 18 tháng 7 năm 2023, thư này có thể không có. Nếu bị thiếu, bạn có thể tìm thấy videoStatus trong SolveResultProto.solve_stats.

objectiveBounds

object (ObjectiveBoundsProto)

Giới hạn giá trị mục tiêu tối ưu. Kể từ ngày 18 tháng 7 năm 2023, thư này có thể không có. Nếu bị thiếu, bạn có thể tìm thấy mục tiêuTargetBounds.primal_bound trong nó SolveResultProto.solve.stats.best_primal_bound và audienceBounds.dual_bound, bạn có thể tìm thấy mục TargetResultProto.solve.stats.best_dual_bound

TerminationReasonProto

Lý do lệnh gọi đến Solve() chấm dứt.

Enum
TERMINATION_REASON_UNSPECIFIED
TERMINATION_REASON_OPTIMAL Đã tìm thấy một nghiệm tối ưu có thể chứng minh được (lên đến dung sai số).
TERMINATION_REASON_INFEASIBLE Bài toán nguyên tắc không có giải pháp khả thi.
TERMINATION_REASON_UNBOUNDED Bài toán nguyên tố là khả thi và có thể tìm thấy các lời giải hay tuỳ ý dọc theo tia nguyên thuỷ.
TERMINATION_REASON_INFEASIBLE_OR_UNBOUNDED Bài toán nguyên tắc này không khả thi hoặc không bị ràng buộc. Bạn có thể xem thêm thông tin chi tiết về trạng thái sự cố trong resolveStats.problem_status. Lưu ý rằng trạng thái không bị ràng buộc của Gurobi có thể được lập bản đồ tại đây.
TERMINATION_REASON_IMPRECISE

Vấn đề đã được giải quyết theo một trong các tiêu chí bên trên (Tối ưu, Không khả thi, Không ràng buộc hoặc Không khả thi hoặc Không bị ràng buộc), nhưng không đáp ứng một hoặc nhiều dung sai. Hiện đã có một số giải pháp/tia sơ cấp, nhưng chúng sẽ không khả thi một chút hoặc (nếu vấn đề gần như tối ưu), chúng có thể là khoảng cách giữa mục tiêu giải pháp tốt nhất và giới hạn mục tiêu tốt nhất.

Người dùng vẫn có thể truy vấn số liệu thống kê về giải pháp/giải pháp kép/cơ bản, nhưng họ phải chịu trách nhiệm xử lý sự thiếu chính xác về mặt số học.

TERMINATION_REASON_FEASIBLE Trình tối ưu hoá đã đạt đến một số loại giới hạn và giải pháp cơ bản khả thi được trả về. Hãy xem SolveResultProto.limit_detail để biết mô tả chi tiết về loại giới hạn đã đạt đến.
TERMINATION_REASON_NO_SOLUTION_FOUND Trình tối ưu hoá đã đạt đến một loại giới hạn nào đó và không tìm thấy giải pháp cơ bản khả thi. Hãy xem SolveResultProto.limit_detail để biết mô tả chi tiết về loại giới hạn đã đạt đến.
TERMINATION_REASON_NUMERICAL_ERROR Thuật toán đã dừng vì gặp phải lỗi số không thể khôi phục. Không có thông tin về giải pháp.
TERMINATION_REASON_OTHER_ERROR Thuật toán đã dừng do một lỗi không thuộc một trong các trạng thái được xác định ở trên. Không có thông tin về giải pháp.

LimitProto

Khi một Solve() dừng sớm với Chấm dứt Proto FEASIBLE hoặc NO_SOLUTION_FOUND, giới hạn cụ thể đã đạt đến.

Enum
LIMIT_UNSPECIFIED Được dùng làm giá trị rỗng khi chúng tôi chấm dứt không quá một giới hạn (ví dụ: TERMINATION_REASON_OPTIMAL).
LIMIT_UNDETERMINED Trình giải cơ bản không cho biết giới hạn nào đã đạt đến.
LIMIT_ITERATION Thuật toán lặp lại dừng lại sau khi tiến hành số lần lặp tối đa (ví dụ: lặp đơn giản hoặc lặp rào).
LIMIT_TIME Thuật toán sẽ dừng sau thời gian tính toán do người dùng chỉ định.
LIMIT_NODE Thuật toán nhánh và giới hạn đã dừng do thuật toán này khám phá số lượng nút tối đa trong cây nhánh và giới hạn.
LIMIT_SOLUTION Thuật toán đã dừng vì đã tìm thấy số lượng đáp án cần thiết. Hàm này thường được dùng trong các MIP để khiến trình giải trả về giải pháp khả thi đầu tiên mà nó gặp phải.
LIMIT_MEMORY Thuật toán đã dừng do hết bộ nhớ.
LIMIT_CUTOFF Trình giải đã chạy với điểm cắt (ví dụ: SolveParameters.cutoff_limit đã được đặt) trên mục tiêu, cho thấy rằng người dùng không muốn bất kỳ lời giải nào kém hơn điểm cắt và trình giải toán đã kết luận rằng không có lời giải nào ít nhất là tốt bằng điểm cắt. Thường không được cung cấp thêm thông tin về giải pháp.
LIMIT_OBJECTIVE Thuật toán đã dừng vì thuật toán tìm thấy lời giải hoặc giới hạn tốt hơn giới hạn do người dùng đặt (xem SolveParameters.objective_limit và SolveParameters.best_bound_limit).
LIMIT_NORM Thuật toán đã dừng lại vì quy chuẩn của vòng lặp trở nên quá lớn.
LIMIT_INTERRUPTED Thuật toán đã dừng do có tín hiệu gián đoạn hoặc có yêu cầu làm gián đoạn của người dùng.
LIMIT_SLOW_PROGRESS Thuật toán đã dừng lại vì không thể tiếp tục tìm ra giải pháp.
LIMIT_OTHER

Thuật toán đã dừng do một giới hạn không thuộc phạm vi của một trong các giới hạn trên. Lưu ý rằng LIMIT_UNDETERMINED được sử dụng khi không thể xác định được lý do và LIMIT_OTHER được sử dụng khi đã biết lý do nhưng không phù hợp với bất kỳ lựa chọn thay thế nào ở trên.

Chấm dứtProto.detail có thể chứa thông tin bổ sung về giới hạn này.

ProblemStatusProto

Trạng thái khả thi của bài toán nguyên thuỷ và bài toán kép của bài toán (hoặc kép của việc thư giãn liên tục) như người giải đã tuyên bố. Trình giải không bắt buộc phải trả về chứng chỉ cho tuyên bố đó (ví dụ: trình giải có thể xác nhận tính khả thi sơ cấp mà không cần trả về lời giải khả thi ban đầu). Trạng thái kết hợp này mô tả toàn diện các tuyên bố của người giải về tính khả thi và tính không ràng buộc của bài toán đã được giải quyết. Ví dụ:

  • trạng thái khả thi cho bài toán nguyên thuỷ và bài toán kép cho biết bài toán nguyên gốc là khả thi và bị ràng buộc và có khả năng có một giải pháp tối ưu (được đảm bảo cho các bài toán không có ràng buộc phi tuyến tính).
  • trạng thái khả thi nguyên bản và trạng thái không khả thi kép cho biết vấn đề nguyên tắc không bị ràng buộc (tức là có các giải pháp tuỳ ý thích hợp).

Lưu ý rằng bản thân trạng thái không khả thi kép (nghĩa là đi kèm với trạng thái nguyên thuỷ chưa được xác định) không ngụ ý rằng bài toán nguyên tắc không bị ràng buộc vì chúng ta có thể có cả hai vấn đề đều không khả thi. Ngoài ra, mặc dù trạng thái khả thi nguyên sơ và khả thi kép có thể ngụ ý rằng có một giải pháp tối ưu, nhưng điều đó không đảm bảo rằng người giải toán đã thực sự tìm ra giải pháp tối ưu đó.

Biểu diễn dưới dạng JSON
{
  "primalStatus": enum (FeasibilityStatusProto),
  "dualStatus": enum (FeasibilityStatusProto),
  "primalOrDualInfeasible": boolean
}
Trường
primalStatus

enum (FeasibilityStatusProto)

Trạng thái của sự cố ban đầu.

dualStatus

enum (FeasibilityStatusProto)

Trạng thái của vấn đề kép (hoặc cho vấn đề kép của việc thư giãn liên tục).

primalOrDualInfeasible

boolean

Nếu đúng, người giải tuyên bố rằng bài toán nguyên tắc hoặc bài toán kép là không khả thi, nhưng lại không biết bài toán nào (hoặc cả hai đều không khả thi). Chỉ có thể có giá trị đúng khi primary_problem_status = Dual_problem_status = kUndefined. Thông tin bổ sung này thường cần thiết khi quá trình xử lý trước xác định rằng không có giải pháp tối ưu nào cho vấn đề (nhưng không thể xác định liệu đó là do tính không khả thi, không bị ràng buộc hay cả hai).

FeasibilityStatusProto

Trạng thái tính khả thi của bài toán theo tuyên bố của trình giải (không cần trả về chứng chỉ cho thông báo xác nhận quyền sở hữu).

Enum
FEASIBILITY_STATUS_UNSPECIFIED Giá trị bảo vệ biểu thị không có trạng thái.
FEASIBILITY_STATUS_UNDETERMINED Trình giải quyết không xác nhận trạng thái.
FEASIBILITY_STATUS_FEASIBLE Trình giải quyết tuyên bố bài toán này là khả thi.
FEASIBILITY_STATUS_INFEASIBLE Trình giải quyết tuyên bố bài toán này không khả thi.

ObjectiveBoundsProto

Giới hạn giá trị mục tiêu tối ưu.

Biểu diễn dưới dạng JSON
{
  "primalBound": number,
  "dualBound": number
}
Trường
primalBound

number

Trình giải quyết tuyên bố giá trị tối ưu bằng hoặc tốt hơn (nhỏ hơn để giảm thiểu và lớn hơn để tối đa hoá) so với giá trị ban đầu tuỳ thuộc vào độ khả thi của trình giải (xem cảnh báo bên dưới): * Giới hạn nguyên tố là không đáng kể (+inf để giảm thiểu và tối đa hoá -inf) khi trình giải không tuyên bố có giới hạn đó. * Giới hạn nguyên tố có thể gần với giá trị tối ưu hơn mục tiêu của giải pháp nguyên tố khả thi tốt nhất. Cụ thể, nativealBound có thể là không nhỏ ngay cả khi không có giải pháp cơ bản khả thi nào được trả về. Cảnh báo: Tuyên bố chính xác là có một giải pháp ban đầu: * khả thi về mặt số học (tức là khả thi tuỳ thuộc vào khả năng chấp nhận của trình giải) và * có giá trị ban đầu mục tiêu. Giải pháp khả thi về mặt số học này có thể hơi không khả thi, trong trường hợp này PrialBound có thể tốt hơn giá trị tối ưu. Việc chuyển đổi dung sai khả thi nguyên gốc thành dung sai trên PrialBound là không nhỏ, đặc biệt khi dung sai khả thi tương đối lớn (ví dụ: khi giải quyết bằng PDLP).

dualBound

number

Trình giải toán tuyên bố giá trị tối ưu bằng hoặc kém hơn (lớn hơn để giảm thiểu và nhỏ hơn để tối đa hoá) so với Dual Tương tự với nativealBound, điều này có thể xảy ra với một số trình giải ngay cả khi trả về giá trị tối ưu. Trình giải mã MIP thường sẽ báo cáo một giới hạn ngay cả khi thông tin đó không chính xác. * đối với các bài toán liên tục, DualBound có thể gần giá trị tối ưu hơn mục tiêu của giải pháp kép khả thi tốt nhất. Đối với MIP, một trong những giá trị không quan trọng đầu tiên của DualBound thường là giá trị tối ưu của việc nới lỏng LP của MIP. * DualBound phải tốt hơn (nhỏ hơn để giảm tối đa và lớn hơn để tối đa hoá) so với giới hạn nguyên thuỷ cho đến dung sai của trình giải (xem cảnh báo bên dưới). Cảnh báo: * Đối với các bài toán liên tục, tuyên bố chính xác là có một lời giải kép mà: * khả thi về mặt số học (nghĩa là khả thi tuỳ theo mức độ chấp nhận của người giải) và * có giá trị mục tiêu DualBound. Giải pháp khả thi về mặt số lượng này có thể hơi không khả thi, trong trường hợp đó, DualBound có thể nghiêm trọng hơn so với giá trị tối ưu và native_Bound. Tương tự như trường hợp sơ cấp, dung sai khả thi kép thành dung sai trên DualBound là không nhỏ, đặc biệt khi dung sai khả thi tương đối lớn. Tuy nhiên, một số trình giải sẽ cung cấp phiên bản DualBound đã sửa có thể an toàn hơn về mặt số. Bạn có thể truy cập vào phiên bản đã sửa này thông qua dữ liệu đầu ra cụ thể của trình giải quyết (ví dụ: đối với PDLP, PDlp_output.collectergence_information.corrected_dual_objective). * Đối với trình giải mã MIP, DualBound có thể liên kết với một giải pháp kép để thư giãn liên tục (ví dụ: thư giãn LP). Tuy nhiên, đây thường là hệ quả phức tạp của việc thực thi trình giải và thường không chính xác hơn giới hạn mà trình giải LP báo cáo.

SolutionProto

Nội dung có trong một lời giải phụ thuộc vào loại bài toán và cách giải. Các mẫu phổ biến hiện tại là 1. Trình giải MIP chỉ trả về một giải pháp sơ cấp. 2. Trình giải LP của Simplex thường trả về một cơ sở và các lời giải nguyên thuỷ và nghiệm kép liên quan đến cơ sở đó. 3. Các trình giải liên tục khác thường trả về một nghiệm nguyên hàm và nghiệm kép kết nối với nhau theo dạng phụ thuộc vào trình giải.

Các yêu cầu: * phải đặt ít nhất một trường; không được để trống một nghiệm.

Biểu diễn dưới dạng JSON
{
  "primalSolution": {
    object (PrimalSolutionProto)
  },
  "dualSolution": {
    object (DualSolutionProto)
  },
  "basis": {
    object (BasisProto)
  }
}
Trường
primalSolution

object (PrimalSolutionProto)

dualSolution

object (DualSolutionProto)

basis

object (BasisProto)

PrimalSolutionProto

Giải pháp cho bài toán tối ưu hoá.

Ví dụ: xét một chương trình tuyến tính đơn giản: min c * x s.t. A * x >= b x >= 0. Giải pháp gốc là giá trị gán cho x. Có thể xảy ra nếu nó thoả mãn A * x >= b và x >= 0 ở trên. Trong thông báo PrimalSolutionProto bên dưới, VariableValues là x và visibilityValue là c * x.

Biểu diễn dưới dạng JSON
{
  "variableValues": {
    object (SparseDoubleVectorProto)
  },
  "objectiveValue": number,
  "auxiliaryObjectiveValues": {
    string: number,
    ...
  },
  "feasibilityStatus": enum (SolutionStatusProto)
}
Trường
variableValues

object (SparseDoubleVectorProto)

Yêu cầu: * variableValues.ids là các phần tử của VariablesProto.ids. * tất cả biếnValues.values phải là hữu hạn.

objectiveValue

number

Giá trị mục tiêu do trình giải cơ bản tính toán. Không được là vô hạn hoặc NaN.

auxiliaryObjectiveValues

map (key: string (int64 format), value: number)

Các giá trị mục tiêu phụ do trình giải cơ bản tính toán. Khoá phải là mã nhận dạng mục tiêu phụ hợp lệ. Giá trị không được là vô hạn hoặc NaN.

Một đối tượng chứa danh sách các cặp "key": value. Ví dụ: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

feasibilityStatus

enum (SolutionStatusProto)

Trạng thái khả thi của giải pháp dựa trên trình giải cơ bản.

DualSolutionProto

Một giải pháp cho kép của một bài toán tối ưu hoá.

Ví dụ: xét cặp chương trình tuyến tính cặp nguyên gốc: (Primal) (Kép) min c * x max b * y s.t. A * x >= b s.t. y * A + r = c x >= 0 y, r >= 0. Nghiệm kép là cặp (y, r). Có thể thực hiện được nếu đáp ứng các điều kiện ràng buộc từ (Kép) ở trên.

Trong thông báo bên dưới, y là giá trị kép, r là giảm chi phí và b * y là giá trị mục tiêu.

Biểu diễn dưới dạng JSON
{
  "dualValues": {
    object (SparseDoubleVectorProto)
  },
  "reducedCosts": {
    object (SparseDoubleVectorProto)
  },
  "feasibilityStatus": enum (SolutionStatusProto),
  "objectiveValue": number
}
Trường
dualValues

object (SparseDoubleVectorProto)

Yêu cầu: * DualValues.ids là các phần tử của LinearConstraints.ids. * tất cả giá trị DualValues.values phải là hữu hạn.

reducedCosts

object (SparseDoubleVectorProto)

Yêu cầu: * giảmCosts.ids là các thành phần của VariablesProto.ids. * Tất cả giá trị giảmChi phí.giá trị phải là hữu hạn.

feasibilityStatus

enum (SolutionStatusProto)

Trạng thái khả thi của giải pháp dựa trên trình giải cơ bản.

objectiveValue

number

PrimalRayProto

Hướng cải thiện không giới hạn cho một vấn đề tối ưu hoá; tương đương là chứng chỉ tính không khả thi cho kép của bài toán tối ưu hoá.

Ví dụ: xét một chương trình tuyến tính đơn giản: min c * x s.t. A * x >= b x >= 0 Một tia nguyên thuỷ là một x thoả mãn: c * x < 0 A * x >= 0 x >= 0 Quan sát thấy rằng khi cho một nghiệm khả thi, mọi bội số dương của tia nguyên tố cộng với nghiệm đó vẫn khả thi và cho giá trị khách quan tốt hơn. Tia nguyên tố cũng chứng minh bài toán tối ưu hoá kép bất khả thi.

Trong thông báo PrimalRay bên dưới, VariableValues là x.

Biểu diễn dưới dạng JSON
{
  "variableValues": {
    object (SparseDoubleVectorProto)
  }
}
Trường
variableValues

object (SparseDoubleVectorProto)

Yêu cầu: * variableValues.ids là các phần tử của VariablesProto.ids. * tất cả biếnValues.values phải là hữu hạn.

DualRayProto

Hướng cải tiến không giới hạn đối với vấn đề kép của tối ưu hoá; tương đương là chứng nhận tính không khả thi ban đầu.

Ví dụ: xét cặp chương trình tuyến tính cặp nguyên gốc: (Primal) (Kép) min c * x max b * y s.t. A * x >= b s.t. y * A + r = c x >= 0 y, r >= 0. Tia kép là cặp (y, r) thoả mãn: b * y > 0 y * A + r = 0 y, r >= 0 Quan sát thấy rằng việc thêm bội số dương của (y, r) vào giải pháp khả thi kép sẽ duy trì tính khả thi kép và cải thiện mục tiêu (chứng minh đối tượng kép là không bị ràng buộc). Tia kép cũng chứng minh bài toán nguyên thuỷ là không khả thi.

Trong thông báo DualRay bên dưới, y là DualValues và r là discountCosts.

Biểu diễn dưới dạng JSON
{
  "dualValues": {
    object (SparseDoubleVectorProto)
  },
  "reducedCosts": {
    object (SparseDoubleVectorProto)
  }
}
Trường
dualValues

object (SparseDoubleVectorProto)

Yêu cầu: * DualValues.ids là các phần tử của LinearConstraints.ids. * tất cả giá trị DualValues.values phải là hữu hạn.

reducedCosts

object (SparseDoubleVectorProto)

Yêu cầu: * giảmCosts.ids là các thành phần của VariablesProto.ids. * Tất cả giá trị giảmChi phí.giá trị phải là hữu hạn.

SolveStatsProto

Biểu diễn dưới dạng JSON
{
  "solveTime": string,
  "problemStatus": {
    object (ProblemStatusProto)
  },
  "simplexIterations": string,
  "barrierIterations": string,
  "firstOrderIterations": string,
  "nodeCount": string
}
Trường
solveTime

string (Duration format)

Thời gian của đồng hồ treo tường đã trôi qua được đo bằng đo bằng toán_opt, xấp xỉ thời gian trong Trình giải::Solve(). Lưu ý: giá trị này không bao gồm việc xây dựng mô hình đã hoàn tất.

Thời lượng tính bằng giây với tối đa 9 chữ số phân số, kết thúc bằng "s". Ví dụ: "3.5s".

problemStatus

object (ProblemStatusProto)

Trạng thái khả thi cho bài toán nguyên thuỷ và bài toán kép.

simplexIterations

string (int64 format)

barrierIterations

string (int64 format)

firstOrderIterations

string (int64 format)

nodeCount

string (int64 format)