Method: mathopt.solveMathOptModel

Giải mô hình đầu vào và trả về kết quả ngay lập tức. Sử dụng tính năng 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 toán để giải bài toán dạng số. Lưu ý rằng nếu trình giải toán 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. Biểu diễn toán học về 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 giải pháp duy nhất. Tham số enableOutput được xử lý cụ thể. Đối với các trình giải toán hỗ trợ lệnh gọi lại thông báo, việc đặt giá trị này thành true (đúng) sẽ yêu cầu máy chủ đăng ký lệnh gọi lại thông báo. Các thông báo kết quả sẽ được trả về trong SolveMathOptModelResponse.messages. Đối với các 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 giải pháp cụ thể 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

Phản hồi cho một thao tác giải quyết từ xa một ngôi 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)

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

messages[]

string

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

SolverTypeProto

Các trình giải toán mà MathOpt hỗ trợ.

Enum
SOLVER_TYPE_UNSPECIFIED
SOLVER_TYPE_GSCIP

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

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

SOLVER_TYPE_GUROBI

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

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

SOLVER_TYPE_GLOP

Trình phân giải Gốm màn hình của Google.

Hỗ trợ LP với phương thức đơn giản và nguyên gốc.

SOLVER_TYPE_CP_SAT

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

Hỗ trợ các sự cố trong đó tất cả các biến đều là số nguyên và bị giới hạn (hoặc được ngụ ý sau khi giải quyết). Hỗ trợ thử nghiệm để thay đổi kích thước và làm rõ vấn đề bằng các biến liên tục.

SOLVER_TYPE_PDLP

Trình giải quyết vấn đề Ngăn chặn mất dữ liệu (PDLP) của Google.

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

SOLVER_TYPE_GLPK

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

Hỗ trợ MIP và LP.

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

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

SOLVER_TYPE_OSQP

Trình giải toán Chương trình phân chia toán tử (OSQP) (bên thứ ba).

Hỗ trợ các bài toán liên tục có điều kiện ràng buộc tuyến tính và mục tiêu bậc hai lồi hoặc tuyến tính. 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 đề LP và SOCP. Sử dụng các phương pháp điểm bên trong (hàng rào).

SOLVER_TYPE_SCS

The Splitting Conic Solver (SCS) (bên thứ ba).

Hỗ trợ các vấn đề 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 đề về LP và MIP (chưa triển khai các QP lồi).

SOLVER_TYPE_SANTORINI

Cách triển khai tham chiếu trình giải MIP của MathOpt.

Chậm/không nên dùng cho quá trình sản xuất. 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 với các giới hạn hữu hạn không bắt buộ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), giảm thiểu hoặc tối đa. - Một số loại ràng buộc, bao gồm: * Các ràng buộc tuyến tính * Các ràng buộc bậc hai * Các ràng buộc về nón bậc hai * Các ràng buộc logic > Các ràng buộc SOS1 và SOS2 > Các ràng buộc của chỉ báo

Theo mặc định, các điều kiện ràng buộc được thể hiện trong bản đồ "mã nhận dạng với dữ liệu". Tuy nhiên, chúng ta biểu diễn các ràng buộc tuyến tính ở định dạng "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 của mô hình.

auxiliaryObjectives

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

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

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

Đố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)

Các hệ số biến cho các điều kiện ràng buộc tuyến tính.

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

Yêu cầu: * linearConstraintMatrix.row_ids là các phần tử củaLinearConstraints.ids. * linearConstraintMatrix.column_ids là các phần tử của biến.ids. * Các mục nhập ma trận chưa được chỉ định bằng 0. * LinearConstraintMatrix.values phải là tất cả 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.

Đố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 quy tắc ràng buộc của nón bậc hai trong mô hình.

Đố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, ràng buộc rằng tối đa một expression có thể khác 0. Các mục nhập weights không bắt buộc là thông tin chi tiết 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 các nút con "cân bằng".

Đố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 của SOS2 trong mô hình này ràng buộc rằng tối đa hai mục nhập của expression có thể khác 0 và phải ở cạnh nhau theo thứ tự tương ứng. Nếu không có weights nào được cung cấp, thì thứ tự này sẽ là thứ tự tuyến tính của chúng trong danh sách expressions; nếu weights được hiển thị, thứ tự sẽ được thực hiện so với các giá trị này theo thứ tự tăng dần.

Đố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 quy tắc ràng buộc về chỉ báo trong mô hình sẽ thực thi điều đó nếu đặt một "biến chỉ báo" nhị phân thành 1, thì "quy tắc ràng buộc ngụ ý" phải giữ nguyên.

