Method: mathopt.solveMathOptModel

Menyelesaikan model input dan menampilkan hasilnya sekaligus. Gunakan metode ini saat Anda tidak memerlukan callback, inkrementalitas, dan tidak perlu melacak progres penyelesaian.

Permintaan HTTP

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

URL menggunakan sintaksis gRPC Transcoding.

Isi permintaan

Isi permintaan memuat data dengan struktur berikut:

Representasi JSON
{
  "solverType": enum (SolverTypeProto),
  "model": {
    object (ModelProto)
  },
  "parameters": {
    object (SolveParametersProto)
  },
  "modelParameters": {
    object (ModelSolveParametersProto)
  }
}
Kolom
solverType

enum (SolverTypeProto)

Opsional. Jenis pemecah soal untuk menyelesaikan soal secara numerik. Perhatikan bahwa jika pemecah masalah tidak mendukung fitur tertentu dalam model, prosedur pengoptimalan tidak akan berhasil.

model

object (ModelProto)

Wajib diisi. Representasi matematis dari soal pengoptimalan yang harus dipecahkan.

parameters

object (SolveParametersProto)

Opsional. Parameter untuk mengontrol satu penyelesaian. Parameter enableOutput ditangani secara khusus. Untuk pemecah masalah yang mendukung callback pesan, menyetelnya ke benar (true) akan membuat server mendaftarkan callback pesan. Pesan yang dihasilkan akan ditampilkan di SolveMathOptModelResponse.messages. Untuk pemecah masalah lainnya, menyetel enableOutput ke true akan menghasilkan error.

modelParameters

object (ModelSolveParametersProto)

Opsional. Parameter untuk mengontrol solusi tunggal yang spesifik untuk model input (lihat SolveParametersProto untuk parameter independen model).

Isi respons

Respons untuk penyelesaian jarak jauh unary di MathOpt.

Jika berhasil, isi respons memuat data dengan struktur berikut:

Representasi JSON
{
  "result": {
    object (SolveResultProto)
  },
  "messages": [
    string
  ]
}
Kolom
result

object (SolveResultProto)

Deskripsi output dari penyelesaian model dalam permintaan.

messages[]

string

Jika SolveParametersProto.enable_output telah digunakan, ini akan berisi pesan log untuk pemecah masalah yang mendukung callback pesan.

SolverTypeProto

Pemecah soal yang didukung oleh MathOpt.

Enum
SOLVER_TYPE_UNSPECIFIED
SOLVER_TYPE_GSCIP

Pemecah Masalah Constraint Integer Programs (SCIP) (pihak ketiga).

Mendukung soal kuadrat bilangan bulat LP, MIP, dan non-konveks. Namun, tidak ada data ganda untuk halaman landing yang ditampilkan. Pilih GLOP untuk halaman landing.

SOLVER_TYPE_GUROBI

Pemecah masalah Gurobi (pihak ketiga).

Mendukung soal kuadrat bilangan bulat LP, MIP, dan non-konveks. Umumnya merupakan opsi tercepat, tetapi memiliki lisensi khusus.

SOLVER_TYPE_GLOP

Pemecah masalah Glop Google.

Mendukung LP dengan metode simpleks utama dan ganda.

SOLVER_TYPE_CP_SAT

Pemecah masalah CP-SAT Google.

Mendukung masalah ketika semua variabel adalah bilangan bulat dan terikat (atau tersirat setelah ditetapkan). Dukungan eksperimental untuk mengubah skala dan membedakan masalah dengan variabel berkelanjutan.

SOLVER_TYPE_PDLP

Pemecah masalah PDLP Google.

Mendukung tujuan kuadrat diagonal LP dan konveks. Menggunakan metode urutan pertama, bukan simplex. Dapat memecahkan masalah yang sangat besar.

SOLVER_TYPE_GLPK

GNU Linear Programming Kit (GLPK) (pihak ketiga).

Mendukung MIP dan LP.

Thread-safety: GLPK menggunakan penyimpanan thread-local untuk alokasi memori. Akibatnya, instance Solver harus dihancurkan di thread yang sama saat dibuat atau GLPK akan mengalami error. Tampaknya tidak masalah untuk memanggil Solver::Solve() dari thread lain selain yang digunakan untuk membuat Solver tetapi tidak didokumentasikan oleh GLPK dan harus dihindari.

Saat menyelesaikan LP dengan presolver, solusi (dan sinar yang tidak terikat) hanya dikembalikan jika solusi optimal telah ditemukan. Selain itu, tidak ada yang ditampilkan. Lihat glpk-5.0/doc/glpk.pdf halaman #40 yang tersedia dari glpk-5.0.tar.gz untuk detailnya.

SOLVER_TYPE_OSQP

Pemecah Masalah Operator Splitting Quadratic Program (OSQP) (pihak ketiga).

Mendukung masalah berkelanjutan dengan batasan linear dan tujuan kuadrat linear atau konveks. Menggunakan metode urutan pertama.

SOLVER_TYPE_ECOS

Embedded Conic Solver (ECOS) (pihak ketiga).

Mendukung masalah LP dan SOCP. Menggunakan metode titik interior (pembatas).

SOLVER_TYPE_SCS

Splitting Conic Solver (SCS) (pihak ketiga).

Mendukung masalah LP dan SOCP. Menggunakan metode urutan pertama.

SOLVER_TYPE_HIGHS

HiGHS Solver (pihak ketiga).

Mendukung masalah LP dan MIP (QP konveks tidak diterapkan).

SOLVER_TYPE_SANTORINI

Implementasi referensi MathOpt untuk pemecah masalah MIP.

Lambat/tidak direkomendasikan untuk produksi. Bukan pemecah masalah LP (tidak ada informasi ganda yang ditampilkan).

ModelProto

Masalah pengoptimalan. MathOpt mendukung: - Variabel keputusan berkelanjutan dan bilangan bulat dengan batas terbatas opsional. - Tujuan linear dan kuadrat (tujuan tunggal atau beberapa), baik yang diminimalkan atau dimaksimalkan. - Beberapa jenis batasan, termasuk: * Batasan linear * Batasan kuadrat * Batasan kerucut urutan kedua * Batasan logis > Batasan SOS1 dan SOS2 > Batasan indikator

Secara default, batasan dinyatakan dalam "id-to-data" Google Maps. Namun, kami merepresentasikan batasan linier dalam "struct-of-array" yang lebih efisien format font.

Representasi 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)
    },
    ...
  }
}
Kolom
name

string

variables

object (VariablesProto)

objective

object (ObjectiveProto)

Tujuan utama dalam model.

auxiliaryObjectives

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

Tujuan tambahan untuk digunakan dalam model multi-tujuan.

ID tombol peta harus dalam [0, max(int64)). Setiap prioritas, dan setiap nama yang tidak kosong, harus unik dan juga berbeda dari objective utama.

Objek yang berisi daftar pasangan "key": value. Contoh: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

linearConstraints

object (LinearConstraintsProto)

linearConstraintMatrix

object (SparseDoubleMatrixProto)

Koefisien variabel untuk batasan linear.

Jika variabel yang terlibat dalam batasan ini dihapus, variabel akan diperlakukan seolah-olah ditetapkan ke nol.

Persyaratan: * linearConstraintMatrix.row_ids adalah elemen linearConstraints.ids. * linearConstraintMatrix.column_ids adalah elemen variables.ids. * Entri matriks yang tidak ditentukan adalah nol. * linearConstraintMatrix.values semua harus terbatas.

quadraticConstraints

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

Batasan kuadrat dalam model.

Objek yang berisi daftar pasangan "key": value. Contoh: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

secondOrderConeConstraints

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

Batasan kerucut urutan kedua dalam model.

Objek yang berisi daftar pasangan "key": value. Contoh: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

sos1Constraints

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

Batasan SOS1 dalam model, yang membatasi bahwa maksimal satu expression bisa menjadi bukan nol. Entri weights opsional adalah detail implementasi yang digunakan oleh pemecah masalah agar (semoga) dapat dikonvergensi lebih cepat. Secara lebih rinci, pemecah masalah dapat (atau tidak dapat) menggunakan bobot ini untuk memilih keputusan percabangan yang menghasilkan “seimbang” node turunan.

Objek yang berisi daftar pasangan "key": value. Contoh: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

sos2Constraints

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

