Method: mathopt.solveMathOptModel

Löst das Eingabemodell und gibt das Ergebnis auf einmal zurück. Verwenden Sie diese Option, wenn Sie keine Callbacks und keine Steigerung der Conversions benötigen und den Fortschritt einer Lösung nicht verfolgen müssen.

HTTP-Anfrage

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

Die URL verwendet die Syntax der gRPC-Transcodierung.

Anfragetext

Der Anfragetext enthält Daten mit folgender Struktur:

JSON-Darstellung
{
  "solverType": enum (SolverTypeProto),
  "model": {
    object (ModelProto)
  },
  "parameters": {
    object (SolveParametersProto)
  },
  "modelParameters": {
    object (ModelSolveParametersProto)
  }
}
Felder
solverType

enum (SolverTypeProto)

Optional. Solver-Typ, um das Problem numerisch zu lösen. Wenn ein Matherechner eine bestimmte Funktion im Modell nicht unterstützt, ist der Optimierungsvorgang nicht erfolgreich.

model

object (ModelProto)

Erforderlich. Eine mathematische Darstellung des zu lösenden Optimierungsproblems.

parameters

object (SolveParametersProto)

Optional. Parameter zum Steuern einer einzelnen Lösung. Der Parameter „enableOutput“ wird speziell verarbeitet. Wenn der Solver, der Nachrichtenrückrufe unterstützt, auf „true“ setzt, registriert der Server einen Nachrichtenrückruf. Die resultierenden Nachrichten werden in SolveMathOptModelResponse.messages zurückgegeben. Bei anderen Solvern führt die Einstellung von „enableOutput“ auf „true“ zu einem Fehler.

modelParameters

object (ModelSolveParametersProto)

Optional. Parameter zum Steuern einer einzelnen Lösung, die für das Eingabemodell spezifisch sind. Modellunabhängige Parameter finden Sie unter „SolveParametersProto“.

Antworttext

Antwort auf eine unäre Remotelösung in MathOpt.

Bei Erfolg enthält der Antworttext Daten mit der folgenden Struktur:

JSON-Darstellung
{
  "result": {
    object (SolveResultProto)
  },
  "messages": [
    string
  ]
}
Felder
result

object (SolveResultProto)

Beschreibung der Ausgabe der Lösung des Modells in der Anfrage.

messages[]

string

Wenn „SolveParametersProto.enable_output“ verwendet wurde, enthält es Logeinträge für Solver, die Nachrichtenrückrufe unterstützen.

SolverTypeProto

Die von MathOpt unterstützten Solver.

Enums
SOLVER_TYPE_UNSPECIFIED
SOLVER_TYPE_GSCIP

Solving Constraint Integer Programs (SCIP) Solving (Drittanbieter) lösen.

Unterstützt LP-, MIP- und nicht konvexe ganzzahlige quadratische Probleme. Für LPs werden jedoch keine doppelten Daten zurückgegeben. Ich bevorzuge GLOP für LPs.

SOLVER_TYPE_GUROBI

Gurobi-Löser (Drittanbieter).

Unterstützt LP-, MIP- und nicht konvexe ganzzahlige quadratische Probleme. In der Regel die schnellste Option, allerdings mit Sonderlizenzierung.

SOLVER_TYPE_GLOP

Glop-Löser von Google

Unterstützt LP mit Primär- und Dual-Simplex-Methoden.

SOLVER_TYPE_CP_SAT

CP-SAT-Löser von Google

Unterstützt Probleme, bei denen alle Variablen Ganzzahlen und begrenzt sind (oder nach der Vorauflösung angedeutet werden sollen). Experimentelle Unterstützung für die Neuskalierung und Diskretisierung von Problemen mit kontinuierlichen Variablen.

SOLVER_TYPE_PDLP

den PDLP-Löser von Google.

Unterstützt LP- und konvexe diagonale quadratische Ziele. Verwendet Methoden der ersten Ordnung anstelle von Simplex. Kann sehr große Probleme lösen.

SOLVER_TYPE_GLPK

GNU Linear Programming Kit (GLPK) (Drittanbieter).

Unterstützt MIP und LP.

Thread-Sicherheit: GLPK verwendet für die Speicherzuweisung einen Thread-lokalen Speicher. Infolgedessen müssen Solver-Instanzen im selben Thread gelöscht werden, in dem sie erstellt werden, da GLPK sonst nicht abstürzt. Es scheint in Ordnung zu sein, Solver::Solve() von einem anderen Thread als dem, mit dem der Solver erstellt wurde, aufzurufen, aber dies wird nicht durch GLPK dokumentiert und sollte vermieden werden.

Beim Lösen einer LP mit dem Presolver werden nur dann eine Lösung (und die ungebundenen Strahlen) zurückgegeben, wenn eine optimale Lösung gefunden wurde. Andernfalls wird nichts zurückgegeben. Weitere Informationen finden Sie unter glpk-5.0/doc/glpk.pdf Seite 40, verfügbar von glpk-5.0.tar.gz.

SOLVER_TYPE_OSQP

Der Operator „Operation Splitting Quadratic Program“ (OSQP) (Drittanbieter).

Unterstützt kontinuierliche Probleme mit linearen Einschränkungen und linearen oder konvexen quadratischen Zielen. Es wird eine Methode erster Ordnung verwendet.

SOLVER_TYPE_ECOS

The Embedded Conic Solver (ECOS) (Drittanbieter).

Unterstützt LP- und SOCP-Probleme. Verwendet innere Punktmethoden (Barriere).

SOLVER_TYPE_SCS

The Splitting Conic Solver (SCS) (Drittanbieter).

Unterstützt LP- und SOCP-Probleme. Es wird eine Methode erster Ordnung verwendet.

SOLVER_TYPE_HIGHS

The HiGHS Solver (Drittanbieter).

Unterstützt LP- und MIP-Probleme (konvexe QPs sind nicht implementiert).

SOLVER_TYPE_SANTORINI

Referenzimplementierung eines MIP-Lösers von MathOpt

Langsam/für die Produktion nicht empfohlen. Kein LP-Löser (keine doppelten Informationen zurückgegeben).

ModelProto

Ein Optimierungsproblem. MathOpt unterstützt: – Kontinuierliche und Ganzzahl-Entscheidungsvariablen mit optionalen endlichen Grenzen. - Lineare und quadratische Ziele (ein oder mehrere Ziele), minimiert oder maximiert. - Eine Reihe von Einschränkungstypen, darunter: * Lineare Begrenzungen * Quadratische Begrenzungen * Kegelbeschränkungen zweiter Ordnung * Logische Beschränkungen > SOS1- und SOS2-Einschränkungen > Indikatoreinschränkungen

Standardmäßig werden Einschränkungen in „ID zu Daten“ dargestellt. Karten. Wir stellen jedoch lineare Einschränkungen in einer effizienteren "Struktur aus Arrays" dar. Format.

JSON-Darstellung
{
  "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)
    },
    ...
  }
}
Felder
name

string

variables

object (VariablesProto)

objective

object (ObjectiveProto)

Das primäre Ziel im Modell.

auxiliaryObjectives

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

Zusätzliche Ziele zur Verwendung in Modellen mit mehreren Zielen.

Die Zuordnungsschlüssel-IDs müssen in [0, max(int64)) vorliegen. Jede Priorität und alle nicht leeren Namen müssen eindeutig sein und sich vom primären objective unterscheiden.

Ein Objekt, das eine Liste von "key": value-Paaren enthält. Beispiel: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

linearConstraints

object (LinearConstraintsProto)

linearConstraintMatrix

object (SparseDoubleMatrixProto)

Die variablen Koeffizienten für die linearen Einschränkungen.

Wenn eine an dieser Einschränkung beteiligte Variable gelöscht wird, wird sie so behandelt, als wäre sie auf null gesetzt.

Anforderungen: * „linearConstraintMatrix.row_ids“ sind Elemente von „linearConstraints.ids“. * linearConstraintMatrix.column_ids sind Elemente von „variables.ids“. * Nicht angegebene Matrixeinträge sind null. * linearConstraintMatrix.values müssen alle endlich sein.

quadraticConstraints

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

Quadratische Einschränkungen im Modell.

Ein Objekt, das eine Liste von "key": value-Paaren enthält. Beispiel: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

secondOrderConeConstraints

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

Kegeleinschränkungen zweiter Ordnung im Modell.

Ein Objekt, das eine Liste von "key": value-Paaren enthält. Beispiel: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

sos1Constraints

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

SOS1-Einschränkungen im Modell, die einschränken, dass höchstens ein expression ungleich null sein kann. Die optionalen weights-Einträge sind ein Implementierungsdetail, das vom Rechner verwendet wird, um (hoffentlich) schneller zu konvergieren. Genauer gesagt: Solver können diese Gewichtungen nutzen (oder auch nicht), um Verzweigungen auszuwählen, die zu „ausgeglichenen“ untergeordneten Knoten.