Đố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ư được sử dụng dưới đây, chúng tôi xác định "#variables" = size(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 là số không âm và tăng dần. Không thể 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à tất cả các chuỗi trống. Nếu không, 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à giảm thiểu, true là tối đa hóa

offset

number

Phải hữu hạn và không phải NaN.

linearCoefficients

object (SparseDoubleVectorProto)

Thuật ngữ ObjectiveProto tuyến tính trong các biến quyết định.

Yêu cầu: * LinearCodisableds.ids là các phần tử của VariablesProto.ids. * VariablesProto không được chỉ định tương ứng với 0. * LinearCoValids.values đều phải là hữu hạn. * LinearCosystems.values có thể bằng 0, nhưng việc này chỉ lãng phí không gian.

quadraticCoefficients

object (SparseDoubleMatrixProto)

Cụm từ khách quan mang tính bậc hai trong các biến quyết định.

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

Lưu ý: * Các thuật ngữ không được lưu trữ rõ ràng có hệ số bằng 0. * Các phần tử của hệ số bậc hai có thể bằng 0, nhưng việc này chỉ gây lãng phí không gian.

name

string

Các thông báo gốc có thể có yêu cầu về tính riêng biệt trong trường này; ví dụ: xem ModelProto.objectives và AuxiliaryObjectivesUpdatesProto.new_objectives.

priority

string (int64 format)

Đối với các bài toán đ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 (càng thấp thì càng quan trọng). 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 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 có cùng mức độ ưu tiên.

SparseDoubleVectorProto

Biểu diễn thưa của một vectơ nhân đô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

Biểu diễn thưa của một ma trận nhân đôi.

Ma trận được lưu trữ dưới dạng bộ ba mã nhận dạng 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ả giá trị i, bộ dữ liệu (rowIds[i], columnIds[i]) phải khác biệt. Các mục phải theo thứ tự hàng chính.

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 xác định "#linearConstraint" = 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 là số không âm và tăng dần. Không thể dùng giá trị max(int64).

lowerBounds[]

number

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

upperBounds[]

number

Phải có độ dài bằng #giới hạn 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à tất cả các chuỗi trống. Nếu không, đoạn mã phải có độ dài bằng #hàm ràng buộc tuyến tính.

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

QuadraticConstraintProto

Một ràng buộc bậc hai có dạng: lb <= sum{linearTerms} + sum{quadraticTerms} <= ub.

Nếu một biến liên quan đến quy tắc ràng buộc này bị xoá, thì biến đó sẽ được coi như đượ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 các 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: * dynamicTerms.ids là các phần tử của VariablesProto.ids. * LinearTerms.values đều phải là hữu hạn và không phải là NaN.

Lưu ý: * Các mã biến bị bỏ qua có hệ số tương ứng bằng 0. * LinearTerms.values có thể bằng 0, nhưng việc này chỉ lãng phí không gian.

quadraticTerms

object (SparseDoubleMatrixProto)

Những thuật ngữ bậc hai trong các 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à hình tam giác trên: đối với mỗi i, quadraticTerms.row_ids[i] <= quadraticTerms.column_ids[i].

Lưu ý: * Các thuật ngữ không được lưu trữ rõ ràng có hệ số bằng 0. * Các phần tử của quadraticTerms.cohệ số có thể bằng 0, nhưng việc này chỉ gây lãng phí không gian.

lowerBound

number

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

upperBound

number

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

name

string

Thông báo mẹ có thể có các yêu cầu về tính riêng biệt trên trường này; ví dụ: xem ModelProto.quadratic_Constraintts và QuadraticConstraintUpdatesProto.new_constraints.

SecondOrderConeConstraintProto

Một ràng buộc về hình nón bậc hai của dạng:

|argumentsToNorm||_2 <= upperBound,

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

Nếu một biến liên quan đến quy tắc ràng buộc này bị xoá, thì biến đó sẽ được coi như đượ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ó yêu cầu về tính riêng biệt trong trường này. Ví dụ: xem ModelProto.second_order_cone_constraintsSecondOrderConeConstraintUpdatesProto.new_constraints.

LinearExpressionProto

Biểu diễn thưa của một 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 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ị không được hữu hạn và không được là NaN.

offset

number

Phải hữu hạn và không thể 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 liên quan đến quy tắc ràng buộc này bị xoá, thì biến đó sẽ được coi như đượ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)

Các biểu thức để áp dụng quy tắc ràng buộc SOS: * SOS1: Tối đa một phần tử nhận giá trị khác 0. * SOS2: Tối đa là hai phần tử nhận các giá trị khác 0 và các phần tử đó phải nằm liền kề theo thứ tự lặp lại.

weights[]

number

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

name

string

Thông báo mẹ có thể có các yêu cầu về tính riêng biệt trên trường này; ví dụ: xem ModelProto.sos1_constraints và SosConstraintUpdatesProto.new_constraints.

IndicatorConstraintProto