Batasan SOS2 dalam model, yang membatasi bahwa maksimal dua entri expression boleh bukan nol, dan harus berdekatan dalam urutannya. Jika tidak ada weights yang disediakan, pengurutan ini adalah pengurutan linearnya dalam daftar expressions; jika weights ditampilkan, pengurutan akan diambil sehubungan dengan nilai ini dalam urutan yang meningkat.

Objek yang berisi daftar pasangan "key": value. Contoh: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

indicatorConstraints

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

Batasan indikator dalam model, yang menerapkannya, jika "variabel indikator" biner disetel ke satu, lalu "batasan tersirat" harus ditahan.

Objek yang berisi daftar pasangan "key": value. Contoh: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

VariablesProto

Seperti yang digunakan di bawah ini, kita mendefinisikan "#variables" = size(VariablesProto.id).

Representasi JSON
{
  "ids": [
    string
  ],
  "lowerBounds": [
    number
  ],
  "upperBounds": [
    number
  ],
  "integers": [
    boolean
  ],
  "names": [
    string
  ]
}
Kolom
ids[]

string (int64 format)

Harus berupa angka positif dan meningkat ketat. Nilai max(int64) tidak dapat digunakan.

lowerBounds[]

number

Harus memiliki panjang yang sama dengan #variabel, nilai dalam [-inf, inf).

upperBounds[]

number

Harus memiliki panjang yang sama dengan #variabel, nilai dalam (-inf, inf].

integers[]

boolean

Harus memiliki panjang yang sama dengan #variabel. Nilai adalah false untuk variabel kontinu dan benar untuk variabel bilangan bulat.

names[]

string

Jika tidak disetel, diasumsikan semua string kosong. Jika tidak, panjang harus sama dengan #variables.

Semua nama yang tidak kosong harus berbeda.

ObjectiveProto

Representasi JSON
{
  "maximize": boolean,
  "offset": number,
  "linearCoefficients": {
    object (SparseDoubleVectorProto)
  },
  "quadraticCoefficients": {
    object (SparseDoubleMatrixProto)
  },
  "name": string,
  "priority": string
}
Kolom
maximize

boolean

false adalah minimalkan, true adalah memaksimalkan

offset

number

Harus terbatas dan bukan NaN.

linearCoefficients

object (SparseDoubleVectorProto)

Istilah ObjectiveProto yang linear dalam variabel keputusan.

Persyaratan: * linearCoefficients.id adalah elemen VariablesProto.id. * VariablesProto yang tidak ditentukan sesuai dengan nol. * linearCoefficients.values harus terbatas. * linearCoefficients.values dapat bernilai nol, tetapi ini hanya menyia-nyiakan ruang.

quadraticCoefficients

object (SparseDoubleMatrixProto)

Istilah objektif yang berbentuk kuadrat dalam variabel keputusan.

Persyaratan selain yang ada pada pesan SparseDoubleMatrixProto: * Setiap elemen quadraticCoefficients.row_ids dan setiap elemen quadraticCoefficients.column_ids harus menjadi elemen VariablesProto.ids. * Matriks harus berbentuk segitiga atas: untuk setiap i, quadraticCoefficients.row_ids[i] <= quadraticCoefficients.column_ids[i].

Catatan: * Istilah yang tidak disimpan secara eksplisit memiliki koefisien nol. * Elemen quadraticCoefficients.coefficients dapat bernilai nol, tetapi ini hanya menyia-nyiakan ruang.

name

string

Pesan induk mungkin memiliki persyaratan keunikan di kolom ini; misalnya, lihat ModelProto.objectives dan AuxiliaryObjectivesUpdatesProto.new_objectives.

priority

string (int64 format)

Untuk masalah multi-tujuan, prioritas tujuan ini relatif terhadap yang lain (lebih rendah lebih penting). Nilai ini tidak boleh negatif. Selain itu, setiap prioritas objektif dalam model harus berbeda pada waktu penyelesaian. Kondisi ini tidak divalidasi di tingkat proto, sehingga untuk sementara model mungkin memiliki tujuan dengan prioritas yang sama.

SparseDoubleVectorProto

Representasi renggang dari vektor ganda.

Representasi JSON
{
  "ids": [
    string
  ],
  "values": [
    number
  ]
}
Kolom
ids[]

string (int64 format)

Harus disortir (dalam urutan meningkat) dengan semua elemen berbeda.

values[]

number

Harus memiliki panjang yang sama dengan ID. Mungkin tidak mengandung NaN.

SparseDoubleMatrixProto

Representasi renggang dari matriks ganda.

Matriks disimpan sebagai rangkap tiga dari ID baris, ID kolom, dan koefisien. Ketiga vektor ini harus memiliki panjang yang sama. Untuk semua i, tuple (rowIds[i], columnIds[i]) harus berbeda. Entri harus dalam urutan utama baris.

Representasi JSON
{
  "rowIds": [
    string
  ],
  "columnIds": [
    string
  ],
  "coefficients": [
    number
  ]
}
Kolom
rowIds[]

string (int64 format)

columnIds[]

string (int64 format)

coefficients[]

number

Mungkin tidak mengandung NaN.

LinearConstraintsProto

Seperti yang digunakan di bawah ini, kita mendefinisikan "#linear constraints" = size(LinearConstraintsProto.ids).

Representasi JSON
{
  "ids": [
    string
  ],
  "lowerBounds": [
    number
  ],
  "upperBounds": [
    number
  ],
  "names": [
    string
  ]
}
Kolom
ids[]

string (int64 format)

Harus berupa angka positif dan meningkat ketat. Nilai max(int64) tidak dapat digunakan.

lowerBounds[]

number

Harus memiliki panjang yang sama dengan batasan #linear, nilai dalam [-inf, inf).

upperBounds[]

number

Harus memiliki panjang yang sama dengan batasan #linear, nilai dalam (-inf, inf].

names[]

string

Jika tidak disetel, diasumsikan semua string kosong. Jika tidak, harus memiliki panjang yang sama dengan batasan #linear.

Semua nama yang tidak kosong harus berbeda.

QuadraticConstraintProto

Batasan kuadrat tunggal dari bentuk: lb <= sum{linearTerms} + sum{quadraticTerms} <= ub.

Jika variabel yang terlibat dalam batasan ini dihapus, variabel akan diperlakukan seolah-olah ditetapkan ke nol.

Representasi JSON
{
  "linearTerms": {
    object (SparseDoubleVectorProto)
  },
  "quadraticTerms": {
    object (SparseDoubleMatrixProto)
  },
  "lowerBound": number,
  "upperBound": number,
  "name": string
}
Kolom
linearTerms

object (SparseDoubleVectorProto)

Istilah yang linear dalam variabel keputusan.

Selain persyaratan pada pesan SparseDoubleVectorProto, kami mewajibkan: * linearTerms.id adalah elemen VariablesProto.ids. * linearTerms.values harus semuanya terbatas dan bukan NaN.

Catatan: * ID variabel yang dihilangkan memiliki koefisien nol yang sesuai. * linearTerms.values dapat berupa nol, tetapi ini hanya menghabiskan ruang.

quadraticTerms

object (SparseDoubleMatrixProto)

Istilah yang bersifat kuadrat dalam variabel keputusan.

Selain persyaratan pada pesan SparseDoubleMatrixProto, kami mewajibkan: * Setiap elemen quadraticTerms.row_id dan setiap elemen quadraticTerms.column_ids harus menjadi elemen VariablesProto.ids. * Matriks harus berbentuk segitiga atas: untuk setiap i, quadraticTerms.row_ids[i] <= quadraticTerms.column_ids[i].

Catatan: * Istilah yang tidak disimpan secara eksplisit memiliki koefisien nol. * Elemen quadraticTerms.coefficients boleh bernilai nol, tetapi ini hanya menyia-nyiakan ruang.

lowerBound

number

Harus memiliki nilai dalam [-inf, inf), dan lebih kecil dari atau sama dengan upperBound.

upperBound

number

Harus memiliki nilai dalam (-inf, inf], dan lebih besar dari atau sama dengan lowerBound.

name

string

Pesan induk mungkin memiliki persyaratan keunikan di kolom ini; misalnya, lihat ModelProto.quadratic_constraints dan QuadraticConstraintUpdatesProto.new_constraints.

SecondOrderConeConstraintProto

Batasan kerucut urutan kedua tunggal dalam bentuk:

||argumentsToNorm||_2 <= upperBound,

dengan upperBound dan setiap elemen argumentsToNorm adalah ekspresi linear.

Jika variabel yang terlibat dalam batasan ini dihapus, variabel akan diperlakukan seolah-olah ditetapkan ke nol.

Representasi JSON
{
  "upperBound": {
    object (LinearExpressionProto)
  },
  "argumentsToNorm": [
    {
      object (LinearExpressionProto)
    }
  ],
  "name": string
}
Kolom
upperBound

object (LinearExpressionProto)

argumentsToNorm[]

object (LinearExpressionProto)

name

string

Pesan induk mungkin memiliki persyaratan keunikan di kolom ini; misalnya, lihat ModelProto.second_order_cone_constraints dan SecondOrderConeConstraintUpdatesProto.new_constraints.

LinearExpressionProto

Representasi renggang dari ekspresi linear (jumlah variabel berbobot, ditambah offset konstan).

Representasi JSON
{
  "ids": [
    string
  ],
  "coefficients": [
    number
  ],
  "offset": number
}
Kolom
ids[]

string (int64 format)

ID variabel. Harus disortir (dalam urutan meningkat) dengan semua elemen berbeda.

coefficients[]

number

Harus memiliki panjang yang sama dengan ID. Nilai harus terbatas tidak boleh NaN.

offset

number

Harus terbatas dan tidak boleh NaN.

SosConstraintProto

Data untuk merepresentasikan satu batasan SOS1 atau SOS2.

Jika variabel yang terlibat dalam batasan ini dihapus, variabel akan diperlakukan seolah-olah ditetapkan ke nol.

Representasi JSON
{
  "expressions": [
    {
      object (LinearExpressionProto)
    }
  ],
  "weights": [
    number
  ],
  "name": string
}
Kolom
expressions[]

object (LinearExpressionProto)

Ekspresi yang akan digunakan untuk menerapkan batasan SOS: * SOS1: Maksimal satu elemen memerlukan nilai bukan nol. * SOS2: Maksimal dua elemen menggunakan nilai bukan nol, dan elemen tersebut harus berdekatan dalam pengurutan berulang.

weights[]

number

Kosong atau panjangnya sama dengan ekspresi. Jika kosong, bobot defaultnya adalah 1, 2, ... Jika ada, entri harus unik.

name

string

Pesan induk mungkin memiliki persyaratan keunikan di kolom ini; misalnya, lihat ModelProto.sos1_constraints dan SosConstraintUpdatesProto.new_constraints.

IndicatorConstraintProto

Data untuk merepresentasikan batasan indikator tunggal dalam format: Variable(indicatorId) = (activateOnZero ? 0 : 1) contoh {i>bottomBound<i} <= ekspresi <= {i>aboveBound<i}.

Jika variabel yang terlibat dalam batasan ini (baik indikator, atau yang muncul di expression) dihapus, variabel akan diperlakukan seolah-olah ditetapkan ke nol. Secara khusus, menghapus variabel indikator berarti bahwa batasan indikator tidak berfungsi jika activateOnZero bernilai salah, dan setara dengan batasan linear jika activateOnZero bernilai benar (true).

Representasi JSON
{
  "activateOnZero": boolean,
  "expression": {
    object (SparseDoubleVectorProto)
  },
  "lowerBound": number,
  "upperBound": number,
  "name": string,
  "indicatorId": string
}
Kolom
activateOnZero

boolean

Jika benar, maka jika variabel indikator mengambil nilai 0, batasan tersirat harus berlaku. Atau, jika variabel indikator mengambil nilai 1, batasan tersirat harus berlaku.

expression

object (SparseDoubleVectorProto)

Harus berupa ekspresi linear yang valid sehubungan dengan model yang memuatnya: * Semua kondisi yang dinyatakan di SparseDoubleVectorProto, * Semua elemen expression.values harus terbatas, * expression.ids adalah subset dari VariablesProto.ids.

lowerBound

number

Harus memiliki nilai dalam [-inf, inf); tidak bisa NaN.

upperBound

number

Harus memiliki nilai dalam (-inf, inf]; tidak boleh NaN.

name

string

Pesan induk mungkin memiliki persyaratan keunikan di kolom ini; misalnya, lihat ModelProto.indicator_constraints dan IndicatorConstraintUpdatesProto.new_constraints.

indicatorId

string (int64 format)

ID yang sesuai dengan variabel biner, atau tidak ditetapkan. Jika tidak disetel, batasan indikator akan diabaikan. Jika diatur, kita memerlukan bahwa: * VariablesProto.integers[indicatorId] = true, * VariablesProto.lower_bounds[indicatorId] >= 0, * VariablesProto.upper_bounds[indicatorId] <= 1. Kondisi ini tidak divalidasi oleh MathOpt, tetapi jika tidak terpenuhi akan menyebabkan pemecah masalah menampilkan error setelah menyelesaikannya.

SolveParametersProto

Parameter untuk mengontrol satu penyelesaian.

Berisi kedua parameter yang umum untuk semua pemecah masalah, mis. timeLimit, dan parameter untuk pemecah tertentu, misalnya gscip. Jika nilai ditetapkan dalam kolom umum dan spesifik per pemecahan, setelan khusus pemecah akan digunakan.

Parameter umum yang bersifat opsional dan tidak ditetapkan, atau enum dengan nilai yang tidak ditentukan menunjukkan bahwa default pemecah masalah digunakan.

Pemecah parameter tertentu untuk pemecah masalah selain yang digunakan akan diabaikan.

Parameter yang bergantung pada model (misalnya, prioritas percabangan ditetapkan untuk setiap variabel) diteruskan di ModelSolveParametersProto.

Representasi 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
}
Kolom
timeLimit

string (Duration format)

Waktu maksimum yang harus dihabiskan oleh pemecah masalah untuk menyelesaikan soal (atau tidak terbatas jika tidak ditetapkan).

Nilai ini bukan batas pasti, waktu penyelesaian mungkin sedikit melebihi nilai ini. Parameter ini selalu diteruskan ke pemecah yang mendasarinya, default pemecah tidak digunakan.

Durasi dalam detik dengan maksimal sembilan digit pecahan, yang diakhiri dengan 's'. Contoh: "3.5s".

enableOutput

boolean

Memungkinkan pencetakan rekaman aktivitas penerapan pemecah. Lokasi trace tersebut bergantung pada pemecah masalah. Untuk SCIP dan Gurobi, ini akan menjadi streaming output standar. Untuk Glop dan CP-SAT, ini akan menggunakan LOG(INFO).

Perhatikan bahwa jika pemecah masalah mendukung callback pesan dan pengguna mendaftarkan callback untuknya, nilai parameter ini akan diabaikan dan tidak ada trace yang dicetak.

lpAlgorithm

enum (LPAlgorithmProto)

Algoritma untuk menyelesaikan program linear. Jika LP_ALGORITHM_UNSPECIFIED, gunakan algoritma default pemecah.

Untuk soal yang bukan program linier tetapi pemrograman linear adalah subrutin, pemecah masalah dapat menggunakan nilai ini. Mis. Pemecah MIP biasanya akan menggunakan ini hanya untuk penyelesaian LP root (dan jika tidak, gunakan dual simplex).

presolve

enum (EmphasisProto)

Upaya menyederhanakan soal sebelum memulai algoritma utama, atau tingkat upaya default pemecah masalah jika EMPHASIS_UNSPECIFIED.

cuts

enum (EmphasisProto)

Upaya untuk mendapatkan relaksasi LP yang lebih kuat (khusus MIP), atau tingkat upaya default pemecah jika EMPHASIS_UNSPECIFIED.

CATATAN: menonaktifkan pemotongan dapat mencegah callback memiliki kesempatan untuk menambahkan potongan di MIP_NODE, perilaku ini bersifat spesifik untuk pemecahan masalah.

heuristics

enum (EmphasisProto)

Upaya dalam menemukan solusi yang layak di luar yang ditemukan dalam prosedur pencarian lengkap (hanya MIP), atau tingkat upaya default pemecah jika EMPHASIS_UNSPECIFIED.

scaling

enum (EmphasisProto)

Upaya dalam menskalakan ulang masalah untuk meningkatkan stabilitas numerik, atau tingkat upaya default pemecah masalah jika EMPHASIS_UNSPECIFIED.

iterationLimit

string (int64 format)