Ein Objekt, das eine Liste von "key": value-Paaren enthält. Beispiel: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

sos2Constraints

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

SOS2-Einschränkungen im Modell, die einschränken, dass höchstens zwei Einträge von expression ungleich null sein können und in ihrer Reihenfolge benachbart sein müssen. Wenn keine weights angegeben sind, entspricht diese Reihenfolge der linearen Reihenfolge in der expressions-Liste. Wenn weights präsentiert werden, wird die Reihenfolge in Bezug auf diese Werte in aufsteigender Reihenfolge verwendet.

Ein Objekt, das eine Liste von "key": value-Paaren enthält. Beispiel: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

indicatorConstraints

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

Indikatoreinschränkungen im Modell, die durchsetzen, dass, wenn eine binäre „Indikatorvariable“ auf „1“ festgelegt ist, wird eine „implizite Einschränkung“ enthalten sein muss.

Ein Objekt, das eine Liste von "key": value-Paaren enthält. Beispiel: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

VariablesProto

Wie unten verwendet, definieren wir „#variables“. = size(VariablesProto.ids) festgelegt wird.

JSON-Darstellung
{
  "ids": [
    string
  ],
  "lowerBounds": [
    number
  ],
  "upperBounds": [
    number
  ],
  "integers": [
    boolean
  ],
  "names": [
    string
  ]
}
Felder
ids[]

string (int64 format)

Darf nicht negativ sein und muss strikt steigend sein. Der max(int64)-Wert kann nicht verwendet werden.

lowerBounds[]

number

Muss die Länge von „#variables“ entsprechen, die Werte in [-inf, inf).

upperBounds[]

number

Muss die Länge #variables entsprechen, Werte in (-inf, inf].

integers[]

boolean

Die Länge muss dem Wert #variables entsprechen. Der Wert ist "false" für kontinuierliche Variablen und "true" für Ganzzahlvariablen.

names[]

string

Wenn nicht festgelegt, wird davon ausgegangen, dass es sich um leere Strings handelt. Andernfalls sollte die Länge gleich #variables sein.

Alle Namen müssen eindeutig sein.

ObjectiveProto

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

boolean

"false" bedeutet "minimieren", "true" bedeutet "maximieren"

offset

number

Muss endlich sein und nicht NaN.

linearCoefficients

object (SparseDoubleVectorProto)

ObjectiveProto-Begriffe, die in den Entscheidungsvariablen linear sind.

Anforderungen: * „linearCoefficients.ids“ ist Elemente von „VariablesProto.ids“. * Nicht angegebene VariablesProto entsprechen null. * linearCoefficiencys.values müssen alle endlich sein. * linearCoefficients.values kann null sein, verschwendet aber Platz.

quadraticCoefficients

object (SparseDoubleMatrixProto)

Zielbegriffe, die in den Entscheidungsvariablen quadratisch sind.

Zusätzlich zu den Anforderungen in SparseDoubleMatrixProto-Nachrichten: * Jedes Element von „quadraticCoefficients.row_ids“ und jedes Element von „quadraticCoefficients.column_ids“ muss ein Element von „VariablesProto.ids“ sein. * Die Matrix muss oben in Dreiecksform dargestellt werden: für jedes i „quadraticCoefficients.row_ids[i] <= quadraticCoefficients.column_ids[i]“.

Hinweis: * Begriffe, die nicht explizit gespeichert sind, haben den Koeffizienten null. * Elemente von „quadraticCoeffizienten.coeffizienten“ können null sein, aber das verschwendet einfach Platz.

name

string

Für übergeordnete Nachrichten gelten möglicherweise Eindeutigkeitsanforderungen für dieses Feld. Siehe z.B. ModelProto.objectives und AuxiliaryObjectivesUpdatesProto.new_objectives.

priority

string (int64 format)

Bei Problemen mit mehreren Zielen die Priorität dieses Ziels im Vergleich zu den anderen (niedrigere Priorität ist wichtiger). Dieser Wert darf nicht negativ sein. Darüber hinaus muss jede objektive Priorität im Modell zum Zeitpunkt der Lösung eindeutig sein. Diese Bedingung wird nicht auf Proto-Ebene validiert, sodass Modelle vorübergehend Ziele mit derselben Priorität haben können.

SparseDoubleVectorProto

Eine dünnbesetzte Darstellung eines Vektors von Double-Werten.

JSON-Darstellung
{
  "ids": [
    string
  ],
  "values": [
    number
  ]
}
Felder
ids[]

string (int64 format)

Muss mit unterschiedlichen Elementen sortiert werden (in aufsteigender Reihenfolge).

values[]

number

Muss dieselbe Länge wie IDs haben. Darf keine NaN enthalten.

SparseDoubleMatrixProto

Eine dünnbesetzte Darstellung einer Matrix von Double-Werten.

Die Matrix wird als Dreifach von Zeilen-ID, Spalten-ID und Koeffizient gespeichert. Diese drei Vektoren müssen die gleiche Länge haben. Für alle i muss das Tupel (rowIds[i], columnIds[i]) eindeutig sein. Einträge müssen in der Hauptreihenfolge der Zeile angegeben werden.

JSON-Darstellung
{
  "rowIds": [
    string
  ],
  "columnIds": [
    string
  ],
  "coefficients": [
    number
  ]
}
Felder
rowIds[]

string (int64 format)

columnIds[]

string (int64 format)

coefficients[]

number

Darf keine NaN enthalten.

LinearConstraintsProto

Wie unten verwendet, definieren wir = size(LinearConstraintsProto.ids).

JSON-Darstellung
{
  "ids": [
    string
  ],
  "lowerBounds": [
    number
  ],
  "upperBounds": [
    number
  ],
  "names": [
    string
  ]
}
Felder
ids[]

string (int64 format)

Darf nicht negativ sein und muss strikt steigend sein. Der max(int64)-Wert kann nicht verwendet werden.

lowerBounds[]

number

Sollte die Länge der #linearen Einschränkungen entsprechen, die Werte in [-inf, inf).

upperBounds[]

number

Muss die Länge von #linearen Einschränkungen entsprechen, die Werte in (-inf, inf].

names[]

string

Wenn nicht festgelegt, wird davon ausgegangen, dass es sich um leere Strings handelt. Andernfalls sollte die Länge gleich der #linearen Einschränkung entsprechen.

Alle Namen müssen eindeutig sein.

QuadraticConstraintProto

Eine einzelne quadratische Einschränkung in der Form: lb <= sum{linearTerms} + sum{quadraticTerms} <= ub.

Wenn eine an dieser Einschränkung beteiligte Variable gelöscht wird, wird sie so behandelt, als wäre sie auf null gesetzt.

JSON-Darstellung
{
  "linearTerms": {
    object (SparseDoubleVectorProto)
  },
  "quadraticTerms": {
    object (SparseDoubleMatrixProto)
  },
  "lowerBound": number,
  "upperBound": number,
  "name": string
}
Felder
linearTerms

object (SparseDoubleVectorProto)

Begriffe, die in den Entscheidungsvariablen linear sind.

Zusätzlich zu den Anforderungen für SparseDoubleVectorProto-Nachrichten ist Folgendes erforderlich: * linearTerms.ids sind Elemente von VariablesProto.ids. * linearTerms.values müssen alle endlich sein und dürfen nicht NaN sein.

Hinweise: * Ausgelassene Variablen-IDs haben einen entsprechenden Koeffizienten von null. * linearTerms.values können null sein, aber das verschwendet Platz.

quadraticTerms

object (SparseDoubleMatrixProto)

Begriffe, die in den Entscheidungsvariablen quadratisch sind.

Zusätzlich zu den Anforderungen für SparseDoubleMatrixProto-Nachrichten ist Folgendes erforderlich: * Jedes Element von „quadraticTerms.row_ids“ und jedes Element von „quadraticTerms.column_ids“ muss ein Element von „VariablesProto.ids“ sein. * Die Matrix muss oben in Dreiecksform dargestellt werden: für jedes i: quadraticTerms.row_ids[i] <= quadraticTerms.column_ids[i].

Hinweis: * Begriffe, die nicht explizit gespeichert sind, haben den Koeffizienten null. * Elemente von „quadraticTerms.coefficients“ können null sein, aber das verschwendet einfach Platz.

lowerBound

number

Muss einen Wert in [-inf, inf) haben und kleiner oder gleich upperBound sein.

upperBound

number

Muss einen Wert in (-inf, inf] haben und größer oder gleich lowerBound sein.

name

string

Für übergeordnete Nachrichten gelten möglicherweise Eindeutigkeitsanforderungen für dieses Feld. Siehe z.B. ModelProto.quadratic_constraints und QuadraticConstraintUpdatesProto.new_constraints.

