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 ( |
Kolom | |
---|---|
solverType |
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 |
Wajib diisi. Representasi matematis dari soal pengoptimalan yang harus dipecahkan. |
parameters |
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 |
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 ( |
Kolom | |
---|---|
result |
Deskripsi output dari penyelesaian model dalam permintaan. |
messages[] |
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 ( |
Kolom | |
---|---|
name |
|
variables |
|
objective |
Tujuan utama dalam model. |
auxiliaryObjectives |
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 Objek yang berisi daftar pasangan |
linearConstraints |
|
linearConstraintMatrix |
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 |
Batasan kuadrat dalam model. Objek yang berisi daftar pasangan |
secondOrderConeConstraints |
Batasan kerucut urutan kedua dalam model. Objek yang berisi daftar pasangan |
sos1Constraints |
Batasan SOS1 dalam model, yang membatasi bahwa maksimal satu Objek yang berisi daftar pasangan |
sos2Constraints |
Batasan SOS2 dalam model, yang membatasi bahwa maksimal dua entri Objek yang berisi daftar pasangan |
indicatorConstraints |
Batasan indikator dalam model, yang menerapkannya, jika "variabel indikator" biner disetel ke satu, lalu "batasan tersirat" harus ditahan. Objek yang berisi daftar pasangan |
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[] |
Harus berupa angka positif dan meningkat ketat. Nilai max(int64) tidak dapat digunakan. |
lowerBounds[] |
Harus memiliki panjang yang sama dengan #variabel, nilai dalam [-inf, inf). |
upperBounds[] |
Harus memiliki panjang yang sama dengan #variabel, nilai dalam (-inf, inf]. |
integers[] |
Harus memiliki panjang yang sama dengan #variabel. Nilai adalah false untuk variabel kontinu dan benar untuk variabel bilangan bulat. |
names[] |
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 ( |
Kolom | |
---|---|
maximize |
false adalah minimalkan, true adalah memaksimalkan |
offset |
Harus terbatas dan bukan NaN. |
linearCoefficients |
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 |
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 |
Pesan induk mungkin memiliki persyaratan keunikan di kolom ini; misalnya, lihat ModelProto.objectives dan AuxiliaryObjectivesUpdatesProto.new_objectives. |
priority |
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[] |
Harus disortir (dalam urutan meningkat) dengan semua elemen berbeda. |
values[] |
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[] |
|
columnIds[] |
|
coefficients[] |
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[] |
Harus berupa angka positif dan meningkat ketat. Nilai max(int64) tidak dapat digunakan. |
lowerBounds[] |
Harus memiliki panjang yang sama dengan batasan #linear, nilai dalam [-inf, inf). |
upperBounds[] |
Harus memiliki panjang yang sama dengan batasan #linear, nilai dalam (-inf, inf]. |
names[] |
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 ( |
Kolom | |
---|---|
linearTerms |
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 |
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 |
Harus memiliki nilai dalam [-inf, inf), dan lebih kecil dari atau sama dengan |
upperBound |
Harus memiliki nilai dalam (-inf, inf], dan lebih besar dari atau sama dengan |
name |
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 ( |
Kolom | |
---|---|
upperBound |
|
argumentsToNorm[] |
|
name |
Pesan induk mungkin memiliki persyaratan keunikan di kolom ini; misalnya, lihat |
LinearExpressionProto
Representasi renggang dari ekspresi linear (jumlah variabel berbobot, ditambah offset konstan).
Representasi JSON |
---|
{ "ids": [ string ], "coefficients": [ number ], "offset": number } |
Kolom | |
---|---|
ids[] |
ID variabel. Harus disortir (dalam urutan meningkat) dengan semua elemen berbeda. |
coefficients[] |
Harus memiliki panjang yang sama dengan ID. Nilai harus terbatas tidak boleh NaN. |
offset |
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 ( |
Kolom | |
---|---|
expressions[] |
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[] |
Kosong atau panjangnya sama dengan ekspresi. Jika kosong, bobot defaultnya adalah 1, 2, ... Jika ada, entri harus unik. |
name |
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 ( |
Kolom | |
---|---|
activateOnZero |
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 |
Harus berupa ekspresi linear yang valid sehubungan dengan model yang memuatnya: * Semua kondisi yang dinyatakan di |
lowerBound |
Harus memiliki nilai dalam [-inf, inf); tidak bisa NaN. |
upperBound |
Harus memiliki nilai dalam (-inf, inf]; tidak boleh NaN. |
name |
Pesan induk mungkin memiliki persyaratan keunikan di kolom ini; misalnya, lihat |
indicatorId |
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 ( |
Kolom | |
---|---|
timeLimit |
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 ' |
enableOutput |
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 |
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 |
Upaya menyederhanakan soal sebelum memulai algoritma utama, atau tingkat upaya default pemecah masalah jika EMPHASIS_UNSPECIFIED. |
cuts |
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 |
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 |
Upaya dalam menskalakan ulang masalah untuk meningkatkan stabilitas numerik, atau tingkat upaya default pemecah masalah jika EMPHASIS_UNSPECIFIED. |
iterationLimit |
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 |
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 |
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 |
Pemecah soal berhenti begitu cepat menemukan solusi yang minimal sebaik ini, dengan alasan penghentian MUDAH dan membatasi TUJUAN. |
bestBoundLimit |
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 |
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 |
Jika ditetapkan, nilainya harus >= 1. |
randomSeed |
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 |
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 |
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 |
Simpan hingga |
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 ( |
Kolom | |
---|---|
variableValuesFilter |
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 |
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 |
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 |
Dasar awal opsional untuk pemecah masalah LP simplex start warm. Jika ditetapkan, nilai tersebut diharapkan valid sesuai dengan |
solutionHints[] |
Petunjuk solusi opsional. Jika pemecah masalah yang mendasarinya hanya menerima satu petunjuk, petunjuk pertama akan digunakan. |
branchingPriorities |
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 |
Untuk SparseBoolVectorProto "zero" adalah |
filterByIds |
Jika true (benar), hanya tampilkan nilai yang sesuai dengan ID yang tercantum di filtersIds. |
filteredIds[] |
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 ( |
Kolom | |
---|---|
constraintStatus |
Status dasar batasan. Persyaratan: * constraintStatus.id sama dengan LinearConstraints.ids. |
variableStatus |
Status berbasis variabel. Persyaratan: * constraintStatus.id sama dengan VariablesProto.ids. |
basicDualFeasibility |
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 ( |
Kolom | |
---|---|
ids[] |
Harus disortir (dalam urutan meningkat) dengan semua elemen berbeda. |
values[] |
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 ( |
Kolom | |
---|---|
variableValues |
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 |
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[] |
Harus diurutkan (dalam urutan yang meningkat) dengan semua elemen yang berbeda. |
values[] |
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 ( |
Kolom | |
---|---|
termination |
Alasan pemecah berhenti. |
solutions[] |
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[] |
Petunjuk peningkatan dasar yang tidak terbatas, atau yang setara, dua sertifikat ketidaklayakan. Biasanya disediakan untuk PenghentianAlasanProtos UNBOUNDED dan DUAL_INFEASIBLE |
dualRays[] |
Petunjuk peningkatan ganda yang tidak terikat, atau yang setara, sertifikat ketidaklayakan utama. Biasanya disediakan untuk PenghentianAlasanProto TIDAK BOLEH. |
solveStats |
Statistik tentang proses memecahkan, mis. waktu berjalan, iterasi. |
TerminationProto
Semua informasi tentang mengapa panggilan ke Solve() dihentikan.
Representasi JSON |
---|
{ "reason": enum ( |
Kolom | |
---|---|
reason |
Informasi tambahan di |
limit |
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 |
Informasi tambahan yang biasanya memecahkan masalah terkait penghentian. |
problemStatus |
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 |
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 ( |
Kolom | |
---|---|
primalStatus |
Status untuk masalah utama. |
dualStatus |
Status untuk masalah ganda (atau untuk relaksasi ganda terus-menerus). |
primalOrDualInfeasible |
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 |
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 |
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 ( |
Kolom | |
---|---|
primalSolution |
|
dualSolution |
|
basis |
|
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 ( |
Kolom | |
---|---|
variableValues |
Persyaratan: * variabelValues.id adalah elemen VariablesProto.ids. * variabelValues.values harus terbatas. |
objectiveValue |
Nilai objektif seperti yang dikomputasi oleh pemecah masalah yang mendasarinya. Tidak boleh tak terbatas atau NaN. |
auxiliaryObjectiveValues |
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 |
feasibilityStatus |
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 ( |
Kolom | |
---|---|
dualValues |
Persyaratan: * dualValues.id adalah elemen LinearConstraints.ids. * dualValues.values harus terbatas. |
reducedCosts |
Persyaratan: * reduceCosts.id adalah elemen VariablesProto.ids. * lessCosts.values harus terbatas. |
feasibilityStatus |
Status kelayakan solusi sesuai dengan pemecah masalah yang mendasarinya. |
objectiveValue |
|
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 ( |
Kolom | |
---|---|
variableValues |
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 ( |
Kolom | |
---|---|
dualValues |
Persyaratan: * dualValues.id adalah elemen LinearConstraints.ids. * dualValues.values harus terbatas. |
reducedCosts |
Persyaratan: * reduceCosts.id adalah elemen VariablesProto.ids. * lessCosts.values harus terbatas. |
SolveStatsProto
Representasi JSON |
---|
{
"solveTime": string,
"problemStatus": {
object ( |
Kolom | |
---|---|
solveTime |
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 ' |
problemStatus |
Status kelayakan untuk masalah utama dan ganda. |
simplexIterations |
|
barrierIterations |
|
firstOrderIterations |
|
nodeCount |
|