Batasi iterasi dari algoritma yang mendasari (misalnya pivot simplex). Perilaku spesifik bergantung pada pemecah dan algoritma yang digunakan, tetapi sering kali dapat memberikan batas penyelesaian deterministik (konfigurasi lebih lanjut mungkin diperlukan, misalnya, satu thread).

Biasanya didukung oleh pemecah masalah LP, QP, dan MIP, tetapi untuk pemecah MIP, lihat juga nodeLimit.

nodeLimit

string (int64 format)

Batasan jumlah subsoal yang diselesaikan dalam penelusuran enumeratif (misalnya, cabang dan terikat). Bagi banyak pemecah masalah, hal ini dapat digunakan untuk membatasi komputasi secara deterministik (konfigurasi lebih lanjut mungkin diperlukan, misalnya, satu thread).

Biasanya untuk pemecah MIP, lihat juga iterasiLimit.

cutoffLimit

number

Pemecah soal berhenti lebih awal jika dapat membuktikan tidak ada solusi primal yang setidaknya sebaik titik henti.

Pada perhentian awal, pemecah masalah menampilkan alasan penghentian NO_SOLUTION_FOUND dan dengan batas CUTOFF dan tidak perlu memberikan informasi solusi tambahan apa pun. Tidak memengaruhi nilai yang ditampilkan jika tidak ada perhentian awal.

Sebaiknya gunakan toleransi jika ingin menampilkan solusi dengan objektif yang sama dengan batas waktu.

Lihat panduan pengguna untuk detail selengkapnya dan perbandingan dengan bestBoundLimit.

objectiveLimit

number

Pemecah soal berhenti begitu cepat menemukan solusi yang minimal sebaik ini, dengan alasan penghentian MUDAH dan membatasi TUJUAN.

bestBoundLimit

number

Pemecah soal berhenti lebih awal setelah membuktikan batas terbaik setidaknya bagus, dengan alasan penghentian FEASIBLE atau NO_SOLUTION_FOUND dan batasi OBJECTIVE.

Lihat panduan pengguna untuk detail selengkapnya dan perbandingan dengan cutoffLimit.

solutionLimit

integer

Pemecah masalah berhenti lebih awal setelah menemukan banyak solusi yang layak, dengan alasan penghentian MUNGKIN dan membatasi SOLUSI. Harus lebih besar dari nol jika ditetapkan. Metode ini sering digunakan untuk membuat pemecah masalah berhenti pada solusi pertama yang layak yang ditemukan. Perhatikan bahwa tidak ada jaminan nilai objektif untuk solusi yang ditampilkan.

Pemecah soal biasanya tidak akan menampilkan lebih banyak solusi daripada batas solusi, tetapi ini tidak diterapkan oleh MathOpt, lihat juga b/214041169.

Saat ini didukung untuk Gurobi dan SCIP, dan untuk CP-SAT hanya dengan nilai 1.

threads

integer

Jika ditetapkan, nilainya harus >= 1.

randomSeed

integer

Seed untuk generator angka pseudo-random dalam pemecah yang mendasarinya. Perhatikan bahwa semua pemecah soal menggunakan angka pseudo-random untuk memilih hal-hal seperti perturbasi dalam algoritma LP, untuk aturan binding, dan untuk perbaikan heuristik. Memvariasikan hal ini dapat memiliki dampak yang nyata pada perilaku pemecah.

Meskipun semua pemecah soal memiliki konsep seed, perlu diperhatikan bahwa nilai yang valid bergantung pada pemecah yang sebenarnya. - Gurobi: [0:GRB_MAXINT] (yang menurut Gurobi 9.0 adalah 2x10^9). - GSCIP: [0:2147483647] (yaitu MAX_INT atau kint32max atau 2^31-1). - GLOP: [0:2147483647] (sama seperti di atas) Dalam semua kasus, pemecah akan menerima nilai yang sama dengan: MAX(0, MIN(MAX_VALID_VALUE_FOR_SOLVER, randomSeed)).

absoluteGapTolerance

number

Toleransi optimalitas mutlak (terutama) untuk pemecah masalah MIP.

gap absolut adalah nilai mutlak dari perbedaan antara: * nilai objektif dari solusi terbaik yang mungkin ditemukan, * ikatan ganda yang dihasilkan oleh penelusuran. Pemecah masalah dapat berhenti setelah GAP absolut mencapai nilai paling absolutGapTolerance (jika ditetapkan), dan menampilkan TERMINATION_REASON_OPTIMAL.

Harus >= 0 jika ditetapkan.

Lihat juga relatifGapTolerance.

relativeGapTolerance

number

Toleransi optimalitas relatif (terutama) untuk pemecah MIP.

GAP relatif adalah versi GAP absolut yang dinormalisasi (didefinisikan berdasarkan absolutGapTolerance), dengan normalisasi bergantung pada pemecahan masalah, misalnya GAP absolut dibagi dengan nilai objektif dari solusi terbaik yang ditemukan.

Pemecah masalah dapat berhenti setelah GAP relatif berada paling banyak relatifGapTolerance (jika ditetapkan), dan menampilkan TERMINATION_REASON_OPTIMAL.

Harus >= 0 jika ditetapkan.

Lihat juga absolutGapTolerance.

solutionPoolSize

integer

Simpan hingga solutionPoolSize solusi saat melakukan penelusuran. Kumpulan solusi umumnya memiliki dua fungsi: (1) Untuk pemecah masalah yang dapat menampilkan lebih dari satu solusi, batasan ini membatasi berapa banyak solusi yang akan ditampilkan. (2) Beberapa pemecah masalah dapat menjalankan heuristik menggunakan solusi dari kumpulan solusi, sehingga mengubah nilai ini dapat memengaruhi jalur algoritma. Untuk memaksa pemecah agar mengisi kumpulan solusi, mis. dengan n solusi terbaik, memerlukan konfigurasi khusus pemecah masalah lebih lanjut.

LPAlgorithmProto

Memilih algoritma untuk menyelesaikan program linear.

Enum
LP_ALGORITHM_UNSPECIFIED
LP_ALGORITHM_PRIMAL_SIMPLEX Metode simpleks (utama). Biasanya dapat memberikan solusi primal dan ganda, sinar primal/dual pada masalah primer/ganda yang tidak terbatas, dan basis.
LP_ALGORITHM_DUAL_SIMPLEX Metode simpleks ganda. Biasanya dapat memberikan solusi primal dan ganda, sinar primal/dual pada masalah primer/ganda yang tidak terbatas, dan basis.
LP_ALGORITHM_BARRIER Metode penghalang, juga biasa disebut metode titik interior (IPM). Biasanya dapat memberikan solusi primer dan ganda. Beberapa implementasi juga dapat menghasilkan sinar pada masalah yang tidak terikat/tidak layak. Basis tidak diberikan kecuali pemecah yang mendasarinya melakukan "crossover" dan diakhiri dengan simpleks.
LP_ALGORITHM_FIRST_ORDER Algoritma yang didasarkan pada metode urutan pertama. Hal ini biasanya akan menghasilkan solusi utama dan ganda, serta berpotensi mendapatkan sertifikat ketidaklayakan utama dan/atau ganda. Metode urutan pertama biasanya akan memberikan solusi dengan akurasi yang lebih rendah, sehingga pengguna harus berhati-hati dalam menetapkan parameter kualitas solusi (misalnya, toleransi) dan untuk memvalidasi solusi.

EmphasisProto

Tingkat upaya yang diterapkan pada tugas opsional saat memecahkan masalah (lihat SolveParametersProto untuk penggunaan).

Penekanan digunakan untuk mengonfigurasi fitur pemecah masalah sebagai berikut: * Jika pemecah masalah tidak mendukung fitur tersebut, hanya UNSPECIFIED yang akan selalu valid, setelan lainnya biasanya akan menampilkan error argumen yang tidak valid (beberapa pemecah masalah juga dapat menerima OFF). * Jika pemecah masalah mendukung fitur: - Jika disetel ke UNSPECIFIED, default dasar akan digunakan. - Jika fitur tidak dapat dinonaktifkan, OFF akan menampilkan pesan error. - Jika fitur ini diaktifkan secara default, default pemecah masalah biasanya dipetakan ke MEDIUM. - Jika fitur didukung, RENDAH, SEDANG, TINGGI, dan SANGAT TINGGI tidak akan pernah memberikan kesalahan, dan akan dipetakan sesuai dengan kecocokan terbaik.