SecondOrderConeConstraintProto

Eine einzelne Kegeleinschränkung zweiter Ordnung in der Form:

||argumentsToNorm||_2 <= upperBound,

Dabei sind upperBound und jedes Element von argumentsToNorm lineare Ausdrücke.

Wenn eine an dieser Einschränkung beteiligte Variable gelöscht wird, wird sie so behandelt, als wäre sie auf null gesetzt.

JSON-Darstellung
{
  "upperBound": {
    object (LinearExpressionProto)
  },
  "argumentsToNorm": [
    {
      object (LinearExpressionProto)
    }
  ],
  "name": string
}
Felder
upperBound

object (LinearExpressionProto)

argumentsToNorm[]

object (LinearExpressionProto)

name

string

Für übergeordnete Nachrichten gelten möglicherweise Eindeutigkeitsanforderungen für dieses Feld. Siehe z.B. ModelProto.second_order_cone_constraints und SecondOrderConeConstraintUpdatesProto.new_constraints.

LinearExpressionProto

Eine dünnbesetzte Darstellung eines linearen Ausdrucks (gewichtete Summe von Variablen plus einem konstanten Offset).

JSON-Darstellung
{
  "ids": [
    string
  ],
  "coefficients": [
    number
  ],
  "offset": number
}
Felder
ids[]

string (int64 format)

IDs von Variablen. Muss mit unterschiedlichen Elementen sortiert werden (in aufsteigender Reihenfolge).

coefficients[]

number

Muss dieselbe Länge wie IDs haben. Werte müssen endlich sein und dürfen nicht NaN sein.

offset

number

Muss endlich sein und darf nicht NaN sein.

SosConstraintProto

Daten zur Darstellung einer einzelnen SOS1- oder SOS2-Einschränkung.

Wenn eine an dieser Einschränkung beteiligte Variable gelöscht wird, wird sie so behandelt, als wäre sie auf null gesetzt.

JSON-Darstellung
{
  "expressions": [
    {
      object (LinearExpressionProto)
    }
  ],
  "weights": [
    number
  ],
  "name": string
}
Felder
expressions[]

object (LinearExpressionProto)

Die Ausdrücke, auf die die SOS-Einschränkung angewendet werden soll: * SOS1: Höchstens ein Element verwendet einen Wert ungleich null. * SOS2: Höchstens zwei Elemente nehmen Werte ungleich null an und sie müssen in der wiederholten Reihenfolge benachbart sein.

weights[]

number

Entweder leer oder gleich lang wie die Ausdrücke. Wenn leer, sind die Standardgewichtungen 1, 2, ... Falls vorhanden, müssen die Einträge eindeutig sein.

name

string

Für übergeordnete Nachrichten gelten möglicherweise Eindeutigkeitsanforderungen für dieses Feld. Siehe z.B. ModelProto.sos1_constraints und SosConstraintUpdatesProto.new_constraints.

IndicatorConstraintProto

Daten zur Darstellung einer einzelnen Indikatoreinschränkung im folgenden Format: Variable(indicatorId) = (activateOnZero ? 0 : 1) DESC Untergrenze <= Ausdruck <= Obergrenze.

Wenn eine an dieser Einschränkung beteiligte Variable (entweder der Indikator oder die in expression enthaltene) gelöscht wird, wird sie so behandelt, als wäre sie auf null gesetzt. Insbesondere bedeutet das Löschen der Indikatorvariable, dass die Indikatoreinschränkung ungültig ist, wenn activateOnZero falsch ist, und dass sie einer linearen Einschränkung entspricht, wenn activateOnZero wahr ist.

JSON-Darstellung
{
  "activateOnZero": boolean,
  "expression": {
    object (SparseDoubleVectorProto)
  },
  "lowerBound": number,
  "upperBound": number,
  "name": string,
  "indicatorId": string
}
Felder
activateOnZero

boolean

Wenn der Wert „true“ ist und die Indikatorvariable den Wert 0 annimmt, muss die implizite Einschränkung gelten. Wenn die Indikatorvariable den Wert 1 annimmt, muss die implizite Einschränkung gelten.

expression

object (SparseDoubleVectorProto)

Muss ein gültiger linearer Ausdruck in Bezug auf das enthaltene Modell sein: * Alle angegebenen Bedingungen in SparseDoubleVectorProto, * Alle Elemente von expression.values müssen endlich sein, * expression.ids sind eine Teilmenge von VariablesProto.ids.

lowerBound

number

Muss einen Wert in [-inf, inf); darf nicht NaN sein.

upperBound

number

Muss einen Wert in (-inf, inf] haben, darf nicht NaN sein.

name

string

Für übergeordnete Nachrichten gelten möglicherweise Eindeutigkeitsanforderungen für dieses Feld. Siehe z.B. ModelProto.indicator_constraints und IndicatorConstraintUpdatesProto.new_constraints.

indicatorId

string (int64 format)

Eine ID, die einer Binärvariablen entspricht oder nicht festgelegt ist. Wenn kein Wert festgelegt ist, wird die Indikatoreinschränkung ignoriert. Wenn festgelegt, wird Folgendes vorausgesetzt: * VariablesProto.integers[indicatorId] = true, * VariablesProto.lower_bounds[indicatorId] >= 0, * VariablesProto.upper_bounds[indicatorId] <= 1. Diese Bedingungen werden von MathOpt nicht validiert. Wenn sie jedoch nicht erfüllt sind, gibt der Solver bei der Lösung einen Fehler zurück.

SolveParametersProto

Parameter zum Steuern einer einzelnen Lösung.

Enthält beide Parameter, die allen Rechnern gemeinsam sind, z.B. timeLimit und Parameter für einen bestimmten Solver, z.B. gscip. Wenn ein Wert sowohl in einem allgemeinen als auch in einem Solver-spezifischen Feld festgelegt ist, wird die Solver-spezifische Einstellung verwendet.

Die allgemeinen Parameter, die optional und nicht festgelegt sind, oder eine Aufzählung mit nicht angegebenem Wert weisen darauf hin, dass der Solver-Standardwert verwendet wird.

Solver-spezifische Parameter für andere als den verwendeten Solver werden ignoriert.

Parameter, die vom Modell abhängen (z.B. Verzweigungspriorität für jede Variable festgelegt), werden in ModelSolveParametersProto übergeben.

JSON-Darstellung
{
  "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
}
Felder
timeLimit

string (Duration format)

Die maximale Zeit, die ein Matherechner mit dem Problem verbringen sollte (oder unendlich, falls die Funktion nicht festgelegt ist).

Dieser Wert ist keine feste Begrenzung. Die Zeit bis zur Lösung kann diesen Wert geringfügig überschreiten. Dieser Parameter wird immer an den zugrunde liegenden Rechner übergeben. Der Standardrechner wird nicht verwendet.

Die Dauer in Sekunden mit bis zu neun Nachkommastellen und am Ende mit "s". Beispiel: "3.5s".

enableOutput

boolean

Aktiviert das Drucken der Tracer-Implementierungs-Traces für den Solver. Wo sich diese Spuren befinden, hängt vom Matherechner ab. Bei SCIP und Gurobi ist dies die Standardausgabestreams. Bei Glop und CP-SAT lautet dies LOG(INFO).

Wenn der Solverr den Nachrichten-Callback unterstützt und der Nutzer einen Callback dafür registriert, wird dieser Parameterwert ignoriert und es werden keine Einträge ausgegeben.

lpAlgorithm

enum (LPAlgorithmProto)

Der Algorithmus zum Lösen eines linearen Programms. Wenn LP_ALGORITHM_UNSPECIFIED festgelegt ist, verwende den Standardalgorithmus des Solver.

Für Probleme, die keine linearen Programme sind, bei denen die lineare Programmierung jedoch eine Subroutine ist, kann dieser Wert von Matherechnern verwendet werden. Beispiel: MIP-Slöser verwenden diese Option in der Regel nur für die Root-LP-Lösung (und ansonsten Dual-Simplex).

presolve

enum (EmphasisProto)

Versuche, das Problem zu vereinfachen, bevor du den Hauptalgorithmus startest, bzw. den Standard-Anstrengungsgrad des Solver, falls dieser Wert EMPHASIS_UNSPECIFIED ist.

cuts

enum (EmphasisProto)

Bemühungen um eine stärkere Entspannung der LP (nur MIP) oder das Standard-Anstrengungsniveau des Solver, wenn EMPHASIS_UNSPECIFIED.

HINWEIS: Wenn du Schnitte deaktivierst, können bei Callbacks möglicherweise keine Schnitte bei MIP_NODE hinzugefügt werden. Dieses Verhalten ist löserspezifisch.

heuristics

enum (EmphasisProto)