Dữ liệu biểu thị một điều kiện ràng buộc chỉ báo duy nhất có dạng: Variable(indicatorId) = (activateOnZero ? 0 : 1) ⇒ hạ giới hạn <= 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 coi là được đặt thành 0. Cụ thể, việc xoá biến chỉ báo có nghĩa là giới hạn chỉ báo sẽ trống nếu activateOnZero là false và tương đương với điều kiện ràng buộc tuyến tính nếu activateOnZero là 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 đúng, thì nếu biến chỉ báo nhận giá trị 0, thì ràng buộc ngụ ý phải giữ nguyên. Ngược lại, nếu biến chỉ báo nhận giá trị 1, thì ràng buộc ngụ ý phải giữ.

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 hữu hạn, * expression.ids là một tập con của VariablesProto.ids.

lowerBound

number

Phải có giá trị bằ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ó yêu cầu về tính riêng biệt trong 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, thì điều kiện ràng buộc đối với chỉ báo sẽ bị bỏ qua. Nếu được thiết lập, chúng ta sẽ 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 các điều kiện này, nhưng nếu bạn không thoả mãn điều kiện này, trình giải toán sẽ trả về lỗi khi giải.

SolveParametersProto

Các tham số để kiểm soát một giải pháp duy nhất.

Chứa cả hai tham số chung cho tất cả các trình giải toán (ví dụ: timeLimit) và tham số cho một trình giải toán cụ thể, chẳng hạn như gscip. Nếu một giá trị được đặt trong cả trường phổ biến và trường cụ thể của trình giải, thì chế độ cài đặt cụ thể của 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 giá trị enum không chỉ định giá trị sẽ cho biết trình giải toán đang được sử dụng theo giá trị mặc định.

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

Các tham số phụ thuộc vào mô hình (ví dụ: mức độ ưu tiên phân nhánh được đặt cho mỗi biến) đượ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 cần dành cho bài toán (hoặc vô hạn nếu chưa đặt).

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

Thời lượng tính bằng giây với tối đa 9 chữ số thập phân, 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 quyết. Vị trí của những dấu vết đó phụ thuộc vào trình giải quyết. Đối với SCIP và Gurobi, đây sẽ là các 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 quyết hỗ trợ lệnh gọi lại tin nhắn và người dùng đăng ký lệnh gọi lại cho hàm đó, 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 là LP_ALGORITHM_UNSPECIFIED, hãy sử dụng thuật toán mặc định của trình giải toán.

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

presolve

enum (EmphasisProto)

Cố gắng đơ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 toán nếu {/7}_UNSPECIFIED.

cuts

enum (EmphasisProto)

Nỗ lực để tăng mức nới lỏng LP mạnh 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 {7}_UNSPECIFIED.

LƯU Ý: việc tắt tính năng cắt giảm có thể ngăn lệnh gọi lại có cơ hội thêm đoạn cắt tại MIP_node. Đây là hành vi riêng của một 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 trình giải nếu kênh_UNSPECIFIED.

scaling

enum (EmphasisProto)

Nỗ lực thay đổi kích thước bài toán để cải thiện độ ổn định số hoặc mức nỗ lực mặc định của trình giải nếu {7}_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 toán 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 theo thuật toán (có thể cần cấu hình thêm, ví dụ như một luồng).

Thường được trình giải quyết LP, QP và MIP hỗ trợ, nhưng đối với các trình phân giải MIP, bạn cũng có thể xem nútLimit.

nodeLimit

string (int64 format)

Giới hạn số lượng bài toán phụ được giải trong phương thức 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 toán, bạn có thể dùng tính năng này để giới hạn việc tính toán một cách quyết định (có thể cần cấu hình hơn nữa, ví dụ như một luồng).

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

cutoffLimit

number

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

Khi ngừng hoạt động sớm, trình giải quyết sẽ trả về lý do chấm dứt NO_SOLUTION_FOUND và có giới hạn CUTOFF, đồng thời không cần phải cung cấp thêm thông tin về giải pháp. 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 ngưỡng cắt.

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

Trình giải quyết sẽ dừng sớm ngay khi tìm thấy giải pháp tối thiểu là phù hợp, với lý do kết thúc CÓ THỂ và giới hạn MỤC TIÊU.

bestBoundLimit

number

Trình giải toán sẽ dừng sớm ngay khi chứng minh được ràng buộc tốt nhất ít nhất là phù hợp, với lý do chấm dứt là FEASIBLE hoặc NO_SOLUTION_FOUND và giới hạn Objective.

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

solutionLimit

integer

Trình giải quyết sẽ ngừng 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 là CÓ THỂ 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 để yêu cầu trình giải quyết dừng lại ở giải pháp khả thi đầu tiên tìm được. Lưu ý rằng không có đảm bảo về giá trị mục tiêu cho bất kỳ nghiệm nào được trả về.

Trình giải toán thường sẽ không trả về nhiều giải pháp hơn giới hạn giải pháp, 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, đồng thời chỉ hỗ trợ CP-SAT với giá trị 1.

threads

integer

Nếu được đặt, giá trị này phải lớn hơn 1.

randomSeed

integer

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