Enum
EMPHASIS_UNSPECIFIED
EMPHASIS_OFF
EMPHASIS_LOW
EMPHASIS_MEDIUM
EMPHASIS_HIGH
EMPHASIS_VERY_HIGH

ModelSolveParametersProto

Representasi JSON
{
  "variableValuesFilter": {
    object (SparseVectorFilterProto)
  },
  "dualValuesFilter": {
    object (SparseVectorFilterProto)
  },
  "reducedCostsFilter": {
    object (SparseVectorFilterProto)
  },
  "initialBasis": {
    object (BasisProto)
  },
  "solutionHints": [
    {
      object (SolutionHintProto)
    }
  ],
  "branchingPriorities": {
    object (SparseInt32VectorProto)
  }
}
Kolom
variableValuesFilter

object (SparseVectorFilterProto)

Filter yang diterapkan ke semua penampung sparse yang ditampilkan dan dikunci oleh variabel dalam PrimalSolutionProto dan PrimalRayProto (PrimalSolutionProto.variable_values, PrimalRayProto.variable_values).

Persyaratan: * filtersIds adalah elemen VariablesProto.ids.

dualValuesFilter

object (SparseVectorFilterProto)

Filter yang diterapkan ke semua penampung sparse yang ditampilkan yang dikunci oleh batasan linear di DualSolutionProto dan DualRay (DualSolutionProto.dual_values, DualRay.dual_values).

Persyaratan: * filtersIds adalah elemen LinearConstraints.ids.

reducedCostsFilter

object (SparseVectorFilterProto)

Filter yang diterapkan ke semua container sparse yang ditampilkan yang dikunci oleh variabel dalam DualSolutionProto dan DualRay (DualSolutionProto.reduced_costs, DualRay.reduced_costs).

Persyaratan: * filtersIds adalah elemen VariablesProto.ids.

initialBasis

object (BasisProto)

Dasar awal opsional untuk pemecah masalah LP simplex start warm. Jika ditetapkan, nilai tersebut diharapkan valid sesuai dengan ValidateBasis di validators/solution_validator.h untuk ModelSummary saat ini.

solutionHints[]

object (SolutionHintProto)

Petunjuk solusi opsional. Jika pemecah masalah yang mendasarinya hanya menerima satu petunjuk, petunjuk pertama akan digunakan.

branchingPriorities

object (SparseInt32VectorProto)

Prioritas percabangan opsional. Variabel dengan nilai yang lebih tinggi akan bercabang terlebih dahulu. Variabel yang prioritasnya belum ditetapkan akan mendapatkan prioritas default pemecah (biasanya nol).

Persyaratan: * branchingPriorities.values harus terbatas. * bringPriorities.id harus berupa elemen VariablesProto.ids.

SparseVectorFilterProto

Pesan ini memungkinkan untuk membuat kueri/menyetel bagian tertentu dari SparseXxxxVector. Perilaku default-nya adalah tidak memfilter apa pun. Penggunaan yang umum adalah untuk membuat kueri hanya sebagian solusi (hanya nilai bukan nol, dan/atau hanya kumpulan nilai variabel yang dipilih secara manual).

Representasi JSON
{
  "skipZeroValues": boolean,
  "filterByIds": boolean,
  "filteredIds": [
    string
  ]
}
Kolom
skipZeroValues

boolean

Untuk SparseBoolVectorProto "zero" adalah false.

filterByIds

boolean

Jika true (benar), hanya tampilkan nilai yang sesuai dengan ID yang tercantum di filtersIds.

filteredIds[]

string (int64 format)

Daftar ID yang akan digunakan saat filterByIds bernilai benar (true). Harus kosong jika filterByIds salah. CATATAN: jika ini kosong, dan filterByIds benar, Anda mengatakan bahwa Anda tidak menginginkan informasi apa pun dalam hasilnya.

BasisProto

Karakterisasi kombinatorial untuk solusi program linear.

Metode simpleks untuk menyelesaikan program linier selalu menghasilkan "solusi dasar yang layak" yang dapat dijelaskan secara bersamaan dengan Basis. Basis menetapkan BasisStatusProto untuk setiap variabel dan batasan linear.

Mis. pertimbangkan bentuk standar LP: min c * x s.t. A * x = b x >= 0 yang memiliki lebih banyak variabel daripada batasan dan dengan baris penuh peringkat A.

Misalkan n adalah jumlah variabel dan m adalah jumlah batasan linear. Dasar yang valid untuk masalah ini dapat disusun sebagai berikut: * Semua batasan akan memiliki status dasar FIXED. * Pilih variabel m sedemikian rupa kolom A bebas secara linear dan tetapkan statusnya BASIC. * Tetapkan status AT_LOWER untuk variabel n - m yang tersisa.

Solusi dasar untuk basis ini adalah solusi unik dari A * x = b yang memiliki semua variabel dengan status AT_LOWER yang tetap ke batas bawahnya (semua nol). Solusi yang dihasilkan disebut solusi dasar yang layak jika juga memenuhi x >= 0.

Representasi JSON
{
  "constraintStatus": {
    object (SparseBasisStatusVector)
  },
  "variableStatus": {
    object (SparseBasisStatusVector)
  },
  "basicDualFeasibility": enum (SolutionStatusProto)
}
Kolom
constraintStatus

object (SparseBasisStatusVector)

Status dasar batasan.

Persyaratan: * constraintStatus.id sama dengan LinearConstraints.ids.

variableStatus

object (SparseBasisStatusVector)

Status berbasis variabel.

Persyaratan: * constraintStatus.id sama dengan VariablesProto.ids.

basicDualFeasibility

enum (SolutionStatusProto)

Ini adalah fitur lanjutan yang digunakan oleh MathOpt untuk menandakan kelayakan solusi LP yang kurang optimal (solusi yang optimal akan selalu memiliki status SOLUTION_STATUS_FEASIBLE).

Untuk halaman landing satu sisi harus sama dengan status kelayakan solusi ganda yang terkait. Untuk LP dua sisi mungkin berbeda dalam beberapa kasus ekstrem (misalnya penyelesaian yang tidak lengkap dengan simpleks primal).

Jika Anda memberikan dasar awal melalui ModelSolveParametersProto.initial_basis, nilai ini akan diabaikan. Ini hanya relevan untuk basis yang ditampilkan oleh SolutionProto.basis.

SparseBasisStatusVector

Representasi renggang dari vektor status dasar.

Representasi JSON
{
  "ids": [
    string
  ],
  "values": [
    enum (BasisStatusProto)
  ]
}
Kolom
ids[]

string (int64 format)

Harus disortir (dalam urutan meningkat) dengan semua elemen berbeda.

values[]

enum (BasisStatusProto)

Harus memiliki panjang yang sama dengan ID.

BasisStatusProto

Status variabel/batasan berdasarkan LP.

Enum
BASIS_STATUS_UNSPECIFIED Nilai jaga yang mewakili tidak ada status.
BASIS_STATUS_FREE Variabel/batasan bersifat bebas (tidak memiliki batas yang terbatas).
BASIS_STATUS_AT_LOWER_BOUND Variabel/batasan berada di batas bawahnya (yang harus terbatas).
BASIS_STATUS_AT_UPPER_BOUND Variabel/batasan berada di batas atas (yang harus berhingga).
BASIS_STATUS_FIXED_VALUE Variabel/batasan memiliki batas bawah dan atas yang terbatas dan identik.
BASIS_STATUS_BASIC Variabel/batasan bersifat dasar.

SolutionStatusProto

Kelayakan solusi utama atau ganda seperti yang diklaim oleh pemecah.

Enum
SOLUTION_STATUS_UNSPECIFIED Nilai jaga yang mewakili tidak ada status.
SOLUTION_STATUS_UNDETERMINED Pemecah soal tidak mengklaim status kelayakan.
SOLUTION_STATUS_FEASIBLE Pemecah soal mengklaim bahwa solusi tersebut layak.
SOLUTION_STATUS_INFEASIBLE Pemecah soal mengklaim bahwa solusi tersebut tidak mungkin dilakukan.

SolutionHintProto

Solusi awal yang disarankan untuk pemecah masalah.

Pemecah masalah MIP umumnya hanya menginginkan informasi dasar (variableValues), sedangkan pemecah masalah LP menginginkan informasi utama dan ganda (dualValues).