Aufwand bei der Suche nach praktikablen Lösungen, die über die bei der vollständigen Suche gefundenen Lösungen (nur MIP) hinausgehen, oder der Standard-Makler-Anstrengungsgrad, falls EMPHASIS_UNSPECIFIED.

scaling

enum (EmphasisProto)

Aufwand bei der Neuskalierung des Problems, um die numerische Stabilität zu verbessern, oder das Standard-Anstrengungsniveau des Solver, falls EMPHASIS_UNSPECIFIED.

iterationLimit

string (int64 format)

Grenzen der Iterationen des zugrunde liegenden Algorithmus (z. B. Simplex-Pivots) Das spezifische Verhalten hängt vom verwendeten Solver und Algorithmus ab, kann aber oft zu einem deterministischen Lösungslimit führen. Möglicherweise ist eine weitere Konfiguration erforderlich, z. B. ein Thread.

Wird normalerweise von LP-, QP- und MIP-Slösern unterstützt, für MIP-Löser siehe auch nodeLimit.

nodeLimit

string (int64 format)

Begrenzung der Anzahl von Teilproblemen, die bei der enumerativen Suche gelöst werden (z.B. Verzweigung und gebunden). Bei vielen Solvern kann dies verwendet werden, um die Berechnung deterministisch einzuschränken. Eventuell ist eine weitere Konfiguration erforderlich, z. B. ein Thread.

Normalerweise für MIP-Löser siehe auch iterationLimit.

cutoffLimit

number

Der Matherechner stoppt früher, wenn er beweisen kann, dass es keine ursprünglichen Lösungen gibt, die mindestens so gut sind wie die Abweichung.

Bei einem vorzeitigen Stopp gibt der Solver den Beendigungsgrund NO_SOLUTION_FOUND und mit dem Limit CUTOFF zurück und muss keine zusätzlichen Lösungsinformationen angeben. Hat keine Auswirkungen auf den Rückgabewert, wenn es keinen vorzeitigen Stopp gibt.

Sie sollten einen Toleranzwert verwenden, wenn Lösungen zurückgegeben werden sollen, deren Ziel genau dem Grenzwert entspricht.

Weitere Einzelheiten und einen Vergleich mit bestBoundLimit finden Sie im Nutzerhandbuch.

objectiveLimit

number

Der Matherechner stoppt früher, sobald eine mindestens so gute Lösung gefunden wurde. Der Grund für die Beendigung ist MÖGLICH und das ZIEL EIN begrenzt.

bestBoundLimit

number

Der Matherechner stoppt früher, sobald er die beste Grenze mindestens so gut hat. Der Grund für die Beendigung ist FEASIBLE oder NO_SOLUTION_FOUND und der Grenzwert OBJECTIVE.

Weitere Einzelheiten und einen Vergleich mit „cutoffLimit“ finden Sie im Nutzerhandbuch.

solutionLimit

integer

Der Matherechner stoppt früher, nachdem er so viele durchführbare Lösungen gefunden hat, mit dem Beendigungsgrund MÖGLICH und schränkt LÖSUNG ein. Muss größer als null sein, wenn festgelegt. Sie wird oft verwendet, um den Matherechner bei der ersten praktikablen Lösung abzubrechen. Beachten Sie, dass es keine Garantie für den Zielwert der zurückgegebenen Lösungen gibt.

Solver geben normalerweise nicht mehr Lösungen als das Lösungslimit zurück, aber dies wird von MathOpt nicht durchgesetzt, siehe auch b/214041169.

Wird derzeit für Gurobi und SCIP und für CP-SAT nur mit dem Wert 1 unterstützt.

threads

integer

Wenn festgelegt, muss der Wert größer oder gleich 1 sein.

randomSeed

integer

Seed für den Pseudozufallszahlengenerator im zugrunde liegenden Rechner Beachte, dass alle Matherechner Pseudozufallszahlen verwenden, um Dinge wie Störungen im LP-Algorithmus, für Tie-Break-Up-Regeln und für heuristische Korrekturen auszuwählen. Die Abweichung kann einen spürbaren Einfluss auf das Verhalten des Matherechners haben.

Alle Solver haben ein sogenanntes „Seeds“-Konzept. Beachte jedoch, dass gültige Werte vom tatsächlichen Solver abhängig sind. - Gurobi: [0:GRB_MAXINT] (ab Gurobi 9.0 ist 2x10^9). - GSCIP: [0:2147483647] (entspricht MAX_INT oder kint32max oder 2^31-1). - GLOP: [0:2147483647] (wie oben) In allen Fällen erhält der Solver einen Wert gleich: MAX(0, MIN(MAX_VALID_VALUE_FOR_SOLVER, randomSeed)).

absoluteGapTolerance

number

Eine absolute Optimitätstoleranz (hauptsächlich) für MIP-Löser.

Der absolute GAP ist der absolute Wert der Differenz zwischen: * dem Zielwert der gefundenen am besten geeigneten Lösung und * der durch die Suche erzeugten Doppelgrenze. Der Solver kann angehalten werden, wenn der absolute GAP höchstens die absoluteGapTolerance hat (falls festgelegt) und TERMINATION_REASON_OPTIMAL zurückgeben.

Muss >= 0 sein, falls festgelegt.

Siehe auch relativeGapTolerance.

relativeGapTolerance

number

Eine relative Optimitätstoleranz (hauptsächlich) für MIP-Löser.

Der relative GAP ist eine normalisierte Version des absoluten GAP (definiert auf absoluteGapTolerance), wobei die Normalisierung löserabhängig ist, z.B. den absoluten GAP geteilt durch den Zielwert der am besten geeigneten Lösung.

Der Solver kann angehalten werden, wenn die relative GAP höchstens eine relative GapTolerance ist (falls festgelegt) und TERMINATION_REASON_OPTIMAL zurückgeben.

Muss >= 0 sein, falls festgelegt.

Siehe auch absoluteGapTolerance.

solutionPoolSize

integer

Bis zu solutionPoolSize Lösungen bei der Suche beibehalten. Der Lösungspool hat in der Regel zwei Funktionen: (1) Für Solver, die mehr als eine Lösung zurückgeben können, wird dadurch die Anzahl der Lösungen begrenzt. (2) Einige Matherechner verwenden möglicherweise Heuristiken mit Lösungen aus dem Lösungspool. Eine Änderung dieses Werts kann sich daher auf den Pfad des Algorithmus auswirken. Damit der Matherechner den Lösungspool füllt, z.B. mit den n besten Lösungen, erfordert eine weitere, Solver-spezifische Konfiguration.

LPAlgorithmProto

Wählt einen Algorithmus zum Lösen linearer Programme aus.

Enums
LP_ALGORITHM_UNSPECIFIED
LP_ALGORITHM_PRIMAL_SIMPLEX Die (ursprüngliche) Simplex-Methode. In der Regel kann eine Grund- und Doppellösung, die Urzeitstrahlen bei einer ungebundenen Urzeit und zwei unbegrenzte Probleme und eine Basis bereitgestellt werden.
LP_ALGORITHM_DUAL_SIMPLEX Die Dual-Simplex-Methode. In der Regel kann eine Grund- und Doppellösung, die Urzeitstrahlen bei einer ungebundenen Urzeit und zwei unbegrenzte Probleme und eine Basis bereitgestellt werden.
LP_ALGORITHM_BARRIER Die Barrieremethode, auch IPM (Inner Point Method) genannt. Kann in der Regel sowohl eine Grundlösung als auch eine doppelte Lösung liefern. Einige Implementierungen können auch Strahlen für unbegrenzte/nicht durchführbare Probleme erzeugen. Eine Basis wird nur angegeben, wenn der zugrunde liegende Solver einen Crossover durchführt. und endet mit „simplex“.
LP_ALGORITHM_FIRST_ORDER Algorithmus, der auf einer Methode erster Ordnung basiert. Diese führen typischerweise sowohl zu ursprünglichen als auch zu doppelten Lösungen und möglicherweise auch zu Bescheinigungen der ursprünglichen und/oder doppelten Undurchführbarkeit. Erstrangige Methoden bieten in der Regel Lösungen mit einer geringeren Genauigkeit. Daher sollten Nutzende darauf achten, Parameter für die Lösungsqualität (z. B. Toleranzen) festzulegen und Lösungen zu validieren.

EmphasisProto

Anstrengungsgrad, der auf eine optionale Aufgabe beim Lösen angewendet wird (siehe Verwendung von SolveParametersProto).