Mặc dù tất cả trình giải toán đều có khái niệm hạt giống, nhưng hãy lưu ý rằng các giá trị hợp lệ phụ thuộc vào cách giải thực tế. - Gurobi: [0:GRB_MAXINT] (kể từ 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 quyết sẽ nhận được một 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 MIP.

GAP tuyệt đối là giá trị tuyệt đối của hiệu số 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 cụm từ tìm kiếm tạo ra. Trình giải quyết có thể dừng khi GAP tuyệt đối có giá trị tuyệt đốiGapTolerance (khi được đặt) và trả về giá trị ConstraintINATION_REASON_OPTIMAL.

Phải lớn hơn 0 nếu đặt.

Ngoài ra, hãy xem thêm tỷ lệ phần trăm dạng parameterGapTolerance.

relativeGapTolerance

number

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

GAP tương đối là phiên bản chuẩn hoá của GAP tuyệt đối (được xác định theo GAP tuyệt đối), trong đó việc chuẩn hoá phụ thuộc vào trình giải, ví dụ: 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 thấy.

Trình giải quyết có thể dừng lại khi GAP tương đối đạt tối đa là tỷ lệ tương đốiGapTolerance (khi được đặt) và trả về giá trị termINATION_REASON_OPTIMAL.

Phải lớn hơn 0 nếu đặt.

Ngoài ra, hãy xem thêm tuỳ chọn AmapTolerance (Dung lượng tuyệt đối).

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ó hai chức năng: (1) Đối với những trình giải toán có thể trả về nhiều đáp án, nhóm giải pháp này giới hạn số lượng đáp án sẽ được trả về. (2) Một số trình giải có thể chạy phương pháp phỏng đoán bằng cách sử dụng các giải pháp 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, chẳng hạn như để tìm ra n cách giải phù hợp nhất, bạn phải có thêm cấu hình cụ thể cho trình giải toán.

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 (nguyên bản). Thường có thể đưa ra nghiệm nguyên thuỷ và nghiệm kép, tia nguyên tố/kép đối với các bài toá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 có thể đưa ra nghiệm nguyên thuỷ và nghiệm kép, tia nguyên tố/kép đối với các bài toán nguyên thuỷ/kép không giới hạn và cơ sở.
LP_ALGORITHM_BARRIER Phương pháp chắ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ả dung dịch nguyên tố và dung dịch kép. Một số phương pháp triển khai cũng có thể tạo ra tia trên các vấn đề không ràng buộc/không khả thi. Cơ sở không được đưa ra trừ phi trình giải quyết cơ bản thực hiện "chuyển đổi" và kết thúc bằng đơn giản.
LP_ALGORITHM_FIRST_ORDER Một thuật toán dựa trên phương thức bậc nhất. Những giải pháp này thường sẽ tạo ra cả giải pháp ban đầu và giải pháp kép, cũng như có thể cũng có cả chứng chỉ không khả thi nguyên gốc và/hoặc giải pháp kép. Phương thức bậc nhất thường sẽ cung cấp giải pháp với độ chính xác thấp hơn. Vì vậy, người dùng nên chú ý đặt thông số chất lượng của giải pháp (ví dụ: dung sai) và xác thực giải pháp.

EmphasisProto

Mức độ nỗ lực được áp dụng cho một tác vụ không bắt buộc trong khi giải (xem 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 một trình giải toán 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ẽ có lỗi đối số không hợp lệ (một số trình giải toán cũng có thể chấp nhận TẮT). * Nếu trình giải toán hỗ trợ tính năng: – Khi bạn đặt thành UNSPECIFIED, giá trị mặc định cơ bản sẽ được dùng. – Khi không thể tắt tính năng này, trạng thái TẮT sẽ trả về lỗi. – Nếu tính năng này được bật theo mặc định thì chế độ mặc định của trình giải thường được ánh xạ tới TRUNG BÌNH. – Nếu tính năng này được hỗ trợ, các hàm LOW, TRUNG BÌNH, HIGH và VERY HIGH sẽ không bao giờ hiển thị lỗi và sẽ được đánh dấu dựa trên kết quả phù hợp nhất.

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 đượ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: * Giá trị nhận dạng được lọc 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).

Yêu cầu: * *Ids là các 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 được trả về được khoá theo các biến trong DualSolutionProto và DualRay (DualSolutionProto.reduced_costs, DualRay.reduced_costs).

Yêu cầu: * Giá trị nhận dạng được lọc là các phần tử của VariablesProto.ids.

initialBasis

object (BasisProto)

Cơ sở ban đầu không bắt buộc cho trình phân 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 ý, 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. Các biến có giá trị cao hơn sẽ được phân nhánh trước. Các biến không đặt mức độ ưu tiên sẽ nhận được mức độ ưu tiên mặc định của trình giải (thường là 0).

Yêu cầu: * detailsingPreferences.values phải là giá trị hữu hạn. * Phân nhánh{0/}id 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 SparseXxxxVector. Hành vi mặc định là không lọc bỏ bất cứ thứ gì. Một cách sử dụng phổ biến là chỉ truy vấn các phần của nghiệm (chỉ các giá trị khác 0 và/hoặc chỉ truy vấn 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 giá trị là true, 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 (đúng). Phải để trống khi filterByIds có giá trị false. LƯU Ý: nếu giá trị này trống và filterByIds là true, tức là bạn đang nói rằng bạn không muốn có bất kỳ thông tin nào trong kết quả.

BasisProto

Đặc tính tổ hợp để tìm lời giải cho 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 khả thi cơ bản" có thể được mô tả kết hợp bằng cơ sở. Cơ sở sẽ chỉ định BasisStatusProto cho mọi quy tắc ràng buộc biến và 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 so với hạn chế và có thứ hạng hàng đầy đủ là 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 vấn đề này có thể được xây dựng như sau: * Tất cả ràng buộc sẽ có trạng thái cơ sở FIXED. * Chọn m biến sao cho các cột A là độc lập tuyến tính và gán trạng thái cơ bản. * Chỉ định trạng thái AT_LEFT cho các biến n – m còn lại.

Nghiệm cơ bản cho cơ sở này là nghiệm duy nhất của A * x = b có tất cả các biến có trạng thái AT_LEFT cố định vào 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ở của quy tắc ràng buộc.

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

variableStatus

object (SparseBasisStatusVector)

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

Yêu cầu: * ConstraintStatus.ids bằng VariablesProto.ids.

basicDualFeasibility

enum (SolutionStatusProto)

Đây là một tính năng nâng cao mà 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 (các giải pháp tối ưu sẽ luôn có trạng thái SOLUTION_STATUS_FEASIBLE).

Đối với LP một mặt, giá trị này phải bằng với trạng thái khả thi của giải pháp kép đã liên kết. Đối với LP hai mặt, giá trị này có thể khác trong một số trường hợp hiếm gặp (ví dụ: các nghiệm không hoàn toàn với đơ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, giá trị này sẽ bị bỏ qua. Dữ liệu này chỉ phù hợp với cơ sở mà SolutionProto.basis trả về.

SparseBasisStatusVector

Biểu diễn thưa một vectơ 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ệ không biểu thị trạng thái nào.
BASIS_STATUS_FREE Biến/giới hạn là tự do (không có giới hạn hữu hạn).
BASIS_STATUS_AT_LOWER_BOUND Biến/ràng buộc ở giới hạn dưới (phải có giới hạn).
BASIS_STATUS_AT_UPPER_BOUND Biến/giới hạn nằm ở giới hạn trên (phải có giới 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 có giới hạn giống hệt nhau.
BASIS_STATUS_BASIC Biến/quy tắc ràng buộc ở đây là cơ bản.

SolutionStatusProto

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

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

SolutionHintProto

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

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

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

Cách người giải quyết sử dụng gợi ý (nếu có) phụ thuộc nhiều vào cách giải, dạng 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ó hiệu quả là đọc nhật ký của trình giải cơ bản có và không có gợi ý.

Các trình giải LP dạng đơn giản thường ưu tiên cơ sở ban đầu là gợi ý giải pháp (nếu không thì họ cần chuyển đổi gợi ý để 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 gốc của bài toán. Các yêu cầu độc lập với trình giải quyết cho thông báo phụ này là: * VariableValues.ids là các phần tử của VariablesProto.ids. * biếnValues.values phải là giá trị hữu hạn.

dualValues

object (SparseDoubleVectorProto)

Chỉ định (có thể là một phần) 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ị képValues.values phải là hữu hạn.

SparseInt32VectorProto

Biểu diễn thưa của một vectơ int.

Biểu diễn dưới dạng JSON
{
  "ids": [
    string
  ],
  "values": [
    integer
  ]
}
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[]

integer

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

SolveResultProto

Hợp đồng về thời điểm dung dịch nguyên thuỷ/giải pháp kép/tia sáng phức tạp, hãy truy cập vào join_reasons.md để biết nội dung mô tả đầy đủ.

Cho đến khi ký kết một hợp đồng chính xác, cách an toàn nhất là chỉ cần kiểm tra xem có giải pháp/tia UV 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)

Nguyên nhân khiến trình giải toán dừng hoạt động.

solutions[]

object (SolutionProto)

Hợp đồng chung về thứ tự các 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. Các giải pháp có giải pháp khả thi sơ cấp, được sắp xếp theo mục tiêu sơ cấp 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 (mục tiêu kép chưa xác định là mục tiêu kém nhất) 3. Bạn có thể trả về tất cả dung dịch còn lại theo thứ tự bất kỳ.

primalRays[]

object (PrimalRayProto)

Hướng dẫn cải thiện nguyên gốc không giới hạn hoặc tương đương với chứng chỉ không khả thi kép. Thường được cung cấp cho ExpirationReasonProtos UNBOUNDED và DUAL_INFEASIBLE

dualRays[]

object (DualRayProto)

Hướng dẫn về cải tiến kép không ràng buộc hoặc chứng chỉ không khả thi nguyên gốc tương đương. Thường được cung cấp cho termReasonProto INFEASIBLE.

solveStats

object (SolveStatsProto)

Số liệu thống kê về quy 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 về lý do tại sao lệnh gọi đến Solve() bị chấm dứt.

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à TERMSINATION_REASON_FEASIBLE hoặc TERMSINATION_REASON_NO_SOLUTION_FOUND, hãy xem limit để biết thông tin chi tiết.

limit

enum (LimitProto)

là LIMIT_UNSPECIFIED, trừ phi lý do là TERMSINATION_REASON_FEASIBLE hoặc TERMSINATION_REASON_NO_SOLUTION_FOUND. Không phải tất cả trình giải quyết đều có thể xác định giới hạn dẫn đến việc chấm dứt tài khoản, LIMIT_UNDEtermINED được sử dụng khi không xác định được nguyên nhân.

detail

string

Thông tin bổ sung thường giải quyết thông tin cụ thể về việc chấm dứt.

problemStatus

object (ProblemStatusProto)

Trạng thái khả thi cho bài toán nguyên gốc và bài toán kép. Kể từ ngày 18 tháng 7 năm 2023, thư này có thể bị thiếu. Nếu thiếu, bạn có thể tìm thấy issueStatus 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ể bị thiếu. Nếu bị thiếu, bạn có thể tìm thấy targetBounds.primal_bound trong SolveResultProto.solve.stats.best_primal_bound và leadBounds.dual_bound trong SolveResultProto.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 ra nghiệm tối ưu có thể chứng minh được (lên đến dung sai bằng số).
TERMINATION_REASON_INFEASIBLE Vấn đề sơ cấp không có giải pháp khả thi.
TERMINATION_REASON_UNBOUNDED Vấn đề nguyên gốc là khả thi và có thể tìm thấy các giải pháp tối ưu tuỳ ý dọc theo tia nguyên gốc.
TERMINATION_REASON_INFEASIBLE_OR_UNBOUNDED Vấn đề ban đầu là 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 ánh xạ ở đây.
TERMINATION_REASON_IMPRECISE

Sự cố đã được giải quyết theo một trong các tiêu chí ở trên (Tối ưu, Không khả thi, Không bị ràng buộc hoặc Không thể giới hạn hoặc Không thể giới hạn), nhưng ít nhất một dung sai chưa được đáp ứng. Một số giải pháp/tia ban đầu/kép đã có mặt, nhưng những giải pháp này ít khả thi hoặc (nếu vấn đề gần như đã được tối ưu) nhưng 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 nghiệm nguyên thuỷ/giải pháp kép/tia và số liệu thống kê về nghiệm, nhưng họ phải chịu trách nhiệm xử lý hiện tượng sai số.

TERMINATION_REASON_FEASIBLE Trình tối ưu hoá đã đạt đến loại giới hạn nào đó và giải pháp khả thi gốc được trả về. 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 khả thi gốc. 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 lại 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 đã ngừng hoạt động vì một lỗi không thuộc một trong các trạng thái đã xác định ở trên. Không có thông tin về giải pháp.

LimitProto

Khi một Solve() ngừng sớm bằng TermReasonProto FEASIBLE hoặc NO_SOLUTION_FOUND, thì đây là giới hạn cụ thể đã đạt đến.

Enum
LIMIT_UNSPECIFIED Được sử dụng làm giá trị rỗng khi chúng tôi chấm dứt không phải trong một giới hạn (ví dụ: termINATION_REASON_OPTIMAL).
LIMIT_UNDETERMINED Trình giải toán cơ bản không cho biết giới hạn đã đạt đến.
LIMIT_ITERATION Một thuật toán lặp lại đã dừng sau khi tiến hành số lần lặp tối đa (ví dụ: vòng lặp đơn giản hoặc rào cản).
LIMIT_TIME Thuật toán đã 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 vì 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 đã ngừng hoạt động vì tìm thấy số lượng giải pháp cần thiết. Tính năng này thường được dùng trong MIP để yêu cầu trình giải toán trả về giải pháp khả thi đầu tiên mà hệ thống gặp phải.
LIMIT_MEMORY Thuật toán đã ngừng hoạt động vì hết bộ nhớ.
LIMIT_CUTOFF Trình giải toán đã chạy với điểm hạn chế (ví dụ: đã đặt SolveParameters.cutoff_limit) trên mục tiêu, cho biết rằng người dùng không muốn có bất kỳ giải pháp nào tệ hơn điểm cắt và trình giải giải kết luận là không có giải pháp nào ít nhất bằng điểm cắt. Thường thì Google sẽ không cung cấp thêm thông tin về giải pháp.
LIMIT_OBJECTIVE Thuật toán đã ngừng hoạt động vì đã tìm thấy một giải pháp hoặc một 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 đã ngừng hoạt động vì tiêu chuẩn của một vòng lặp trở nên quá lớn.
LIMIT_INTERRUPTED Thuật toán đã dừng lại do tín hiệu gián đoạn hoặc yêu cầu làm gián đoạn của người dùng.
LIMIT_SLOW_PROGRESS Thuật toán đã ngừng hoạt động vì không thể tiếp tục cải tiến giải pháp.
LIMIT_OTHER

Thuật toán đã ngừng hoạt động do một giới hạn không được đề cập ở trên. Lưu ý rằng LIMIT_UNDEtermINED được sử dụng khi không thể xác định 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ỳ phương án thay thế nào ở trên.

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

ProblemStatusProto

Trạng thái khả thi của vấn đề nguyên gốc và vấn đề kép của vấn đề này (hoặc kép của một quá trình thư giãn liên tục) theo tuyên bố của người giải quyết. Trình giải quyết không bắt buộc phải trả lại chứng chỉ cho tuyên bố (ví dụ: trình giải quyết có thể tuyên bố về tính khả thi ban đầu mà không trả về một giải pháp khả thi ban đầu). Trạng thái kết hợp này cung cấp thông tin mô tả toàn diện về 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 đã giải. Ví dụ:

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

Lưu ý rằng trạng thái không khả thi kép (tức là đi kèm với trạng thái nguyên gốc chưa được xác định) không ngụ ý vấn đề nguyên gốc không bị ràng buộc vì chúng ta có thể khiến cả hai vấn đề đều không khả thi. Ngoài ra, mặc dù trạng thái khả thi ban đầu và trạng thái khả thi kép có thể ngụ ý sự tồn tại của một giải pháp tối ưu nhưng điều này không đảm bảo rằng trình giải toán thực sự tìm thấy 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 bài toán kép (hoặc bài toán kép khi thư giãn liên tục).

primalOrDualInfeasible

boolean

Nếu đúng, trình giải toán tuyên bố bài toán nguyên gốc hoặc bài toán kép là không khả thi, nhưng không biết bài toán nào (hoặc cả hai có khả thi hay không). Chỉ có thể đúng khi Prial_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 không có giải pháp tối ưu cho vấn đề (nhưng không thể xác định liệu vấn đề là do tính không khả thi, không bị ràng buộc hay cả hai).

FeasibilityStatusProto

Trạng thái khả thi của vấn đề theo tuyên bố của trình giải quyết (không yêu cầu người giải quyết trả lại chứng chỉ cho yêu cầu xác nhận quyền sở hữu).

Enum
FEASIBILITY_STATUS_UNSPECIFIED Giá trị bảo vệ không biểu thị trạng thái nào.
FEASIBILITY_STATUS_UNDETERMINED Trình giải quyết không xác nhận trạng thái.
FEASIBILITY_STATUS_FEASIBLE Solver tuyên bố vấn đề này có thể thực hiện được.
FEASIBILITY_STATUS_INFEASIBLE Solver tuyên bố sự cố 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 toán tuyên bố rằng giá trị tối ưu bằng hoặc tốt hơn (nhỏ hơn để giảm tối đa và lớn hơn để tối đa hoá) so với PrialBound để dung sai tính khả thi ban đầu của bộ giải (xem cảnh báo dưới đây): * PrialBound là không đáng kể (+inf để tối thiểu hoá và tối đa hoá -inf) khi trình giải toán không tuyên bố là có sự ràng buộc như vậy. * PrialBound có thể gần với giá trị tối ưu hơn mục tiêu của giải pháp khả thi gốc tốt nhất. Cụ thể, PrialBound có thể không nhỏ ngay cả khi không có giải pháp 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 nguyên gốc: * khả thi về mặt số học (tức là khả thi theo khả năng chấp nhận của trình giải toán) và * có giá trị mục tiêu PrialBound. Giải pháp khả thi về mặt số lượng này có thể không khả thi một chút, trong trường hợp đó, PrialBound có thể tốt hơn giá trị tối ưu. Việc dịch dung sai khả thi ban đầu cho 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 để tối thiểu hoá và nhỏ hơn để tối đa hoá) so với DualBound cho phép dung sai khả năng kép của bộ giải (xem cảnh báo bên dưới): * DualBound là không đáng kể (-inf để giảm tối đa và +inf tối đa hoá) khi trình giải toán không tuyên bố rằng có sự ràng buộc như vậy. Tương tự như PrialBound, điều này có thể xảy ra với một số trình giải quyết ngay cả khi trả về giá trị tối ưu. Trình giải quyết MIP thường sẽ báo cáo ràng buộc 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 với giá trị tối ưu hơn so với mục tiêu của giải pháp khả thi kép tốt nhất. Đối với MIP, một trong các giá trị không quan trọng đầu tiên của doubleBound 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 để tối đa hoá và lớn hơn để tối đa hoá) so với PrialBound tối đa dung sai của trình giải quyết (xem cảnh báo dưới đây). 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 giải pháp kép: * khả thi về mặt số học (tức là khả thi theo khả năng chấp nhận của trình giải toán) và * có giá trị mục tiêu képBound. Giải pháp khả thi về mặt số lượng này có thể không khả thi một chút, trong trường hợp đó DualBound có thể kém hơn so với giá trị tối ưu và PrialBound. Tương tự như trường hợp ban đầu, việc chuyển đổi dung sai khả thi kép thành dung sai trên DualBound là không hề nhỏ, đặc biệt khi dung sai khả thi tương đối lớn. Tuy nhiên, một số trình giải toán cung cấp một phiên bản đã sửa của DualBound có thể an toàn hơn về mặt số học. Bạn có thể truy cập vào phiên bản đã sửa lỗi này thông qua kết quả cụ thể của trình giải toán (ví dụ: PDlp_output.convergence_information.corrected_dual_objective) * Đối với các trình giải MIP, DualBound có thể được liên kết với một giải pháp kép để giải quyết một số trường hợ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 quá trình thực thi các trình phân giải và thường không chính xác hơn so với các giới hạn mà các trình giải LP báo cáo.

SolutionProto

Những nội dung trong giải pháp sẽ tuỳ thuộc vào loại vấn đề và cách giải quyết. Một mẫu hình phổ biến hiện nay là 1. Trình phân giải MIP chỉ trả về giải pháp nguyên thuỷ. 2. Các trình giải LP đơn giản thường trả về cơ sở và nghiệm nguyên tố và nghiệm kép liên quan đến cơ sở này. 3. Các phép giải liên tục khác thường trả về một nghiệm nguyên thuỷ và nghiệm kép. Các nghiệm này kết nối với nhau dưới dạng phụ thuộc vào trình giải.

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

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 một vấn đề tối ưu hoá.

Ví dụ: hãy xem 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. Nghiệm nguyên sơ là gán các giá trị cho x. Điều này có thể xảy ra nếu nó thỏa mãn A * x >= b và x >= 0 từ trên xuống. Trong thông báo PrimalSolutionProto bên dưới, variableValues là x và customerValue 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. * biếnValues.values phải là giá trị hữu hạn.

objectiveValue

number

Giá trị mục tiêu do trình giải toán 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 toán cơ bản tính toán. Khoá phải là mã mục tiêu phụ hợp lệ. Giá trị không được là vô hạn hoặc NaN.

Đố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 theo trình giải quyết cơ bản.

DualSolutionProto

Một giải pháp cho cả vấn đề tối ưu hoá.

Ví dụ: hãy xem xét cặp chương trình tuyến tính cặp nguyên tố: (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). Điều này có thể xảy ra nếu đáp ứng các điều kiện ràng buộc từ (Kép) ở trên.

Trong thông báo dưới đây, y là doubleValues, r là giảmCosts 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ị képValues.values phải là hữu hạn.

reducedCosts

object (SparseDoubleVectorProto)

Yêu cầu: * lượnCosts.ids là các phần tử của VariablesProto.ids. * discountCosts.values phải hữu hạn.

feasibilityStatus

enum (SolutionStatusProto)

Trạng thái khả thi của giải pháp theo trình giải quyết cơ bản.

objectiveValue

number

PrimalRayProto

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

Ví dụ: xem 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 Tia nguyên thuỷ là một x thoả mãn: c * x < 0 A * x >= 0 x >= 0 Tia nguyên tố cũng chứng minh vấn đề tối ưu hoá kép là không 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. * biếnValues.values phải là giá trị hữu hạn.

DualRayProto

Hướng cải thiện không giới hạn đối với cả hai yếu tố tối ưu hoá hoặc vấn đề, tương đương với chứng chỉ tính không khả thi ban đầu.

Ví dụ: hãy xem xét cặp chương trình tuyến tính cặp nguyên tố: (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 việc cộng bội dương của (y, r) vào nghiệm 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 kép không giới hạn). 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 dưới đây, y là doubleValues và r là giảmCosts.

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ị képValues.values phải là hữu hạn.

reducedCosts

object (SparseDoubleVectorProto)

Yêu cầu: * lượnCosts.ids là các phần tử của VariablesProto.ids. * discountCosts.values phải 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 tính bằngMath_opt, xấp xỉ thời gian trong Solver::Solve(). Lưu ý: điều này không bao gồm công việc hoàn tất xây dựng mô hình.

Thời lượng tính bằng giây với tối đa 9 chữ số thập phân, 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 gốc và bài toán kép.

simplexIterations

string (int64 format)

barrierIterations

string (int64 format)

firstOrderIterations

string (int64 format)

nodeCount

string (int64 format)