Banyak pemecah MIP dapat bekerja dengan: (1) solusi parsial yang tidak menentukan semua variabel atau (2) solusi yang tidak layak. Dalam kasus ini, pemecah masalah biasanya menyelesaikan sub-MIP untuk menyelesaikan/memperbaiki petunjuk.

Bagaimana petunjuk digunakan oleh pemecah, jika ada, sangat bergantung pada pemecah masalah, jenis masalah, dan algoritma yang digunakan. Cara paling andal untuk memastikan petunjuk Anda berpengaruh adalah dengan membaca log pemecah masalah yang mendasarinya dengan dan tanpa petunjuk tersebut.

Pemecah masalah LP berbasis simplex biasanya lebih memilih petunjuk dasar daripada petunjuk solusi (mereka harus melakukan crossover untuk mengonversi petunjuk menjadi solusi dasar yang layak).

Representasi JSON
{
  "variableValues": {
    object (SparseDoubleVectorProto)
  },
  "dualValues": {
    object (SparseDoubleVectorProto)
  }
}
Kolom
variableValues

object (SparseDoubleVectorProto)

Penetapan nilai sebagian yang mungkin dilakukan ke variabel utama masalah. Persyaratan pemecah masalah yang tidak bergantung pada sub-pesan ini adalah: * variabelValues.ids adalah elemen VariablesProto.ids. * variabelValues.values harus terbatas.

dualValues

object (SparseDoubleVectorProto)

Penetapan nilai (kemungkinan parsial) terhadap batasan linier masalah.

Persyaratan: * dualValues.id adalah elemen LinearConstraintsProto.ids. * dualValues.values harus terbatas.

SparseInt32VectorProto

Representasi renggang dari vektor int.

Representasi JSON
{
  "ids": [
    string
  ],
  "values": [
    integer
  ]
}
Kolom
ids[]

string (int64 format)

Harus diurutkan (dalam urutan yang meningkat) dengan semua elemen yang berbeda.

values[]

integer

Harus memiliki panjang yang sama dengan ID.

SolveResultProto

Kontrak jika solusi/sinar utama/dual kompleks, lihat cancel_reasons.md untuk deskripsi lengkapnya.

Hingga kontrak yang tepat diselesaikan, lebih aman untuk memeriksa apakah solusi/sinar tersedia daripada mengandalkan alasan penghentian.

Representasi JSON
{
  "termination": {
    object (TerminationProto)
  },
  "solutions": [
    {
      object (SolutionProto)
    }
  ],
  "primalRays": [
    {
      object (PrimalRayProto)
    }
  ],
  "dualRays": [
    {
      object (DualRayProto)
    }
  ],
  "solveStats": {
    object (SolveStatsProto)
  }
}
Kolom
termination

object (TerminationProto)

Alasan pemecah berhenti.

solutions[]

object (SolutionProto)

Kontrak umum untuk urutan solusi yang harus diterapkan oleh pemecah masalah di masa depan adalah untuk mengurutkan berdasarkan: 1. Solusi dengan solusi utama yang layak, diurutkan berdasarkan tujuan utama terbaik terlebih dahulu. 2. Solusi dengan solusi layak ganda yang diurutkan berdasarkan tujuan ganda terbaik (tujuan ganda yang tidak diketahui adalah yang terburuk) 3. Semua solusi yang tersisa dapat dikembalikan dalam urutan apa pun.

primalRays[]

object (PrimalRayProto)

Petunjuk peningkatan dasar yang tidak terbatas, atau yang setara, dua sertifikat ketidaklayakan. Biasanya disediakan untuk PenghentianAlasanProtos UNBOUNDED dan DUAL_INFEASIBLE

dualRays[]

object (DualRayProto)

Petunjuk peningkatan ganda yang tidak terikat, atau yang setara, sertifikat ketidaklayakan utama. Biasanya disediakan untuk PenghentianAlasanProto TIDAK BOLEH.

solveStats

object (SolveStatsProto)

Statistik tentang proses memecahkan, mis. waktu berjalan, iterasi.

TerminationProto

Semua informasi tentang mengapa panggilan ke Solve() dihentikan.

Representasi JSON
{
  "reason": enum (TerminationReasonProto),
  "limit": enum (LimitProto),
  "detail": string,
  "problemStatus": {
    object (ProblemStatusProto)
  },
  "objectiveBounds": {
    object (ObjectiveBoundsProto)
  }
}
Kolom
reason

enum (TerminationReasonProto)

Informasi tambahan di limit jika nilai adalah TERMINATION_REASON_FEASIBLE atau TERMINATION_REASON_NO_SOLUTION_FOUND, lihat limit untuk mengetahui detailnya.

limit

enum (LimitProto)

LIMIT_UNSPECIFIED kecuali alasannya TERMINATION_REASON_FEASIBLE atau TERMINATION_REASON_NO_SOLUTION_FOUND. Tidak semua pemecah masalah selalu dapat menentukan batas yang menyebabkan penghentian, LIMIT_UNDETERMINED digunakan jika penyebabnya tidak dapat ditentukan.

detail

string

Informasi tambahan yang biasanya memecahkan masalah terkait penghentian.

problemStatus

object (ProblemStatusProto)

Status kelayakan untuk masalah utama dan ganda. Mulai 18 Juli 2023, pesan ini mungkin tidak ada. Jika tidak ada, problemStatus dapat ditemukan di SolveResultProto.resolve_stats.

objectiveBounds

object (ObjectiveBoundsProto)

Batas pada nilai tujuan optimal. Mulai 18 Juli 2023, pesan ini mungkin tidak ada. Jika tidak ada, objectBounds.primal_bound dapat ditemukan di SolveResultProto.resolve.stats.best_primal_bound dan objectBounds.dual_bound dapat ditemukan di SolveResultProto.resolve.stats.best_dual_bound

TerminationReasonProto

Alasan panggilan ke Solve() berakhir.

Enum
TERMINATION_REASON_UNSPECIFIED
TERMINATION_REASON_OPTIMAL Telah ditemukan solusi yang optimal (hingga toleransi numerik).
TERMINATION_REASON_INFEASIBLE Masalah utama tidak memiliki solusi yang layak.
TERMINATION_REASON_UNBOUNDED Permasalahan primer itu layak dan solusi yang baik dan bebas dapat ditemukan di sepanjang sinar primal.
TERMINATION_REASON_INFEASIBLE_OR_UNBOUNDED Masalah utamanya adalah tidak layak atau tidak terbatas. Detail lebih lanjut tentang status masalah mungkin tersedia di resolveStats.problem_status. Perhatikan bahwa status tidak terbatas Gurobi dapat dipetakan di sini.
TERMINATION_REASON_IMPRECISE

Masalah diselesaikan dengan salah satu kriteria di atas (Optimal, Tidak Layak, Tidak Terbatas, atau Tidak LayakOrUnbound), tetapi satu atau beberapa toleransi tidak terpenuhi. Ada beberapa solusi/sinar utama/ganda, tetapi hasilnya akan sedikit tidak memungkinkan, atau (jika masalahnya hampir optimal) solusi/sinarnya mungkin menjadi celah antara tujuan solusi terbaik dan ikatan tujuan terbaik.

Pengguna masih dapat mengajukan kueri utama/dual solusi/sinar dan statistik solusi, tetapi mereka bertanggung jawab untuk menangani ketidaktepatan numerik.

TERMINATION_REASON_FEASIBLE Pengoptimal mencapai semacam batas dan solusi utama yang layak ditampilkan. Lihat SolveResultProto.limit_detail untuk penjelasan rinci tentang jenis batas yang dicapai.
TERMINATION_REASON_NO_SOLUTION_FOUND Pengoptimal mencapai semacam batas dan tidak menemukan solusi yang paling memungkinkan. Lihat SolveResultProto.limit_detail untuk penjelasan rinci tentang jenis batas yang dicapai.
TERMINATION_REASON_NUMERICAL_ERROR Algoritma dihentikan karena mengalami error numerik yang tidak dapat dipulihkan. Tidak ada informasi solusi yang tersedia.
TERMINATION_REASON_OTHER_ERROR Algoritme dihentikan karena error yang tidak tercakup dalam salah satu status yang ditentukan di atas. Tidak ada informasi solusi yang tersedia.

LimitProto