„Hervorhebung“ wird verwendet, um eine Solver-Funktion wie folgt zu konfigurieren: * Wenn ein Matherechner diese Funktion nicht unterstützt, ist nur UNSPECIFIED immer gültig. Jede andere Einstellung führt in der Regel zu einem Fehler aufgrund eines ungültigen Arguments. Einige Solverner akzeptieren möglicherweise auch „AUS“. * Wenn der Matherechner diese Funktion unterstützt: – Wenn die Richtlinie auf UNSPECIFIED gesetzt ist, wird der zugrunde liegende Standardwert verwendet. - Wenn die Funktion nicht deaktiviert werden kann, gibt die Option AUS einen Fehler zurück. – Wenn die Funktion standardmäßig aktiviert ist, wird der Rechner als Standardeinstellung in der Regel MEDIUM zugewiesen. - Wenn die Funktion unterstützt wird, geben LOW, MEDIUM, HIGH und VERY HIGH keinen Fehler zurück und die Zuordnung erfolgt entsprechend der besten Übereinstimmung.

Enums
EMPHASIS_UNSPECIFIED
EMPHASIS_OFF
EMPHASIS_LOW
EMPHASIS_MEDIUM
EMPHASIS_HIGH
EMPHASIS_VERY_HIGH

ModelSolveParametersProto

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

object (SparseVectorFilterProto)

Filter, der auf alle zurückgegebenen dünnbesetzten Container angewendet wird, die nach Variablen in PrimalSolutionProto und PrimalRayProto codiert sind (PrimalSolutionProto.variable_values, PrimalRayProto.variable_values).

Anforderungen: * filterIds sind Elemente von VariablesProto.ids.

dualValuesFilter

object (SparseVectorFilterProto)

Filter, der auf alle zurückgegebenen dünnbesetzten Container angewendet wird, die durch lineare Einschränkungen in DualSolutionProto und DualRay (DualSolutionProto.dual_values, DualRay.dual_values) codiert sind.

Anforderungen: * filterIds sind Elemente von LinearConstraints.ids.

reducedCostsFilter

object (SparseVectorFilterProto)

Filter, der auf alle zurückgegebenen dünnbesetzten Container angewendet wird, die durch Variablen in DualSolutionProto und DualRay (DualSolutionProto.reduced_costs, DualRay.reduced_costs) codiert sind.

Anforderungen: * filterIds sind Elemente von VariablesProto.ids.

initialBasis

object (BasisProto)

Optionale Ausgangsbasis für einfache LP-Löser mit Warmstartfunktion. Wenn es festgelegt ist, wird es gemäß ValidateBasis in validators/solution_validator.h für den aktuellen ModelSummary als gültig erachtet.

solutionHints[]

object (SolutionHintProto)

Optionale Lösungshinweise. Wenn der zugrunde liegende Solver nur einen einzigen Hinweis akzeptiert, wird der erste verwendet.

branchingPriorities

object (SparseInt32VectorProto)

Optionale Verzweigungsprioritäten. Variablen mit höheren Werten werden zuerst verzweigt. Variablen, für die keine Prioritäten festgelegt sind, erhalten die Standardpriorität des Solver (normalerweise null).

Anforderungen: * BranchingPriorities.values müssen endlich sein. * BranchingPriorities.ids muss Elemente von VariablesProto.ids sein.

SparseVectorFilterProto

Mit dieser Nachricht können bestimmte Teile von SparseXxxxVector abgefragt/festgelegt werden. Standardmäßig wird nichts herausgefiltert. Häufig werden nur Teile von Lösungen abgefragt (nur Werte ungleich null und/oder nur ein handverlesener Satz von Variablenwerten).

JSON-Darstellung
{
  "skipZeroValues": boolean,
  "filterByIds": boolean,
  "filteredIds": [
    string
  ]
}
Felder
skipZeroValues

boolean

Für SparseBoolVectorProto „zero“ ist false.

filterByIds

boolean

Bei "true" werden nur die Werte zurückgegeben, die den IDs entsprechen, die unter "filterIds" aufgelistet sind.

filteredIds[]

string (int64 format)

Die Liste der IDs, die verwendet werden sollen, wenn filterByIds wahr ist. Muss leer sein, wenn filterByIds auf "false" gesetzt ist. HINWEIS: Wenn das Feld leer ist und filterByIds auf "true" gesetzt ist, geben Sie an, dass keine Informationen im Ergebnis enthalten sein sollen.

BasisProto

Eine kombinatorische Charakterisierung für eine Lösung für ein lineares Programm.

Die Simplex-Methode zum Lösen linearer Programme gibt immer eine „grundlegende praktikable Lösung“ zurück. die durch eine Basis kombinatorisch beschrieben werden können. Eine Basis weist jeder Variablen und linearen Einschränkung ein BasisStatusProto zu.

Beispiel: eine Standardform von LP: min c * x s.t. A * x = b x >= 0, die mehr Variablen als Einschränkungen und mit dem vollständigen Zeilenrang A hat.

Lass n die Anzahl der Variablen und m die Anzahl der linearen Einschränkungen sein. Eine gültige Grundlage für dieses Problem kann folgendermaßen erstellt werden: * Alle Einschränkungen haben den Basisstatus FIXED. * Wählen Sie m Variablen so aus, dass die Spalten von A linear unabhängig sind, und weisen Sie ihnen den Status BASIC zu. * Weisen Sie den verbleibenden n bis m Variablen den Status AT_LOWER zu.

Die grundlegende Lösung für diese Basis ist die eindeutige Lösung von A * x = b, bei der alle Variablen mit dem Status AT_LOWER auf ihre Untergrenze festgelegt sind (alle Nullen). Die resultierende Lösung wird als einfache durchführbare Lösung bezeichnet, wenn sie auch x >= 0 erfüllt.

JSON-Darstellung
{
  "constraintStatus": {
    object (SparseBasisStatusVector)
  },
  "variableStatus": {
    object (SparseBasisStatusVector)
  },
  "basicDualFeasibility": enum (SolutionStatusProto)
}
Felder
constraintStatus

object (SparseBasisStatusVector)

Einschränkungsbasisstatus.

Anforderungen: * constrainStatus.ids ist gleich LinearConstraints.ids.

variableStatus

object (SparseBasisStatusVector)

Variablenbasisstatus.

Anforderungen: * ConstraintStatus.ids entspricht VariablesProto.ids.

basicDualFeasibility

enum (SolutionStatusProto)

Dies ist eine erweiterte Funktion, die von MathOpt verwendet wird, um die Machbarkeit suboptimaler LP-Lösungen zu bestimmen. Optimale Lösungen haben immer den Status SOLUTION_STATUS_FEASIBLE.

Bei einseitigen LPs sollte der Wert dem Machbarkeitsstatus der zugehörigen doppelten Lösung entsprechen. Bei zweiseitigen LPs kann dies in einigen Grenzfällen abweichen (z.B. bei unvollständigen Lösungen mit dem Ur-Simplex).

Wenn Sie über ModelSolveParametersProto.initial_basis eine Ausgangsbasis angeben, wird dieser Wert ignoriert. Sie ist nur für die von SolutionProto.basis zurückgegebene Basis relevant.

SparseBasisStatusVector

Eine dünnbesetzte Darstellung eines Vektors von Basisstatus.

JSON-Darstellung
{
  "ids": [
    string
  ],
  "values": [
    enum (BasisStatusProto)
  ]
}
Felder
ids[]

string (int64 format)

Muss mit unterschiedlichen Elementen sortiert werden (in aufsteigender Reihenfolge).

values[]

enum (BasisStatusProto)

Muss dieselbe Länge wie IDs haben.

BasisStatusProto

Status einer Variable/Einschränkung auf LP-Basis.

Enums
BASIS_STATUS_UNSPECIFIED Guard-Wert, der keinen Status darstellt.
BASIS_STATUS_FREE Die Variable/Einschränkung ist kostenlos (sie hat keine endlichen Grenzen).
BASIS_STATUS_AT_LOWER_BOUND Die Variable/Einschränkung befindet sich an ihrer Untergrenze (diese muss endlich sein).
BASIS_STATUS_AT_UPPER_BOUND Die Variable/Einschränkung befindet sich an ihrer Obergrenze (die endlich sein muss).
BASIS_STATUS_FIXED_VALUE Die Variable bzw. die Einschränkung hat identische endliche Unter- und Obergrenzen.
BASIS_STATUS_BASIC Die Variable/Einschränkung ist einfach.

SolutionStatusProto

Durchführbarkeit einer ursprünglichen oder doppelten Lösung, wie vom Rechner vorgegeben.

Enums
SOLUTION_STATUS_UNSPECIFIED Guard-Wert, der keinen Status darstellt.
SOLUTION_STATUS_UNDETERMINED Der Solver fordert keinen Machbarkeitsstatus an.
SOLUTION_STATUS_FEASIBLE Der Soldaten behauptet, die Lösung sei durchführbar.
SOLUTION_STATUS_INFEASIBLE Der Soldaten behauptet, die Lösung sei nicht durchführbar.

SolutionHintProto

Ein Vorschlag für eine Startlösung für den Matherechner.