Jika Solve() berhenti lebih awal dengan PenghentianAlasanProto FEASIBLE atau NO_SOLUTION_FOUND, batas spesifik yang tercapai.

Enum
LIMIT_UNSPECIFIED Digunakan sebagai nilai null saat kami menghentikan bukan dari batas (misalnya TERMINATION_REASON_OPTIMAL).
LIMIT_UNDETERMINED Pemecah masalah yang mendasarinya tidak menunjukkan batas mana yang telah dicapai.
LIMIT_ITERATION Algoritma iteratif dihentikan setelah melakukan jumlah iterasi maksimum (misalnya iterasi simpleks atau penghalang).
LIMIT_TIME Algoritma berhenti setelah waktu komputasi yang ditentukan pengguna.
LIMIT_NODE Algoritma cabang-dan-terikat berhenti karena mengeksplorasi jumlah maksimum simpul dalam pohon cabang-dan-terikat.
LIMIT_SOLUTION Algoritma berhenti karena menemukan jumlah solusi yang diperlukan. Metode ini sering digunakan dalam MIP agar pemecah masalah menampilkan solusi pertama yang layak yang ditemukannya.
LIMIT_MEMORY Algoritma berhenti karena kehabisan memori.
LIMIT_CUTOFF Pemecah soal dijalankan dengan batas waktu (misalnya, SolveParameters.cutoff_limit ditetapkan) pada tujuan, yang menunjukkan bahwa pengguna tidak menginginkan solusi yang lebih buruk dari batasnya, dan pemecah masalah menyimpulkan tidak ada solusi yang setidaknya sebaik batasnya. Biasanya tidak ada informasi solusi lebih lanjut yang diberikan.
LIMIT_OBJECTIVE Algoritma berhenti karena menemukan solusi atau batas yang lebih baik daripada batas yang ditetapkan oleh pengguna (lihat SolveParameters.objective_limit dan SolveParameters.best_bound_limit).
LIMIT_NORM Algoritma berhenti karena norma iterasi menjadi terlalu besar.
LIMIT_INTERRUPTED Algoritma dihentikan karena ada sinyal interupsi atau permintaan interupsi pengguna.
LIMIT_SLOW_PROGRESS Algoritma berhenti karena tidak dapat terus membuat progres terhadap solusi.
LIMIT_OTHER

Algoritma dihentikan karena batas tidak dicakup oleh salah satu opsi di atas. Perhatikan bahwa LIMIT_UNDETERMINED digunakan jika alasan tidak dapat ditentukan, dan LIMIT_OTHER digunakan jika alasan diketahui tetapi tidak sesuai dengan alternatif di atas.

PenghentianProto.detail dapat berisi informasi tambahan tentang batas.

ProblemStatusProto

Status kelayakan dari masalah utama dan gandanya (atau ganda dari relaksasi berkelanjutan) seperti yang diklaim oleh pemecah masalah. Pemecah masalah tidak diwajibkan untuk mengembalikan sertifikat klaim (misalnya pemecah masalah dapat mengklaim kelayakan utama tanpa mengembalikan solusi yang paling memungkinkan). Status gabungan ini memberikan deskripsi komprehensif tentang klaim pemecah masalah tentang kelayakan dan ketidakterbatasan dari masalah yang dipecahkan. Misalnya,

  • status yang layak untuk masalah primal dan ganda menunjukkan bahwa hal tersebut layak dan dibatasi serta kemungkinan memiliki solusi yang optimal (dijamin untuk masalah tanpa batasan non-linear).
  • status kelayakan utama dan status ganda yang tidak layak menunjukkan bahwa masalah utama tidak terbatas (yaitu memiliki solusi yang baik secara arbitrer).

Perhatikan bahwa status ganda yang tidak layak dengan sendirinya (yaitu disertai dengan status utama yang belum dapat ditentukan) tidak berarti bahwa masalah utama tidak dapat diselesaikan karena kedua masalah tersebut tidak mungkin terjadi. Selain itu, meskipun status kemungkinan utama dan ganda mungkin menyiratkan adanya solusi yang optimal, namun tidak menjamin pemecah masalah benar-benar menemukan solusi yang optimal tersebut.

Representasi JSON
{
  "primalStatus": enum (FeasibilityStatusProto),
  "dualStatus": enum (FeasibilityStatusProto),
  "primalOrDualInfeasible": boolean
}
Kolom
primalStatus

enum (FeasibilityStatusProto)

Status untuk masalah utama.

dualStatus

enum (FeasibilityStatusProto)

Status untuk masalah ganda (atau untuk relaksasi ganda terus-menerus).

primalOrDualInfeasible

boolean

Jika benar, pemecah masalah mengklaim bahwa masalah utama atau ganda tidak mungkin dilakukan, tetapi tidak mengetahui masalah yang mana (atau apakah keduanya tidak memungkinkan). Bisa menjadi benar hanya jika primal_problem_status = dual_problem_status = kUnspecified. Informasi tambahan ini sering kali diperlukan saat pra-pemrosesan menentukan bahwa tidak ada solusi optimal untuk masalah tersebut (tetapi tidak dapat menentukan apakah hal ini karena ketidaklayakan, ketidakterbatasan, atau keduanya).

FeasibilityStatusProto

Status kelayakan masalah seperti yang diklaim oleh pemecah masalah (pemecah masalah tidak diwajibkan untuk mengembalikan sertifikat untuk klaim).

Enum
FEASIBILITY_STATUS_UNSPECIFIED Nilai jaga yang mewakili tidak ada status.
FEASIBILITY_STATUS_UNDETERMINED Pemecah soal tidak mengklaim status.
FEASIBILITY_STATUS_FEASIBLE Pemecah soal mengklaim bahwa masalah tersebut layak.
FEASIBILITY_STATUS_INFEASIBLE Pemecah soal mengklaim bahwa masalah itu tidak mungkin terjadi.

ObjectiveBoundsProto

Batas pada nilai tujuan optimal.

Representasi JSON
{
  "primalBound": number,
  "dualBound": number
}
Kolom
primalBound

number

Pemecah soal mengklaim bahwa nilai optimalnya sama atau lebih baik (lebih kecil untuk minimalisasi dan lebih besar untuk pemaksimalan) daripada primalBound hingga ke toleransi kelayakan utama pemecah (lihat peringatan di bawah): * primalBound adalah hal yang sepele (+inf untuk minimumisasi dan pemaksimalan -inf) jika pemecah masalah tidak mengklaim memiliki batas tersebut. * primalBound dapat lebih dekat dengan nilai optimal daripada tujuan solusi dasar terbaik yang layak. Secara khusus, primalBound mungkin non-trivial bahkan saat tidak ada solusi dasar yang layak ditampilkan. Peringatan: Klaim yang tepat adalah bahwa terdapat solusi utama yang: * layak secara numerik (yaitu layak hingga toleransi pemecah masalah), dan * memiliki nilai objektif primalBound. Solusi yang dapat dijalankan secara numerik ini mungkin sedikit tidak layak, dalam hal ini primalBound bisa benar-benar lebih baik daripada nilai optimal. Menerjemahkan toleransi kelayakan utama terhadap toleransi pada primalBound tidaklah mudah, terutama ketika toleransi kelayakan relatif besar (misalnya, saat memecahkan dengan PDLP).

dualBound

number