MIP-Löser wollen in der Regel nur grundlegende Informationen (variableValues), während LP-Löser sowohl Ausgangs- als auch Doppelinformationen wünschen (dualValues).

Viele MIP-Löser können mit (1) Teillösungen arbeiten, die nicht alle Variablen angeben, oder (2) mit nicht durchführbaren Lösungen. In diesen Fällen lösen Solver in der Regel eine untergeordnete MIP, um den Hinweis zu vervollständigen/korrigieren.

Wie der Hinweis vom Matherechner oder überhaupt verwendet wird, hängt stark vom jeweiligen Solver, vom Problemtyp und vom verwendeten Algorithmus ab. Die zuverlässigste Methode, um sicherzustellen, dass dein Hinweis eine Wirkung hat, besteht darin, die zugrunde liegenden Solver-Logs mit und ohne Hinweis zu lesen.

Simplex-basierte LP-Löser bevorzugen in der Regel eine Anfangsgrundlage für einen Lösungshinweis. Andernfalls müssen sie wechseln, um den Hinweis in eine durchführbare Basislösung umzuwandeln.

JSON-Darstellung
{
  "variableValues": {
    object (SparseDoubleVectorProto)
  },
  "dualValues": {
    object (SparseDoubleVectorProto)
  }
}
Felder
variableValues

object (SparseDoubleVectorProto)

Eine möglicherweise teilweise Zuweisung von Werten zu den ursprünglichen Variablen des Problems. Die Solver-unabhängigen Anforderungen für diese Untermeldung sind: * „variableValues.ids“ sind Elemente von „VariablesProto.ids“. * VariableValues.values müssen alle endlich sein.

dualValues

object (SparseDoubleVectorProto)

Eine (möglicherweise teilweise) Zuweisung von Werten zu den linearen Einschränkungen des Problems.

Anforderungen: * duValues.ids sind Elemente von „LinearConstraintsProto.ids“. * DualValues.values müssen alle endlich sein.

SparseInt32VectorProto

Eine dünnbesetzte Darstellung eines Ganzzahlenvektors.

JSON-Darstellung
{
  "ids": [
    string
  ],
  "values": [
    integer
  ]
}
Felder
ids[]

string (int64 format)

Sollte mit unterschiedlichen Elementen sortiert werden (in aufsteigender Reihenfolge).

values[]

integer

Muss dieselbe Länge wie IDs haben.

SolveResultProto

Der Vertrag darüber, wann die Urzeitlösungen bzw. die Strahlen komplex sind; eine vollständige Beschreibung findest du in „termination_reasons.md“.

Bis ein genauer Vertrag abgeschlossen ist, ist es am sichersten, einfach nur zu prüfen, ob eine Lösung/ein verfügbares Projekt vorhanden ist, anstatt sich auf den Kündigungsgrund zu verlassen.

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

object (TerminationProto)

Der Grund für die Beendigung des Solver.

solutions[]

object (SolutionProto)

Der allgemeine Vertrag für die Reihenfolge der Lösungen, die zukünftige Rechner implementieren sollten, sieht folgendermaßen vor: 1. Die Lösungen mit einer ursprünglichen durchführbaren Lösung, sortiert nach dem besten ursprünglichen Ziel zuerst. 2. Die Lösungen mit einer doppelt durchführbaren Lösung, geordnet nach dem besten Dual Ziel (unbekanntes doppeltes Ziel ist am schlechtesten) 3. Alle verbleibenden Lösungen können in beliebiger Reihenfolge zurückgegeben werden.

primalRays[]

object (PrimalRayProto)

Anweisungen für eine unbegrenzte ursprüngliche Verbesserung oder äquivalente Zertifikate für die doppelte Undurchführbarkeit. In der Regel bereitgestellt für TerminationReasonProtos UNBOUNDED und DUAL_INFEASIBLE

dualRays[]

object (DualRayProto)

Anweisungen für unbegrenzte doppelte Verbesserung oder gleichwertige Zertifikate für die Undurchführbarkeit. Wird in der Regel bereitgestellt, weil der Grund für die Kündigung nicht durchsetzbar ist.

solveStats

object (SolveStatsProto)

Statistiken zum Lösungsprozess, z.B. Laufzeit, Iterationen.

TerminationProto

Alle Informationen darüber, warum ein Aufruf von Solve() beendet wurde.

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

enum (TerminationReasonProto)

Zusätzliche Informationen in limit, wenn der Wert TERMINATION_REASON_FEASIBLE oder TERMINATION_REASON_NO_SOLUTION_FOUND ist, finden Sie unter limit.

limit

enum (LimitProto)

Ist LIMIT_UNSPECIFIED, es sei denn, der Grund ist TERMINATION_REASON_FEASIBLE oder TERMINATION_REASON_NO_SOLUTION_FOUND. Nicht alle Matherechner können immer das Limit bestimmen, das zur Beendigung geführt hat. LIMIT_UNDETERMINED wird verwendet, wenn die Ursache nicht ermittelt werden kann.

detail

string

Zusätzliche, in der Regel Solver-spezifische Informationen zur Kündigung.

problemStatus

object (ProblemStatusProto)

Durchführbarkeitsstatus für ursprüngliche und doppelte Probleme. Seit dem 18. Juli 2023 fehlt diese Meldung möglicherweise. Wenn „problemStatus“ fehlt, finden Sie den Status in „SolveResultProto.solve_stats“.

objectiveBounds

object (ObjectiveBoundsProto)

Grenzen für den optimalen Zielwert. Seit dem 18. Juli 2023 fehlt diese Meldung möglicherweise. Wenn es fehlt, finden Sie „targetBounds.primal_bound“ in „SolveResultProto.solve.stats.best_primal_bound“ und das Feld „objectBounds.dual_bound“ in „SolveResultProto.solve.stats.best_dual_bound“.

TerminationReasonProto

Der Grund, aus dem ein Aufruf von Solve() endet.

Enums
TERMINATION_REASON_UNSPECIFIED
TERMINATION_REASON_OPTIMAL Es wurde eine nachweislich optimale Lösung (bis zu numerischen Toleranzen) gefunden.
TERMINATION_REASON_INFEASIBLE Für das ursprüngliche Problem gibt es keine durchführbaren Lösungen.
TERMINATION_REASON_UNBOUNDED Das Urproblem ist durchführbar und willkürlich gute Lösungen finden sich neben einer Urstrahlen.
TERMINATION_REASON_INFEASIBLE_OR_UNBOUNDED Das ursprüngliche Problem ist entweder unmöglich oder unbegrenzt. Weitere Details zum Problemstatus findest du möglicherweise unter „solveStats.problem_status“. Beachten Sie, dass Gurobis Status "unbegrenzt" hier dargestellt werden kann.
TERMINATION_REASON_IMPRECISE

Das Problem wurde anhand eines der oben genannten Kriterien gelöst (Optimal, Infeasible, Unlimited oder InfeasibleOrUnbounded), aber mindestens eine Toleranz wurde nicht erfüllt. Einige Ur-/Dual-Lösungen/Strahlen sind vorhanden, aber entweder sind sie etwas unmöglich, oder (wenn das Problem fast optimal war), besteht möglicherweise eine Lücke zwischen dem besten Lösungsziel und der besten Zielgrenze.

Benutzer können weiterhin Ur-/Duallösungen/Strahlen und Lösungsstatistiken abfragen, sind jedoch für den Umgang mit der numerischen Ungenauigkeit verantwortlich.

TERMINATION_REASON_FEASIBLE Die Optimierung hat einen bestimmten Grenzwert erreicht und eine durchführbare Grundlösung wird zurückgegeben. Eine detaillierte Beschreibung der Art des erreichten Limits finden Sie unter SolveResultProto.limit_detail.
TERMINATION_REASON_NO_SOLUTION_FOUND Das Optimierungstool hat eine gewisse Grenze erreicht und keine praktikable Lösung gefunden. Eine detaillierte Beschreibung der Art des erreichten Limits finden Sie unter SolveResultProto.limit_detail.
TERMINATION_REASON_NUMERICAL_ERROR Der Algorithmus wurde angehalten, weil ein nicht behebbarer numerischer Fehler aufgetreten ist. Es sind keine Lösungsinformationen verfügbar.
TERMINATION_REASON_OTHER_ERROR Der Algorithmus wurde aufgrund eines Fehlers angehalten, der nicht durch einen der oben definierten Status abgedeckt ist. Es sind keine Lösungsinformationen verfügbar.

LimitProto

Wenn eine Solve()-Anweisung vorzeitig mit TerminationReasonProto FEASIBLE oder NO_SOLUTION_FOUND gestoppt wird, entspricht dies dem spezifischen Limit, das erreicht wurde.

Enums
LIMIT_UNSPECIFIED Wird als Nullwert verwendet, wenn das Konto nicht unter einem Limit gekündigt wurde (z.B. TERMINATION_REASON_OPTIMAL).
LIMIT_UNDETERMINED Der zugrunde liegende Rechner zeigt nicht an, welches Limit erreicht wurde.
LIMIT_ITERATION Ein iterativer Algorithmus wird nach der maximalen Anzahl von Iterationen gestoppt (z.B. Simplex- oder Barrier-Iterationen).
LIMIT_TIME Der Algorithmus wurde nach einer vom Nutzer angegebenen Rechenzeit angehalten.
LIMIT_NODE Ein Branch-and-bound-Algorithmus wurde gestoppt, weil er eine maximale Anzahl von Knoten in dem Baum mit Verzweigungen und gebundenen Knoten untersucht hat.
LIMIT_SOLUTION Der Algorithmus wurde angehalten, weil die erforderliche Anzahl von Lösungen gefunden wurde. Dies wird oft bei MIPs verwendet, damit der Matherechner die erste mögliche Lösung liefert, auf die er stößt.
LIMIT_MEMORY Der Algorithmus wurde angehalten, weil nicht genügend Arbeitsspeicher vorhanden war.
LIMIT_CUTOFF Der Solver wurde mit einem Grenzwert für das Ziel ausgeführt (z.B. wurde „SolveParameters.cutoff_limit“ festgelegt), was darauf hindeutete, dass der Nutzer keine Lösung wünschte, die schlechter als der Grenzwert war, und er kam zu dem Schluss, dass es keine Lösungen gab, die mindestens so gut waren wie der Grenzwert. Normalerweise werden keine weiteren Lösungsinformationen bereitgestellt.
LIMIT_OBJECTIVE Der Algorithmus wurde angehalten, weil er entweder eine Lösung gefunden oder eine Grenze gefunden hat, die besser als ein vom Nutzer festgelegtes Limit ist (siehe SolveParameters.objective_limit und SolveParameters.best_bound_limit).
LIMIT_NORM Der Algorithmus wurde gestoppt, weil die Norm einer Iteration zu groß wurde.
LIMIT_INTERRUPTED Der Algorithmus wurde aufgrund eines Unterbrechungssignals oder einer Nutzerunterbrechungsanfrage angehalten.
LIMIT_SLOW_PROGRESS Der Algorithmus wurde angehalten, weil er keine weiteren Schritte zur Lösung machen konnte.
LIMIT_OTHER

Der Algorithmus wurde aufgrund eines Limits gestoppt, das von keinem der oben genannten Punkte abgedeckt wird. LIMIT_UNDETERMINED wird verwendet, wenn der Grund nicht ermittelt werden kann, und LIMIT_OTHER wird verwendet, wenn der Grund bekannt ist, aber keiner der oben genannten Alternativen entspricht.

Unter TerminationProto.detail finden Sie möglicherweise weitere Informationen zum Limit.

ProblemStatusProto

Machbarkeitsstatus des ursprünglichen Problems und seines Dual-Codes (oder des Dual-Codes einer kontinuierlichen Entspannung), wie vom Löser gefordert. Der Solver muss kein Zertifikat für den Anspruch zurückgeben. So kann er z. B. angeben, dass er zuerst durchführbar ist, ohne dass er eine „ursprüngliche Lösung“ zurückgibt. Dieser kombinierte Status bietet eine umfassende Beschreibung der Aussagen eines Rechners über die Machbarkeit und die Unbegrenztheit des gelösten Problems. Beispiel:

  • Ein realisierbarer Status für ursprüngliche und doppelte Probleme zeigt an, dass die ursprüngliche machbar und begrenzt ist und wahrscheinlich eine optimale Lösung hat (garantiert für Probleme ohne nicht lineare Einschränkungen).
  • ein ursprünglicher und ein zweifach nicht durchführbarer Status weist darauf hin, dass das ursprüngliche Problem unbegrenzt ist (d.h. es hat beliebig gute Lösungen).

Beachten Sie, dass ein doppelter nicht durchführbarer Status allein (d.h. zusammen mit einem unbestimmten ursprünglichen Status) nicht bedeutet, dass das ursprüngliche Problem unbegrenzt ist, da beide Probleme unmöglich sein könnten. Auch wenn ein ursprünglicher und doppelt durchführbarer Status das Vorhandensein einer optimalen Lösung andeuten kann, ist dies keine Garantie dafür, dass der Matherechner tatsächlich diese optimale Lösung gefunden hat.

JSON-Darstellung
{
  "primalStatus": enum (FeasibilityStatusProto),
  "dualStatus": enum (FeasibilityStatusProto),
  "primalOrDualInfeasible": boolean
}
Felder
primalStatus

enum (FeasibilityStatusProto)

Status für das ursprüngliche Problem.

dualStatus

enum (FeasibilityStatusProto)

Status für das doppelte Problem (oder für das Dual einer kontinuierlichen Lockerung).

primalOrDualInfeasible

boolean

Falls wahr, behauptet der Rechner, dass das ursprüngliche oder doppelte Problem nicht durchführbar ist. Er weiß aber nicht, welche oder ob beides nicht möglich ist. Kann nur wahr sein, wenn primal_problem_status = Dual_problem_status = kUnbestimmt. Diese zusätzlichen Informationen werden häufig benötigt, wenn die Vorverarbeitung feststellt, dass es keine optimale Lösung für das Problem gibt (aber nicht feststellen kann, ob dies auf die Undurchführbarkeit, die Unbegrenztheit oder beides zurückzuführen ist).

FeasibilityStatusProto

Status der Machbarkeit des Problems, wie vom Löser gefordert (der Löser muss kein Zertifikat für den Anspruch zurückgeben).

Enums
FEASIBILITY_STATUS_UNSPECIFIED Guard-Wert, der keinen Status darstellt.
FEASIBILITY_STATUS_UNDETERMINED Solver beansprucht keinen Status.
FEASIBILITY_STATUS_FEASIBLE Der Soldaten behauptet, das Problem sei machbar.
FEASIBILITY_STATUS_INFEASIBLE Der Soldaten behauptet, das Problem sei unmöglich.

ObjectiveBoundsProto

Grenzen für den optimalen Zielwert.

JSON-Darstellung
{
  "primalBound": number,
  "dualBound": number
}
Felder
primalBound

number

Solver behauptet, dass der optimale Wert gleich oder besser ist (kleiner für die Minimierung und größer für die Maximierung) als „initialBound“ bis zur ursprünglichen Machbarkeitstoleranz des Matherechners (siehe Warnung unten): * „PrimealBound“ ist trivial (+inf für Minimierung und -inf-Maximierung), wenn der Solver nicht behauptet, eine solche Grenze zu haben. * „PrimealBound“ kann dem optimalen Wert näher sein als das Ziel der besten praktikablen Lösung. Im Besonderen kann primalBound selbst dann nicht trivial sein, wenn keine ursprünglichen durchführbaren Lösungen zurückgegeben werden. Warnung: Die genaue Behauptung besagt, dass es eine Grundlösung gibt, die: * numerisch realisierbar ist (d.h. bis zur Solver-Toleranz umsetzbar ist) und * einen objektiven Wert hat, primalBound. Diese numerisch durchführbare Lösung könnte leicht in Umsetzbarkeit sein, in diesem Fall könnte der Wert „primaryBound“ strikt besser als der optimale Wert sein. Die Übersetzung einer ursprünglichen Machbarkeitstoleranz in eine Toleranz für „PrimarBound“ ist nicht trivial, insbesondere wenn die Machbarkeitstoleranz relativ groß ist (z.B. bei der Lösung mit PDLP).

dualBound

number

Solver behauptet, dass der optimale Wert gleich oder schlechter ist (größer für die Minimierung und kleiner für die Maximierung) als „DualBound“ für die doppelte Machbarkeitstoleranz des Matherechners (siehe Warnung unten): * DualBound ist trivial (-inf für Minimierung und +inf-Maximierung), wenn der Solver nicht behauptet, eine solche Grenze zu haben. Ähnlich wie bei primalBound kann dies bei einigen Rechnern passieren, auch wenn das Optimum zurückgegeben wird. MIP-Löser melden in der Regel eine Grenze, auch wenn diese ungenau ist. * Bei fortlaufenden Problemen kann „dualeBound“ dem optimalen Wert näher kommen als das Ziel der jeweils besten machbaren Lösung. Für MIP ist einer der ersten nicht-trivialen Werte für DualBound oft der optimale Wert für die LP-Lockerung des MIP. * DualBound sollte bis zu den Solver-Toleranzen besser sein (kleiner für die Minimierung und größer für die Maximierung) als primalBound (siehe Warnung unten). Warnung: * Bei anhaltenden Problemen lautet die genaue Behauptung, dass es eine doppelte Lösung gibt, die: * numerisch realisierbar ist (d.h. bis zur Solvertoleranz umsetzbar ist) und * einen Zielwert „DualBound“ hat. Diese numerisch durchführbare Lösung könnte leicht in Umsetzbarkeit sein. In diesem Fall könnte „dualeBound“ schlechter als der optimale Wert und „PrimealBound“ sein. Ähnlich wie beim Primärfall ist die Übersetzung einer doppelten Machbarkeitstoleranz in eine Toleranz für dualBound nicht trivial, insbesondere wenn die Machbarkeitstoleranz relativ groß ist. Einige Matherechner bieten jedoch eine korrigierte Version von dualBound, die numerisch sicherer sein kann. Diese korrigierte Version kann über die spezifische Ausgabe des Matherechners aufgerufen werden (z.B. für PDLP, pdlp_output.convergence_information.Corrected_dual_objective). * Für MIP-Löser kann „DualBound“ mit einer Doppellösung für eine kontinuierliche Entspannung verbunden sein (z.B. LP-Lockerung), aber dies ist oft eine komplexe Folge der Ausführung des Solver und ist in der Regel ungenauer als die von LP-Lösern gemeldeten Grenzen.