Pemecah soal mengklaim bahwa nilai optimalnya sama atau lebih buruk (lebih besar untuk minimalisasi dan lebih kecil untuk pemaksimalan) daripada dualBound hingga ke toleransi kelayakan ganda pemecah (lihat peringatan di bawah): * dualBound bersifat trivial (-inf untuk minimalisasi dan pemaksimalan +inf) jika pemecah masalah tidak mengklaim memiliki batasan tersebut. Sama halnya dengan primalBound, hal ini dapat terjadi untuk beberapa pemecah masalah bahkan saat menampilkan hasil optimal. Pemecah masalah MIP biasanya akan melaporkan ikatan meskipun tidak akurat. * untuk masalah berkelanjutan, dualBound dapat lebih mendekati nilai optimal daripada tujuan solusi terbaik ganda yang layak. Untuk MIP, salah satu nilai non-trivial pertama untuk dualBound sering kali merupakan nilai optimal dari relaksasi LP MIP. * dualBound harus lebih baik (lebih kecil untuk minimalisasi dan lebih besar untuk pemaksimalan) daripada primalBound hingga toleransi pemecah (lihat peringatan di bawah). Peringatan: * Untuk masalah berkelanjutan, klaim tepatnya adalah bahwa ada solusi ganda yang: * layak secara numerik (yaitu layak hingga toleransi pemecah masalah), dan * memiliki nilai objektif dualBound. Solusi yang dapat dijalankan secara numerik ini mungkin sedikit tidak layak, dalam hal ini dualBound bisa lebih buruk daripada nilai optimal dan primalBound. Serupa dengan kasus utama, menerjemahkan toleransi kelayakan ganda menjadi toleransi pada dualBound tidak mudah, terutama ketika toleransi kelayakan relatif besar. Namun, beberapa pemecah masalah memberikan versi dualBound yang telah diperbaiki yang dapat lebih aman secara numerik. Versi yang dikoreksi ini dapat diakses melalui output khusus pemecah (misalnya, untuk PDLP, pdlp_output. convergence_information.corrected_dual_objective). * Untuk pemecah MIP, dualBound mungkin dikaitkan dengan solusi ganda untuk beberapa relaksasi berkelanjutan (mis. relaksasi LP), tetapi sering kali merupakan konsekuensi kompleks dari eksekusi pemecah dan biasanya lebih tidak akurat daripada batas yang dilaporkan oleh pemecah LP.

SolutionProto

Apa yang termasuk dalam solusi bergantung pada jenis masalah dan pemecah masalah. Pola umum saat ini adalah 1. Pemecah masalah MIP hanya menampilkan solusi utama. 2. Pemecah masalah LP Simplex sering kali menampilkan dasar serta solusi utama dan ganda yang terkait dengan basis ini. 3. Pemecah masalah berkelanjutan lainnya sering kali menampilkan solusi solusi primer dan ganda yang terhubung dalam bentuk yang bergantung pada pemecah.

Persyaratan: * setidaknya satu kolom harus ditetapkan; solusi tidak boleh kosong.

Representasi JSON
{
  "primalSolution": {
    object (PrimalSolutionProto)
  },
  "dualSolution": {
    object (DualSolutionProto)
  },
  "basis": {
    object (BasisProto)
  }
}
Kolom
primalSolution

object (PrimalSolutionProto)

dualSolution

object (DualSolutionProto)

basis

object (BasisProto)

PrimalSolutionProto

Solusi untuk masalah pengoptimalan.

Mis. pertimbangkan program linier sederhana: min c * x s.t. A * x >= b x >= 0. Solusi primer adalah menetapkan nilai ke x. Sangat layak jika memenuhi A * x >= b dan x >= 0 dari atas. Pada pesan PrimalSolutionProto di bawah, variabelValues adalah x dan objektifValue adalah c * x.

Representasi JSON
{
  "variableValues": {
    object (SparseDoubleVectorProto)
  },
  "objectiveValue": number,
  "auxiliaryObjectiveValues": {
    string: number,
    ...
  },
  "feasibilityStatus": enum (SolutionStatusProto)
}
Kolom
variableValues

object (SparseDoubleVectorProto)

Persyaratan: * variabelValues.id adalah elemen VariablesProto.ids. * variabelValues.values harus terbatas.

objectiveValue

number

Nilai objektif seperti yang dikomputasi oleh pemecah masalah yang mendasarinya. Tidak boleh tak terbatas atau NaN.

auxiliaryObjectiveValues

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

Nilai tujuan tambahan seperti yang dikomputasi oleh pemecah yang mendasarinya. Kunci harus berupa ID tujuan tambahan yang valid. Nilai tidak boleh tak terbatas atau NaN.

Objek yang berisi daftar pasangan "key": value. Contoh: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

feasibilityStatus

enum (SolutionStatusProto)

Status kelayakan solusi sesuai dengan pemecah masalah yang mendasarinya.

DualSolutionProto

Solusi untuk dua masalah pengoptimalan.

Mis. pertimbangkan pasangan program linear pasangan ganda primal: (Primal) (Dual) min c * x maks b * y s.t. A * x >= b s.t. y * A + r = c x >= 0 y, r >= 0. Solusi ganda adalah pasangan (y, r). Hal ini layak jika memenuhi batasan dari (Dual) di atas.

Pada pesan di bawah ini, y adalah dualValues, r adalah berkurangBiaya, dan b * y adalah nilai objektif.

Representasi JSON
{
  "dualValues": {
    object (SparseDoubleVectorProto)
  },
  "reducedCosts": {
    object (SparseDoubleVectorProto)
  },
  "feasibilityStatus": enum (SolutionStatusProto),
  "objectiveValue": number
}
Kolom
dualValues

object (SparseDoubleVectorProto)

Persyaratan: * dualValues.id adalah elemen LinearConstraints.ids. * dualValues.values harus terbatas.

reducedCosts

object (SparseDoubleVectorProto)

Persyaratan: * reduceCosts.id adalah elemen VariablesProto.ids. * lessCosts.values harus terbatas.

feasibilityStatus

enum (SolutionStatusProto)

Status kelayakan solusi sesuai dengan pemecah masalah yang mendasarinya.

objectiveValue

number

PrimalRayProto

Arah perbaikan yang tidak terbatas terhadap masalah pengoptimalan; atau sertifikat ketidaklayakan untuk ganda masalah pengoptimalan.

Mis. pertimbangkan program linier sederhana: min c * x s.t. Sinar primal adalah x yang memenuhi: c * x < 0 A * x >= 0 x >= 0 Amati bahwa dengan solusi yang layak, kelipatan positif apa pun dari sinar primal ditambah larutan tersebut masih layak, dan memberikan nilai objektif yang lebih baik. Sinar primal juga membuktikan bahwa masalah pengoptimalan ganda tidak layak.

Pada pesan PrimalRay di bawah ini, variabelValues adalah x.

Representasi JSON
{
  "variableValues": {
    object (SparseDoubleVectorProto)
  }
}
Kolom
variableValues

object (SparseDoubleVectorProto)

Persyaratan: * variabelValues.id adalah elemen VariablesProto.ids. * variabelValues.values harus terbatas.

DualRayProto

Arah perbaikan yang tidak terbatas pada dua masalah, yaitu optimasi; atau sertifikat ketidaklayakan utama.

Mis. pertimbangkan pasangan program linear pasangan ganda primal: (Primal) (Dual) min c * x maks b * y s.t. A * x >= b s.t. y * A + r = c x >= 0 y, r >= 0. Sinar ganda adalah pasangan (y, r) yang memuaskan: b * y > 0 y * A + r = 0 y, r >= 0 Perhatikan bahwa menambahkan kelipatan positif dari (y, r) ke solusi layak ganda mempertahankan kelayakan ganda dan meningkatkan tujuan (membuktikan ganda tidak terikat). Sinar ganda juga membuktikan bahwa masalah utama tidak memungkinkan.

Dalam pesan DualRay di bawah ini, y adalah dualValues dan r adalahreduceCosts.

Representasi JSON
{
  "dualValues": {
    object (SparseDoubleVectorProto)
  },
  "reducedCosts": {
    object (SparseDoubleVectorProto)
  }
}
Kolom
dualValues

object (SparseDoubleVectorProto)

Persyaratan: * dualValues.id adalah elemen LinearConstraints.ids. * dualValues.values harus terbatas.

reducedCosts

object (SparseDoubleVectorProto)

Persyaratan: * reduceCosts.id adalah elemen VariablesProto.ids. * lessCosts.values harus terbatas.

SolveStatsProto

Representasi JSON
{
  "solveTime": string,
  "problemStatus": {
    object (ProblemStatusProto)
  },
  "simplexIterations": string,
  "barrierIterations": string,
  "firstOrderIterations": string,
  "nodeCount": string
}
Kolom
solveTime

string (Duration format)

Waktu jam dinding berlalu yang diukur dengan compute_opt, kira-kira waktu di dalam Solver::Solve(). Catatan: ini tidak termasuk pekerjaan yang dilakukan membuat model.

Durasi dalam detik dengan maksimal sembilan digit pecahan, yang diakhiri dengan 's'. Contoh: "3.5s".

problemStatus

object (ProblemStatusProto)

Status kelayakan untuk masalah utama dan ganda.

simplexIterations

string (int64 format)

barrierIterations

string (int64 format)

firstOrderIterations

string (int64 format)

nodeCount

string (int64 format)