SolutionProto

Was in einer Lösung enthalten ist, hängt von der Art des Problems und dem Löser ab. Die derzeit gängigen Muster sind 1. MIP-Lösen geben nur eine Grundlösung zurück. 2. Simplex-LP-Löser geben häufig eine Basis und die mit ihr verknüpften ursprünglichen und doppelten Lösungen zurück. 3. Andere Continuous-Löser geben oft eine Primär- und Doppellösung zurück, die in einer löserabhängigen Form miteinander verbunden sind.

Anforderungen: * Mindestens ein Feld muss festgelegt werden. Lösung darf nicht leer sein.

JSON-Darstellung
{
  "primalSolution": {
    object (PrimalSolutionProto)
  },
  "dualSolution": {
    object (DualSolutionProto)
  },
  "basis": {
    object (BasisProto)
  }
}
Felder
primalSolution

object (PrimalSolutionProto)

dualSolution

object (DualSolutionProto)

basis

object (BasisProto)

PrimalSolutionProto

Eine Lösung für ein Optimierungsproblem.

Beispiel: Stellen Sie sich ein einfaches lineares Programm vor: min c * x s.t. A * x >= b x >= 0. Eine Hauptlösung ist die Zuweisung von Werten zu x. Es ist realisierbar, wenn die oben genannten A * x >= b und x >= 0 erfüllt sind. In der Nachricht „PrmalSolutionProto“ unten ist „variableValues“ „x“ und „objectValue“ „c * x“.

JSON-Darstellung
{
  "variableValues": {
    object (SparseDoubleVectorProto)
  },
  "objectiveValue": number,
  "auxiliaryObjectiveValues": {
    string: number,
    ...
  },
  "feasibilityStatus": enum (SolutionStatusProto)
}
Felder
variableValues

object (SparseDoubleVectorProto)

Anforderungen: * „variableValues.ids“ sind Elemente von „VariablesProto.ids“. * VariableValues.values müssen alle endlich sein.

objectiveValue

number

Der vom zugrunde liegende Solver. berechnete Zielwert. Darf nicht unendlich oder NaN sein.

auxiliaryObjectiveValues

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

Zusätzliche Zielwerte, die vom zugrunde liegenden Rechner berechnet werden. Schlüssel müssen gültige Hilfsziel-IDs sein. Werte dürfen nicht unendlich oder NaN sein.

Ein Objekt, das eine Liste von "key": value-Paaren enthält. Beispiel: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

feasibilityStatus

enum (SolutionStatusProto)

Durchführbarkeitsstatus der Lösung gemäß dem zugrunde liegenden Solver.

DualSolutionProto

Eine Lösung für ein Optimierungsproblem.

Beispiel: betrachten Sie das primäre Dual-Paar-Linear-Programmpaar: (Primär) (Dual) min c * x max b * y s.t. A * x >= b s.t. y * A + r = c x >= 0 y, r >= 0. Die doppelte Lösung ist das Paar (y, r). Es ist machbar, wenn die oben genannten Einschränkungen von (Dual) erfüllt sind.

In der folgenden Nachricht steht y für DualValues, r für reduzierte Kosten und b * y für den Zielwert.

JSON-Darstellung
{
  "dualValues": {
    object (SparseDoubleVectorProto)
  },
  "reducedCosts": {
    object (SparseDoubleVectorProto)
  },
  "feasibilityStatus": enum (SolutionStatusProto),
  "objectiveValue": number
}
Felder
dualValues

object (SparseDoubleVectorProto)

Anforderungen: * duValues.ids sind Elemente von „LinearConstraints.ids“. * DualValues.values müssen alle endlich sein.

reducedCosts

object (SparseDoubleVectorProto)

Anforderungen: * ReduceCosts.ids sind Elemente von VariablesProto.ids. * ReduceCosts.values müssen alle endlich sein.

feasibilityStatus

enum (SolutionStatusProto)

Durchführbarkeitsstatus der Lösung gemäß dem zugrunde liegenden Solver.

objectiveValue

number

PrimalRayProto

Richtung einer unbegrenzten Verbesserung eines Optimierungsproblems entsprechend ein Zertifikat über die Nichtdurchführbarkeit für das Dual des Optimierungsproblems.

Beispiel: Stellen Sie sich ein einfaches lineares Programm vor: min c * x s.t. A * x >= b x >= 0 Ein Urstrahl ist ein x, das Folgendes erfüllt: c * x < 0 A * x >= 0 x >= 0 Beachte, dass bei einer praktikablen Lösung jedes positive Vielfache des Primärstrahls plus dieser Lösung noch realisierbar ist und einen besseren Zielwert liefert. Eine Urstrahlen beweist außerdem, dass das Problem der doppelten Optimierung nicht umsetzbar ist.

In der Nachricht „PrmalRay“ unten hat „variableValues“ den Wert „x“.

JSON-Darstellung
{
  "variableValues": {
    object (SparseDoubleVectorProto)
  }
}
Felder
variableValues

object (SparseDoubleVectorProto)

Anforderungen: * „variableValues.ids“ sind Elemente von „VariablesProto.ids“. * VariableValues.values müssen alle endlich sein.

DualRayProto

eine Richtung der unbegrenzten Verbesserung des Doppelfachs aus Optimierung, Problem; eine Bescheinigung über die ursprüngliche Undurchführbarkeit.

Beispiel: betrachten Sie das primäre Dual-Paar-Linear-Programmpaar: (Primär) (Dual) min c * x max b * y s.t. A * x >= b s.t. y * A + r = c x >= 0 y, r >= 0. Der doppelte Strahl ist das Paar (y, r), das folgende Kriterien erfüllt: b * y > 0 y * A + r = 0 y, r >= 0 Beachten Sie, dass durch das Hinzufügen eines positiven Vielfachen von (y, r) zur Dual-Durchführbarkeitslösung die doppelte Durchführbarkeit erhalten bleibt und das Ziel verbessert wird (beweist, dass das Dual-Prinzip unbegrenzt ist). Die Dualstrahlung beweist außerdem, dass das ursprüngliche Problem unmöglich ist.

In der unten stehenden Nachricht „DualRay“ steht y für „DualValues“ und „r“ für reduzierte Kosten.

JSON-Darstellung
{
  "dualValues": {
    object (SparseDoubleVectorProto)
  },
  "reducedCosts": {
    object (SparseDoubleVectorProto)
  }
}
Felder
dualValues

object (SparseDoubleVectorProto)

Anforderungen: * duValues.ids sind Elemente von „LinearConstraints.ids“. * DualValues.values müssen alle endlich sein.

reducedCosts

object (SparseDoubleVectorProto)

Anforderungen: * ReduceCosts.ids sind Elemente von VariablesProto.ids. * ReduceCosts.values müssen alle endlich sein.

SolveStatsProto

JSON-Darstellung
{
  "solveTime": string,
  "problemStatus": {
    object (ProblemStatusProto)
  },
  "simplexIterations": string,
  "barrierIterations": string,
  "firstOrderIterations": string,
  "nodeCount": string
}
Felder
solveTime

string (Duration format)

Verstrichene Wanduhrzeit, gemessen von math_opt, ungefähr die Zeit in Solver::Solve(). Hinweis: Dies beinhaltet keine Arbeit am Modellerstellung.

Die Dauer in Sekunden mit bis zu neun Nachkommastellen und am Ende mit "s". Beispiel: "3.5s".

problemStatus

object (ProblemStatusProto)

Durchführbarkeitsstatus für ursprüngliche und doppelte Probleme.

simplexIterations

string (int64 format)

barrierIterations

string (int64 format)

firstOrderIterations

string (int64 format)

nodeCount

string (int64 format)