Package google.research.optimization.v1.mathopt

Indice

BasisProto

Caratterizzazione combinatoria di una soluzione di un programma lineare.

Il metodo Simplex per risolvere programmi lineari restituisce sempre una "soluzione di base fattibile" che può essere descritta combinatorialmente da una Base. Una base assegna un valore BaseStatusProto a ogni variabile e vincolo lineare.

Ad esempio, considera un LP in forma standard: min c * x s.t. A * x = b x >= 0 che ha più variabili dei vincoli e con ranking A per riga intera.

Sia n il numero di variabili e m il numero di vincoli lineari. Una base valida per questo problema può essere creata come segue: * Tutti i vincoli avranno stato Base FISSO. * Scegli m variabili in modo che le colonne A siano linearmente indipendenti e assegni lo stato BASE. * Assegna lo stato AT_LOWER per le restanti variabili n - m.

La soluzione di base è l'unica soluzione di A * x = b con tutte le variabili con stato AT_LOWER fissi sui limiti inferiori (tutte zero). La soluzione risultante è chiamata soluzione fattibile di base se soddisfa anche x >= 0.

Campi
constraint_status

SparseBasisStatusVector

Stato della base di vincolo.

Requisiti: * constraints_status.ids è uguale a LinearConstraints.ids.

variable_status

SparseBasisStatusVector

Stato di base variabile.

Requisiti: * constraints_status.ids è uguale a variablesProto.ids.

basic_dual_feasibility

SolutionStatusProto

Si tratta di una funzionalità avanzata utilizzata da Mathopt per caratterizzare la fattibilità di soluzioni LP non ottimali (le soluzioni ottimali avranno sempre lo stato SOLUTION_STATUS_FEASIBLE).

Per gli LP su un solo lato deve corrispondere allo stato di fattibilità della soluzione doppia associata. Per gli LP a due lati, il processo potrebbe essere diverso in alcuni casi limite (ad es. in caso di soluzioni incomplete con un Simplex primordiale).

Se fornisci una base iniziale tramite ModelSolveParametersProto.initial_basis, questo valore viene ignorato. È pertinente solo per la base restituita da SolutionProto.basis.

BasisStatusProto

Stato di una variabile o di un vincolo in base alla pagina di destinazione.

Enum
BASIS_STATUS_UNSPECIFIED Valore di Guard che non rappresenta alcuno stato.
BASIS_STATUS_FREE La variabile/il vincolo è libero (non ha limiti finiti).
BASIS_STATUS_AT_LOWER_BOUND La variabile/il vincolo si trova al limite inferiore (che deve essere finito).
BASIS_STATUS_AT_UPPER_BOUND La variabile/il vincolo si trova al limite superiore (che deve essere finito).
BASIS_STATUS_FIXED_VALUE La variabile/il vincolo ha limiti inferiori e superiori finiti identici.
BASIS_STATUS_BASIC La variabile/il vincolo è di base.

DualRayProto

Direzione di miglioramento illimitato al duplice di un problema di ottimizzazione; equivalente a un certificato di infattibilità primordiale.

Ad esempio, considera la coppia di programmi lineari a due coppie principali: (Primale) (Doppia) min c * x max b * y s.t. A * x >= b s.t. y * A + r = c x >= 0 y, r >= 0. Il raggio doppio è la coppia (y, r) soddisfatta: Il doppio raggio dimostra inoltre che il problema primordiale è impossibile.

Nel messaggio DualRay riportato di seguito, y è doppio_valori e r è ridotto_costi.

Campi
dual_values

SparseDoubleVectorProto

Requisiti: * dual_values.id sono elementi di LinearConstraints.ids. * dual_values.values devono essere tutti limitati.

reduced_costs

SparseDoubleVectorProto

Requisiti: * reduce_costs.id sono elementi di variablesProto.ids. * I valori_costi_ridotti devono essere tutti limitati.

DualSolutionProto

Una soluzione al duplice di un problema di ottimizzazione.

Ad esempio, considera la coppia di programmi lineari a due coppie principali: (Primale) (Doppia) min c * x max b * y s.t. A * x >= b s.t. y * A + r = c x >= 0 y, r >= 0. La duplice soluzione è la coppia (y, r). È fattibile se soddisfa i vincoli descritti sopra (Dual).

Nel messaggio seguente, y è doppio_valore, r è ridotto_costi e b * y è il valore obiettivo.

Campi
dual_values

SparseDoubleVectorProto

Requisiti: * dual_values.id sono elementi di LinearConstraints.ids. * dual_values.values devono essere tutti limitati.

reduced_costs

SparseDoubleVectorProto

Requisiti: * reduce_costs.id sono elementi di variablesProto.ids. * I valori_costi_ridotti devono essere tutti limitati.

feasibility_status

SolutionStatusProto

Stato di fattibilità della soluzione in base al risolutore sottostante.

objective_value

double

EmphasisProto

Livello di sforzo applicato a un'attività facoltativa durante la risoluzione (per l'utilizzo, consulta SolveParametersProto).

L'enfasi viene utilizzata per configurare una funzionalità del risolutore come segue: * Se un risolutore non supporta la funzionalità, sarà sempre valida solo UNSPECIFIED, mentre qualsiasi altra impostazione genera in genere un errore relativo a un argomento non valido (alcuni risolutori possono accettare anche OFF). * Se il risolutore supporta la funzionalità: - Se l'opzione è impostata su UNSPECIFIED, viene utilizzato il valore predefinito sottostante. - Se non è possibile disattivare la funzione, l'opzione OFF restituirà un errore. - Se la funzionalità è abilitata per impostazione predefinita, il valore predefinito del risolutore è in genere mappato su MEDIUM. - Se la funzione è supportata, i valori BASSO, MEDIO, ALTO e MOLTO ALTO non restituiranno mai un errore e verranno associati alla loro corrispondenza migliore.

Enum
EMPHASIS_UNSPECIFIED
EMPHASIS_OFF
EMPHASIS_LOW
EMPHASIS_MEDIUM
EMPHASIS_HIGH
EMPHASIS_VERY_HIGH

FeasibilityStatusProto

Stato di fattibilità del problema come dichiarato dal risolutore (il risolutore non è tenuto a restituire un certificato per il reclamo).

Enum
FEASIBILITY_STATUS_UNSPECIFIED Valore di Guard che non rappresenta alcuno stato.
FEASIBILITY_STATUS_UNDETERMINED Il risolutore non rivendica uno stato.
FEASIBILITY_STATUS_FEASIBLE Il risolutore afferma che il problema è fattibile.
FEASIBILITY_STATUS_INFEASIBLE Il risolutore afferma che il problema non è fattibile.

IndicatorConstraintProto

Dati per la rappresentazione di un singolo vincolo di indicatore nel formato: variabile(indicator_id) = (activate_on_zero ? 0 : 1) → limite_inferiore <= espressione <= limite_superiore.

Se una variabile coinvolta in questo vincolo (l'indicatore o visualizzato in expression) viene eliminata, viene trattata come se fosse impostata su zero. In particolare, l'eliminazione della variabile indicatore significa che il vincolo dell'indicatore è vuoto se activate_on_zero è falso e che equivale a un vincolo lineare se activate_on_zero è vero.

Campi
activate_on_zero

bool

Se il valore è true, se la variabile indicatore assume il valore 0, è necessario mantenere il vincolo implicito. Altrimenti, se la variabile dell'indicatore assume il valore 1, il vincolo implicito deve restare valido.

expression

SparseDoubleVectorProto

Deve essere un'espressione lineare valida rispetto al modello contenitore: * Tutte le condizioni indicate in SparseDoubleVectorProto, * Tutti gli elementi di expression.values devono essere limitati, * expression.ids sono un sottoinsieme di VariablesProto.ids.

lower_bound

double

Deve avere un valore in [-inf, inf); non può essere NaN.

upper_bound

double

Deve avere un valore in (-inf, inf]; non può essere NaN.

name

string

I messaggi principali potrebbero avere requisiti di univocità in questo campo; ad esempio, vedi ModelProto.indicator_constraints e IndicatorConstraintUpdatesProto.new_constraints.

indicator_id

int64

Un ID corrispondente a una variabile binaria o non impostato. Se non viene configurato, il vincolo dell'indicatore viene ignorato. Se impostato, è necessario che: * variablesProto.integers[indicator_id] = true, * variablesProto.lower_bounds[indicator_id] >= 0, * variablesProto.upper_bounds[indicator_id] <= 1. Queste condizioni non vengono convalidate da Mathopt, ma se non vengono soddisfatte, il risolutore restituisce un errore al momento della risoluzione.

LPAlgorithmProto

Seleziona un algoritmo per risolvere programmi lineari.

Enum
LP_ALGORITHM_UNSPECIFIED
LP_ALGORITHM_PRIMAL_SIMPLEX Il metodo simplex (principale). Tipicamente può fornire soluzioni primali e doppi, raggi primoli/doppi su problemi primitivi/doppi illimitati e una base.
LP_ALGORITHM_DUAL_SIMPLEX Il metodo dual simplex. Tipicamente può fornire soluzioni primali e doppi, raggi primoli/doppi su problemi primitivi/doppi illimitati e una base.
LP_ALGORITHM_BARRIER Il metodo della barriera, comunemente chiamato anche metodo interno del punto (IPM). In genere può fornire soluzioni sia primali che doppie. Alcune implementazioni possono produrre raggi anche su problemi illimitati/impossibili. Non viene fornita una base a meno che il risolutore sottostante non faccia un "crossover" e finisca con un Simplex.
LP_ALGORITHM_FIRST_ORDER Un algoritmo basato su un metodo del primo ordine. che producono in genere sia soluzioni primali che doppie e potenzialmente anche certificati di irrilevanza primale e/o doppia. I metodi del primo ordine in genere forniscono soluzioni con minore accuratezza, quindi gli utenti dovrebbero fare attenzione a impostare i parametri di qualità della soluzione (ad es. le tolleranze) e a convalidare le soluzioni.

LimitProto

Quando un metodo Solve() si arresta in anticipo con TerminaReasonProto FEASIBLE o NO_SOLUTION_FOUND, il limite specifico che è stato raggiunto.

Enum
LIMIT_UNSPECIFIED Utilizzato come valore null quando abbiamo terminato da un limite diverso da un limite (ad es. TERMINATION_REASON_OPTIMAL).
LIMIT_UNDETERMINED Il risolutore sottostante non indica quale limite è stato raggiunto.
LIMIT_ITERATION Un algoritmo iterativo si è interrotto dopo aver eseguito il numero massimo di iterazioni (ad es. iterazioni simplex o di barriera).
LIMIT_TIME L'algoritmo si è arrestato dopo un tempo di calcolo specificato dall'utente.
LIMIT_NODE Un algoritmo ramo e associato è stato interrotto perché ha esplorato un numero massimo di nodi nell'albero ramo e associato.
LIMIT_SOLUTION L'algoritmo si è interrotto perché ha trovato il numero di soluzioni richiesto. Questo viene spesso utilizzato nelle MIP per fare in modo che il risolutore restituisca la prima soluzione possibile che incontra.
LIMIT_MEMORY L'algoritmo si è interrotto perché ha esaurito la memoria.
LIMIT_CUTOFF Il risolutore è stato eseguito con un limite (ad es. era stato impostato SolveParameters.cutoff_limit) per l'obiettivo, il che indicava che l'utente non voleva alcuna soluzione peggiore della soglia limite e il risolutore ha concluso che non c'erano soluzioni almeno pari al limite. In genere non vengono fornite ulteriori informazioni sulla soluzione.
LIMIT_OBJECTIVE L'algoritmo si è arrestato perché ha trovato una soluzione o un limite migliore di un limite impostato dall'utente (vedi SolveParameters.objective_limit e SolveParameters.best_bound_limit).
LIMIT_NORM L'algoritmo si è interrotto perché la norma di un'iterazione è diventata troppo grande.
LIMIT_INTERRUPTED L'algoritmo è stato interrotto a causa di un indicatore di interruzione o di una richiesta di interruzione dell'utente.
LIMIT_SLOW_PROGRESS L'algoritmo si è interrotto perché non è stato possibile continuare a fare progressi verso la soluzione.
LIMIT_OTHER

L'algoritmo è stato interrotto a causa di un limite non coperto da uno dei suddetti limiti. Tieni presente che LIMIT_UNDETERMINED viene utilizzato quando non è possibile determinare il motivo, mentre LIMIT_OTHER viene utilizzato quando il motivo è noto, ma non rientra in nessuna delle alternative precedenti.

TerminazioneProto.detail potrebbe contenere informazioni aggiuntive sul limite.

LinearConstraintsProto

Come utilizzato di seguito, definiamo "#encoder lineare" = size(LinearConstraintsProto.ids).

Campi
ids[]

int64

Deve essere un numero non negativo ed essere necessariamente in aumento. Impossibile utilizzare il valore max(int64).

lower_bounds[]

double

Deve avere una lunghezza uguale ai vincoli #lineari, valori in [-inf, inf).

upper_bounds[]

double

Deve avere una lunghezza uguale ai vincoli #lineari, valori in (-inf, inf].

names[]

string

Se non impostato, si presume che siano tutte stringhe vuote. In caso contrario, la lunghezza deve essere uguale a quella dei vincoli #linear.

Tutti i nomi non vuoti devono essere distinti.

LinearExpressionProto

Una rappresentazione sparsa di un'espressione lineare (una somma ponderata di variabili più un offset costante).

Campi
ids[]

int64

ID di variabili. Devono essere ordinati (in ordine crescente) con tutti gli elementi distinti.

coefficients[]

double

La lunghezza deve essere uguale agli ID. I valori devono essere limitati non possono essere NaN.

offset

double

Deve essere limitato e non può essere NaN.

ModelProto

Un problema di ottimizzazione. MathOpt supporta: - Variabili di decisione continue e numeri interi con limiti finiti facoltativi. - Obiettivi lineari e quadratici (singoli o multipli), minimizzati o ingranditi. - Una serie di tipi di vincoli, inclusi: * Vincoli lineari * Vincoli quadratici * Vincoli del cono del secondo ordine * Vincoli logici > Vincoli SOS1 e SOS2 > Vincoli indicatore

Per impostazione predefinita, i vincoli sono rappresentati nelle mappe "id-to-data". Tuttavia, rappresentiamo i vincoli lineari in un formato "struct-of-arrays" più efficiente.

Campi
name

string

variables

VariablesProto

objective

ObjectiveProto

L'obiettivo principale nel modello.

auxiliary_objectives

map<int64, ObjectiveProto>

Obiettivi ausiliari da utilizzare nei modelli con più obiettivi.

Gli ID delle chiavi della mappa devono essere specificati nel formato [0, max(int64)). Ogni priorità e ogni nome non vuoto devono essere univoci e distinti dal objective principale.

linear_constraints

LinearConstraintsProto

linear_constraint_matrix

SparseDoubleMatrixProto

I coefficienti variabili per i vincoli lineari.

Se una variabile coinvolta in questo vincolo viene eliminata, viene trattata come se fosse impostata su zero.

Requisiti: * linear_constraint_matrix.row_ids sono elementi di linear_constraints.ids. * linear_constraint_matrix.column_ids sono elementi di variables.id. * Le voci della matrice non specificate sono zero. * I valori matrici_constraint_lineare devono essere tutti finiti.

quadratic_constraints

map<int64, QuadraticConstraintProto>

Vincoli quadratici nel modello.

second_order_cone_constraints

map<int64, SecondOrderConeConstraintProto>

Vincoli coni del secondo ordine nel modello.

sos1_constraints

map<int64, SosConstraintProto>

I vincoli SOS1 nel modello prevedono che al massimo un expression può essere diverso da zero. Le voci weights facoltative sono un dettaglio di implementazione utilizzato dal risolutore per (si spera) convergere più rapidamente. Più nel dettaglio, i risolutori potrebbero (o meno) utilizzare questi pesi per selezionare decisioni con diramazione che producono nodi figlio "bilanciati".

sos2_constraints

map<int64, SosConstraintProto>

I vincoli SOS2 nel modello prevedono che al massimo due voci di expression possono essere diverse da zero e devono essere adiacenti nel loro ordine. Se weights non viene fornito, questo sarà il suo ordine lineare nell'elenco expressions; se vengono presentati weights, l'ordinamento viene preso in relazione a questi valori in ordine crescente.

indicator_constraints

map<int64, IndicatorConstraintProto>

Vincoli di indicatori nel modello che lo applicano, se una "variabile indicatore" binaria è impostata su uno, deve essere applicato un "vincolo implicito".

ModelSolveParametersProto

Campi
variable_values_filter

SparseVectorFilterProto

Filtro applicato a tutti i container sparsi restituiti basati su variabili in PrimalSolutionProto e PrimalRayProto (PrimalSolutionProto.variable_values, PrimalRayProto.variable_values).

Requisiti: * filtrati_id sono elementi di variablesProto.ids.

dual_values_filter

SparseVectorFilterProto

Filtro applicato a tutti i container sparsi restituiti associati a vincoli lineari in DualSolutionProto e DualRay (DualSolutionProto.dual_values, DualRay.dual_values).

Requisiti: * filtrati_id sono elementi di LinearConstraints.ids.

reduced_costs_filter

SparseVectorFilterProto

Filtro applicato a tutti i container sparse restituiti associati a variabili in DualSolutionProto e DualRay (DualSolutionProto.reduced_costs, DualRay.reduced_costs).

Requisiti: * filtrati_id sono elementi di variablesProto.ids.

initial_basis

BasisProto

Base iniziale facoltativa per i risolutori LP Simplex con avvio tiepido. Se impostato, dovrebbe essere valido in base al criterio ValidateBasis in validators/solution_validator.h per l'attuale ModelSummary.

solution_hints[]

SolutionHintProto

Suggerimenti facoltativi sulla soluzione. Se il risolutore sottostante accetta solo un singolo suggerimento, viene utilizzato il primo.

branching_priorities

SparseInt32VectorProto

Priorità di diramazione facoltative. Le variabili con valori più elevati verranno diramate all'inizio. Le variabili per le quali non sono impostate priorità ricevono la priorità predefinita del risolutore (di solito pari a zero).

Requisiti: * salting_priorities.values deve essere limitato. * Raming_priorities.id deve essere elementi di variablesProto.ids.

ObjectiveBoundsProto

Limita il valore obiettivo ottimale.

Campi
primal_bound

double

Il risolutore afferma che il valore ottimale è uguale o migliore (minore per minimizzazione e maggiore per massimizzazione) rispetto a primal_bound fino alla tolleranza di fattibilità primale del risolutore (vedi l'avviso sotto): * primal_bound è banale (+inf per minimizzazione e -inf maximization) quando il risolutore non dichiara di avere tale limite. * primal_bound può essere più vicino al valore ottimale rispetto all'obiettivo della migliore soluzione primal fattibile. In particolare, primal_bound potrebbe non essere banale anche quando non vengono restituite soluzioni primal fattibili. Avviso: l'affermazione esatta è che esiste una soluzione primordiale che: * è numericamente fattibile (ovvero fattibile fino alla tolleranza del risolutore) e che * ha un valore obiettivo primal_bound. Questa soluzione numericamente fattibile potrebbe essere leggermente impossibile, nel qual caso primal_bound potrebbe essere strettamente migliore del valore ottimale. Tradurre una tolleranza di fattibilità primale in una tolleranza su primal_bound non è banale, soprattutto quando la tolleranza di fattibilità è relativamente grande (ad es. quando si risolve con PDLP).

dual_bound

double

Il risolutore afferma che il valore ottimale è uguale o peggiore (maggiore per minimizzazione e minore per massimizzazione) rispetto alla doppia tolleranza di fattibilità del risolutore (vedi l'avviso sotto): * dual_bound è banale (-inf per minimizzazione e +inf maximization) quando il risolutore non dichiara di avere tale limite. Analogamente a primal_bound, questo può accadere per alcuni risolutori anche se restituisci ottimale. I risolutori MIP in genere segnalano un limite anche se è impreciso. * per problemi continui, il valore dual_bound può essere più vicino al valore ottimale rispetto all'obiettivo della migliore soluzione dual_able. Per MIP, uno dei primi valori non banali di dual_bound è spesso il valore ottimale del rilassamento LP della MIP. * dual_bound dovrebbe essere migliore (più piccolo per la minimizzazione e maggiore per la massimizzazione) rispetto a primal_bound fino alle tolleranze dei risolutori (vedi l'avviso di seguito). Attenzione: * per problemi continui, l'affermazione precisa è che esiste una duplice soluzione che: * è numericamente fattibile (ovvero fattibile fino alla tolleranza del risolutore) e * abbia un valore obiettivo dual_bound. Questa soluzione numericamente fattibile potrebbe essere leggermente impossibile, nel qual caso dual_bound potrebbe essere strettamente inferiore al valore ottimale e primal_bound. Come nel caso primordiale, tradurre una tolleranza di fattibilità doppia in una tolleranza su dual_bound non è banale, soprattutto quando la tolleranza di fattibilità è relativamente grande. Tuttavia, alcuni risolutori forniscono una versione corretta del dual_bound che può essere numericamente più sicura. È possibile accedere alla versione corretta tramite l'output specifico del risolutore (ad esempio, per PDLP, pdlp_output.convergence_information. corrected_dual_objective). * Per i risolutori MIP, il valore dual_bound può essere associato a una doppia soluzione per un certo rilassamento continuo (ad es. il rilassamento LP), ma è spesso una conseguenza complessa dell'esecuzione dei risolutori ed è in genere più impreciso dei limiti riportati dai risolutori LP.

ObjectiveProto

Campi
maximize

bool

falso è minimo, vero è massimizza

offset

double

Deve essere limitato e non NaN.

linear_coefficients

SparseDoubleVectorProto

Termini di ObjectiveProto lineari nelle variabili decisionali.

Requisiti: * linear_coefficients.ids sono elementi di variablesProto.ids. * Il valore di ValueTrack non specificato corrisponde a zero. * I valori linear_coefficients.values devono essere tutti limitati. * Il valore di linear_coefficients.values può essere zero, ma spreca spazio.

quadratic_coefficients

SparseDoubleMatrixProto

Termini oggettivi che sono quadratici nelle variabili di decisione.

Requisiti in aggiunta a quelli dei messaggi SparseDoubleMatrixProto: * Ogni elemento di quadratic_coefficients.row_ids e ogni elemento di quadratic_coefficients.column_ids deve essere un elemento di variablesProto.ids. * La matrice deve essere triangolare superiore: per ogni i, quadratic_coefficients.row_ids[i] <= quadratic_coefficients.column_ids[i].

Note: * I termini non memorizzati in modo esplicito hanno coefficiente zero. * Gli elementi di quadratic_coefficients.coefficients possono essere pari a zero, ma questo spreca solo spazio.

name

string

I messaggi principali possono avere requisiti di univocità in questo campo; ad esempio, consulta ModelProto.objectives e AuxiliaryObjectivesUpdatesProto.new_objectives.

priority

int64

Per i problemi che hanno più obiettivi, la priorità di questo obiettivo rispetto agli altri (minore è più importante). Questo valore non deve essere negativo. Inoltre, ogni priorità obiettivo nel modello deve essere distinta al momento della risoluzione. Questa condizione non è convalidata a livello di proto, quindi i modelli potrebbero avere temporaneamente degli obiettivi con la stessa priorità.

PrimalRayProto

Una direzione di miglioramento illimitato a un problema di ottimizzazione; equivalente a un certificato di non fattibilità per il duplice del problema di ottimizzazione.

Ad esempio, consideriamo un semplice programma lineare: min c * x s.t. A * x >= b x >= 0 Un raggio primole è una x che soddisfa: c * x < 0 A * x >= 0 x >= 0 Un raggio primordiale dimostra inoltre che il problema della duplice ottimizzazione è impossibile.

Nel messaggio PrimalRay riportato di seguito, variabile_values è x.

Campi
variable_values

SparseDoubleVectorProto

Requisiti: * variabili_values.ids sono elementi di variablesProto.ids. * variabili_values.values devono essere tutti limitati.

PrimalSolutionProto

Una soluzione a un problema di ottimizzazione.

Ad esempio, considera un programma lineare semplice: min c * x s.t. A * x >= b x >= 0. Una soluzione principale è l'assegnazione di valori a x. È fattibile se soddisfa A * x >= b e x >= 0 di cui sopra. Nel messaggio PrimalSolutionProto riportato di seguito, variabile_values è x e valore_obiettivo è c * x.

Campi
variable_values

SparseDoubleVectorProto

Requisiti: * variabili_values.ids sono elementi di variablesProto.ids. * variabili_values.values devono essere tutti limitati.

objective_value

double

Valore obiettivo calcolato dal risolutore sottostante. Non può essere infinito o NaN.

auxiliary_objective_values

map<int64, double>

Valori degli obiettivi ausiliari calcolati dal risolutore sottostante. Le chiavi devono essere ID obiettivo ausiliari validi. I valori non possono essere infiniti o NaN.

feasibility_status

SolutionStatusProto

Stato di fattibilità della soluzione in base al risolutore sottostante.

ProblemStatusProto

Stato di fattibilità del problema primordiale e del suo doppio (o doppio di un rilassamento continuo) come dichiarato dal risolutore. Il risolutore non è tenuto a restituire un certificato per la dichiarazione (ad es. il risolutore può rivendicare la fattibilità primale senza restituire una soluzione primale fattibile). Questo stato combinato fornisce una descrizione completa delle affermazioni di un risolutore sulla fattibilità e l'illimitazione del problema risolto. Ad esempio,

  • uno stato fattibile per i problemi primitivi e doppi indica che il primo è fattibile e limitato e probabilmente ha una soluzione ottimale (garantita per problemi senza vincoli non lineari).
  • uno stato primordiale fattibile e uno stato doppio non fattibile indicano che il problema primordiale è illimitato (ossia ha soluzioni arbitrariamente buone).

Tieni presente che un doppio stato impossibile di per sé (ad esempio accompagnato da uno stato primordiale indeterminato) non implica che il problema primordiale sia illimitato perché entrambi i problemi potrebbero essere irrealizzabili. Inoltre, anche se uno stato primordiale e doppio fattibile può suggerire l'esistenza di una soluzione ottimale, non garantisce che il risolutore abbia effettivamente trovato questa soluzione ottimale.

Campi
primal_status

FeasibilityStatusProto

Stato del problema primordiale.

dual_status

FeasibilityStatusProto

Stato del duplice problema (o del duplice di un rilassamento continuo).

primal_or_dual_infeasible

bool

Se il problema è vero, il risolutore sostiene che il problema primordiale o il doppio non è fattibile, ma non sa quale (o se entrambi sono irrealizzabili). Può essere true solo se primal_problem_status = dual_problem_status = kUndeterminato. Queste informazioni aggiuntive sono spesso necessarie quando la pre-elaborazione determina che non esiste una soluzione ottimale al problema (ma non è in grado di determinare se il problema è dovuto a infattibilità, assenza di limitazioni o a entrambi).

QuadraticConstraintProto

Un singolo vincolo quadratico nella forma: lb <= sum{linear_terms} + sum{quadratic_terms} <= ub.

Se una variabile coinvolta in questo vincolo viene eliminata, viene trattata come se fosse impostata su zero.

Campi
linear_terms

SparseDoubleVectorProto

Termini lineari nelle variabili decisionali.

Oltre ai requisiti sui messaggi SparseDoubleVectorProto, richiediamo che: * linear_terms.ids sono elementi di variablesProto.ids. * Linear_terms.values deve essere tutti finito e non NAN.

Note: * Gli ID variabili omessi hanno un coefficiente corrispondente pari a zero. * linear_terms.values può essere zero, ma spreca spazio.

quadratic_terms

SparseDoubleMatrixProto

Termini quadratici nelle variabili di decisione.

Oltre ai requisiti sui messaggi SparseDoubleMatrixProto, richiediamo i seguenti requisiti: * Ogni elemento di quadratic_terms.row_ids e ogni elemento di quadratic_terms.column_id deve essere un elemento di variablesProto.ids. * La matrice deve essere triangolare superiore: per ogni i, quadratic_terms.row_ids[i] <= quadratic_terms.column_ids[i].

Note: * I termini non memorizzati in modo esplicito hanno coefficiente zero. * Gli elementi di quadratic_terms.coefficients possono essere pari a zero, ma questo comporta solo uno spreco di spazio.

lower_bound

double

Deve avere un valore in [-inf, inf) ed essere minore o uguale a upper_bound.

upper_bound

double

Deve avere un valore in (-inf, inf] ed essere maggiore o uguale a lower_bound.

name

string

I messaggi principali potrebbero avere requisiti di univocità in questo campo; ad esempio, consulta ModelProto.quadratic_constraints e QuadraticConstraintUpdatesProto.new_constraints.

SecondOrderConeConstraintProto

Un singolo vincolo cono del secondo ordine nella forma:

||arguments_to_norm||_2 <= upper_bound,

dove upper_bound e ogni elemento di arguments_to_norm sono espressioni lineari.

Se una variabile coinvolta in questo vincolo viene eliminata, viene trattata come se fosse impostata su zero.

Campi
upper_bound

LinearExpressionProto

arguments_to_norm[]

LinearExpressionProto

name

string

I messaggi principali potrebbero avere requisiti di univocità in questo campo; ad esempio, vedi ModelProto.second_order_cone_constraints e SecondOrderConeConstraintUpdatesProto.new_constraints.

SolutionHintProto

Una soluzione di partenza suggerita per il risolutore.

I risolutori MIP di solito vogliono solo informazioni primali (variable_values), mentre i risolutori LP vogliono informazioni sia primali che doppie (dual_values).

Molti risolutori MIP possono lavorare con: (1) soluzioni parziali che non specificano tutte le variabili o (2) soluzioni non attuabili. In questi casi, i risolutori di solito risolvono un MIP secondario per completare/correggere il suggerimento.

Il modo in cui il suggerimento viene utilizzato dal risolutore dipende molto dal risolutore, dal tipo di problema e dall'algoritmo utilizzato. Il modo più affidabile per assicurarsi che il suggerimento abbia effetto è leggere i log dei risolutori sottostanti con e senza il suggerimento.

I risolutori LP Simplex di solito preferiscono una base iniziale a un suggerimento di soluzione (in caso contrario, devono eseguire il crossover per convertire il suggerimento in una soluzione di base fattibile).

Campi
variable_values

SparseDoubleVectorProto

Un'assegnazione potenzialmente parziale di valori alle variabili primali del problema. I requisiti indipendenti dal risolutore per questo messaggio secondario sono: * variabili_values.id sono elementi di variablesProto.ids. * variabili_values.values devono essere tutti limitati.

dual_values

SparseDoubleVectorProto

Un'assegnazione (potenzialmente parziale) di valori ai vincoli lineari del problema.

Requisiti: * dual_values.id sono elementi di LinearConstraintsProto.ids. * dual_values.values devono essere tutti limitati.

SolutionProto

Gli elementi inclusi in una soluzione dipendono dal tipo di problema e dal risolutore. Gli attuali pattern comuni sono 1. I risolutori MIP restituiscono solo una soluzione primitiva. 2. I risolutori LP Simplex spesso restituiscono una base e le soluzioni primali e doppie associate a questa base. 3. Altri risolutori continui spesso restituiscono una soluzione doppia e primale connessa in modo dipendente dal risolutore.

Requisiti: * deve essere impostato almeno un campo. La soluzione non può essere vuota.

Campi
primal_solution

PrimalSolutionProto

dual_solution

DualSolutionProto

basis

BasisProto

SolutionStatusProto

Fattibilità di una soluzione originale o doppia secondo il risolutore.

Enum
SOLUTION_STATUS_UNSPECIFIED Valore di Guard che non rappresenta alcuno stato.
SOLUTION_STATUS_UNDETERMINED Il risolutore non dichiara lo stato di fattibilità.
SOLUTION_STATUS_FEASIBLE Il risolutore afferma che la soluzione è fattibile.
SOLUTION_STATUS_INFEASIBLE Il risolutore afferma che la soluzione non è fattibile.

SolveParametersProto

Parametri per controllare una singola risoluzione.

Contiene entrambi i parametri comuni a tutti i risolutori, ad es. time_limit, e i parametri di un risolutore specifico, ad esempio gscip. Se un valore viene impostato sia nel campo comune sia nel campo specifico del risolutore, viene utilizzata l'impostazione specifica del risolutore.

I parametri comuni facoltativi e non impostati o un'enumerazione con valore non specificato indicano che viene utilizzato il valore predefinito del risolutore.

I parametri specifici del risolutore per risolutori diversi da quello in uso vengono ignorati.

I parametri che dipendono dal modello (ad es. la priorità di diramazione è impostata per ogni variabile) vengono passati in ModelSolveParametersProto.

Campi
time_limit

Duration

Tempo massimo che un risolutore deve dedicare al problema (oppure infinito, se non impostato).

Questo valore non è un limite fisso. Il tempo di risoluzione potrebbe superare leggermente questo valore. Questo parametro viene sempre passato al risolutore sottostante, pertanto non viene utilizzato il valore predefinito del risolutore.

enable_output

bool

Consente di stampare le tracce di implementazione del risolutore. La posizione di queste tracce dipende dal risolutore. Per SCIP e Gurobi si tratta degli stream di output standard. Per Glop e CP-SAT, verrà visualizzato LOG(INFO).

Tieni presente che se il risolutore supporta il callback del messaggio e l'utente registra un callback, questo valore di parametro viene ignorato e non viene stampata alcuna traccia.

lp_algorithm

LPAlgorithmProto

L'algoritmo per la risoluzione di un programma lineare. Se LP_ALGORITHM_UNSPECIFIED, utilizza l'algoritmo predefinito del risolutore.

Per i problemi che non sono programmi lineari ma in cui la programmazione lineare è una sottoroutine, i risolutori possono utilizzare questo valore. Ad esempio, i risolutori MIP in genere la utilizzano solo per la risoluzione LP principale (in caso contrario utilizzano il dual Simplex).

presolve

EmphasisProto

Sforzati di semplificare il problema prima di iniziare l'algoritmo principale o il livello di sforzo predefinito del risolutore se TOPIC_UNSPECIFIED.

cuts

EmphasisProto

Cerca di ottenere un maggiore rilascio LP (solo MIP) o il livello di sforzo predefinito del risolutore se TOPIC_UNSPECIFIED.

NOTA: la disattivazione delle interruzioni potrebbe impedire ai callback di aggiungere interruzioni a MIP_NODE, questo comportamento è specifico per il risolutore.

heuristics

EmphasisProto

Tentativo di trovare soluzioni realizzabili oltre a quelle incontrate nella procedura di ricerca completa (solo MIP) o al livello di sforzo predefinito del risolutore se TOPIC_UNSPECIFIED.

scaling

EmphasisProto

Sforzo di riscalare il problema per migliorare la stabilità numerica o il livello di sforzo predefinito del risolutore se TOPIC_UNSPECIFIED.

iteration_limit

int64

Limitare le iterazioni dell'algoritmo sottostante (ad es. pivot Simplex). Il comportamento specifico dipende dal risolutore e dall'algoritmo utilizzati, ma spesso può fornire un limite di risoluzione deterministico (potrebbe essere necessaria un'ulteriore configurazione, ad esempio un thread).

Tipicamente supportato dai risolutori LP, QP e MIP, ma per i risolutori MIP vedi anche node_limit.

node_limit

int64

Limite al numero di sottoproblemi risolti nella ricerca enumerativa (ad es. ramo e legato). Per molti risolutori, può essere utilizzata per limitare in modo deterministico il calcolo (potrebbe essere necessaria un'ulteriore configurazione, ad esempio un thread).

Solitamente per i risolutori MIP, vedi anche itration_limit.

cutoff_limit

double

Il risolutore si ferma presto se è in grado di dimostrare che non esistono soluzioni primordiali valide almeno quanto il valore limite.

In caso di interruzione anticipata, il risolutore restituisce il motivo della risoluzione NO_SOLUTION_FOUND e il limite CUTOFF e non è necessario fornire ulteriori informazioni sulla soluzione. Non ha alcun effetto sul valore restituito in assenza di un'interruzione anticipata.

Ti consigliamo di utilizzare una tolleranza se vuoi che vengano restituite soluzioni con lo scopo esattamente uguale al limite massimo.

Consulta la guida dell'utente per maggiori dettagli e un confronto con best_bound_limit.

objective_limit

double

Il risolutore si ferma presto non appena trova una soluzione almeno questa buona, con un motivo di risoluzione FEASIBILE e un limite OBIETTIVO.

best_bound_limit

double

Il risolutore si ferma presto non appena dimostra che il limite migliore è almeno questo buono, con il motivo della risoluzione FEASIBLE o NO_SOLUTION_FOUND e il limite OBJECTIVE.

Consulta la guida dell'utente per maggiori dettagli e un confronto con cutoff_limit.

solution_limit

int32

Il risolutore si ferma presto dopo aver trovato queste tante soluzioni fattibili, con il motivo della risoluzione FEASIBILE e la SOLUZIONE limitata. Deve essere maggiore di zero, se impostato. Spesso viene utilizzato per indurre il risolutore a fermarsi sulla prima soluzione possibile trovata. Tieni presente che non esiste alcuna garanzia sul valore obiettivo per nessuna delle soluzioni restituite.

I risolutori solitamente non restituiscono più soluzioni rispetto al limite consentito, ma questo non viene applicato da MathOpt, vedere anche b/214041169.

Attualmente supportato per Gurobi e SCIP e per CP-SAT solo con valore 1.

threads

int32

Se impostato, deve essere >= 1.

random_seed

int32

Genera il generatore di numeri pseudo-casuali nel risolutore sottostante. Tieni presente che tutti i risolutori usano numeri pseudo-casuali per selezionare elementi come le perturbazioni nell'algoritmo LP, per le regole di tie-breaking e per le correzioni euristiche. Variare questa condizione può avere un impatto notevole sul comportamento del risolutore.

Sebbene tutti i risolutori abbiano un concetto di origine, tieni presente che i valori validi dipendono dal risolutore effettivo. - Gurobi: [0:GRB_MAXINT] (che a partire da Gurobi 9.0 è 2x10^9). - GSCIP: [0:2147483647] (che è MAX_INT o kint32max o 2^31-1). - GLOP: [0:2147483647] (come sopra) In tutti i casi, il risolutore riceverà un valore uguale a: MAX(0, MIN(MAX_VALID_VALUE_FOR_SOLVER, random_seed)).

absolute_gap_tolerance

double

Una tolleranza assoluta di ottimizzazione (principalmente) per i risolutori MIP.

Il GAP assoluto è il valore assoluto della differenza tra: * il valore obiettivo della migliore soluzione possibile trovata, * il doppio vincolo prodotto dalla ricerca. Il risolutore può arrestarsi quando il GAP assoluto raggiunge al massimo absolute_gap_sustainability (se impostata) e restituire TERMINATION_REASON_OPTIMAL.

Deve essere >= 0, se impostato.

Vedi anche relative_gap_Tolleranza.

relative_gap_tolerance

double

Una tolleranza di ottimizzazione relativa (principalmente) per i risolutori MIP.

Il GAP relativo è una versione normalizzata del GAP assoluto (definito sulla tolleranza assoluta_gap), in cui la normalizzazione dipende dal risolutore, ad esempio il GAP assoluto diviso per il valore obiettivo della soluzione migliore trovata.

Il risolutore può arrestarsi quando il GAP relativo raggiunge al massimo relative_gap_sustainability (se impostato) e restituire TERMINATION_REASON_OPTIMAL.

Deve essere >= 0, se impostato.

Vedi anche assoluta_tolleranza_gap.

solution_pool_size

int32

Gestisci fino a solution_pool_size soluzioni durante la ricerca. Il pool di soluzioni generalmente ha due funzioni: (1) Per i risolutori che possono restituire più di una soluzione, questo limita il numero di soluzioni che verranno restituite. (2) Alcuni risolutori potrebbero eseguire euristiche utilizzando le soluzioni del pool di soluzioni, quindi la modifica di questo valore potrebbe influire sul percorso dell'algoritmo. Per costringere il risolutore a riempire il pool di soluzioni, ad esempio con le n soluzioni migliori, richiede un'ulteriore configurazione specifica del risolutore.

SolveResultProto

Il contratto relativo ai casi in cui le soluzioni/raggi primali/doppi sono complessi, vedi terminazioni_reasons.md per una descrizione completa.

Fino a quando non viene finalizzato un contratto esatto, è più sicuro semplicemente verificare se è presente una soluzione o un raggio, anziché basarsi sul motivo della risoluzione.

Campi
termination

TerminationProto

Il motivo per cui il risolutore si è interrotto.

solutions[]

SolutionProto

Il contratto generale per definire l'ordine delle soluzioni che i futuri risolutori dovrebbero implementare prevede che: 1. Le soluzioni con una soluzione possibile primordiale, ordinate per primo in base al miglior obiettivo primario. 2. Le soluzioni con una duplice soluzione fattibile, ordinate per migliore duplice obiettivo (il duplice obiettivo sconosciuto è il peggiore) 3. Tutte le soluzioni rimanenti possono essere restituite in qualsiasi ordine.

primal_rays[]

PrimalRayProto

Istruzioni per il miglioramento primordiale illimitato, o, equivalentemente, per i certificati di fattibilità doppi. Di solito fornito per ResolutionReasonProtos UNBOUNDED e DUAL_INFEASIBLE

dual_rays[]

DualRayProto

Istruzioni per il doppio miglioramento illimitato o, equivalentemente, per certificati di fattibilità primitivi. Di solito viene fornito per Motivo della Estinzione Proto INFEASIBILE.

solve_stats

SolveStatsProto

Statistiche sul processo di risoluzione, ad esempio tempo di esecuzione, iterazioni.

SolveStatsProto

Campi
solve_time

Duration

Tempo trascorso come misurato da math_opt, più o meno il tempo all'interno di Solver::Solve(). Nota: non è incluso il lavoro di creazione del modello.

problem_status

ProblemStatusProto

Stati di fattibilità per problemi primali e doppi.

simplex_iterations

int64

barrier_iterations

int64

first_order_iterations

int64

node_count

int64

SolverTypeProto

I risolutori supportati da MathOpt.

Enum
SOLVER_TYPE_UNSPECIFIED
SOLVER_TYPE_GSCIP

Solving Constraint Integer Programs (SCIP) risolutore (di terze parti).

Supporta problemi quadratici con numeri interi non convessi, LP, MIP. Tuttavia, non vengono restituiti dati dual per gli LP. Preferisco GLOP per gli LP.

SOLVER_TYPE_GUROBI

Risolutore Gurobi (terza parte).

Supporta problemi quadratici con numeri interi non convessi, LP, MIP. Di solito è l'opzione più veloce, ma ha una licenza speciale.

SOLVER_TYPE_GLOP

Il risolutore Glop di Google.

Supporta LP con metodi primal e dual Simplex.

SOLVER_TYPE_CP_SAT

Il risolutore CP-SAT di Google.

Supporta problemi in cui tutte le variabili sono numeri interi e limitate (o implicite in modo che siano successive alla prerisoluzione). Supporto sperimentale per ridimensionare e distinguere i problemi con variabili continue.

SOLVER_TYPE_PDLP

Il risolutore PDLP di Google.

Supporta obiettivi quadratici con diagonale LP e diagonale. Utilizza i metodi del primo ordine anziché il Simplex. È in grado di risolvere problemi molto grandi.

SOLVER_TYPE_GLPK

GNU Linear Programming Kit (GLPK) (di terze parti).

Supporta MIP e LP.

Sicurezza Thread: GLPK utilizza l'archiviazione locale dei thread per le allocazioni della memoria. Di conseguenza, le istanze del risolutore devono essere eliminate nello stesso thread in cui vengono create, altrimenti GLPK si arresta in modo anomalo. Sembra corretto chiamare Solver::Solve() da un altro thread rispetto a quello utilizzato per creare il Risolutore, ma non è documentato da GLPK e dovrebbe essere evitato.

Quando si risolve un LP con il presolver, la soluzione (e i raggi non associati) vengono restituiti solo se è stata trovata una soluzione ottimale. In caso contrario, non viene restituito nulla. Vedi glpk-5.0/doc/glpk.pdf pagina #40 disponibile su glpk-5.0.tar.gz per maggiori dettagli.

SOLVER_TYPE_OSQP

Il risolutore OSQP (Operations Splitting Quadratic Program) (di terze parti).

Supporta problemi continui con vincoli lineari e obiettivi quadratici lineari o convessi. Utilizza il metodo del primo ordine.

SOLVER_TYPE_ECOS

Il risolutore conico incorporato (ECOS) (di terze parti).

Supporta problemi LP e SOCP. Utilizza metodi con punti interni (barriera).

SOLVER_TYPE_SCS

Il risolutore SCS (Splitting Conic Risolutore) (di terze parti).

Supporta problemi LP e SOCP. Utilizza il metodo del primo ordine.

SOLVER_TYPE_HIGHS

Il risolutore HiGHS (di terze parti).

Supporta problemi LP e MIP (le QP convessi non sono implementate).

SOLVER_TYPE_SANTORINI

Implementazione di riferimento di MathOpt con un risolutore MIP.

Lenta/non consigliata per la produzione. Non è un risolutore LP (non sono state restituite due informazioni).

SosConstraintProto

Dati per la rappresentazione di un singolo vincolo SOS1 o SOS2.

Se una variabile coinvolta in questo vincolo viene eliminata, viene trattata come se fosse impostata su zero.

Campi
expressions[]

LinearExpressionProto

Le espressioni a cui applicare il vincolo SOS: * SOS1: al massimo un elemento prende un valore diverso da zero. * SOS2: al massimo due elementi assumono valori diversi da zero e devono essere adiacenti nell'ordine ripetuto.

weights[]

double

È vuoto o di lunghezza uguale alle espressioni. Se vuoto, le ponderazioni predefinite sono 1, 2, ... Se presente, le voci devono essere univoche.

name

string

I messaggi principali possono avere requisiti di univocità in questo campo; ad esempio, vedi ModelProto.sos1_constraints e SosConstraintUpdatesProto.new_constraints.

SparseBasisStatusVector

Una rappresentazione sparsa di un vettore di stati di base.

Campi
ids[]

int64

Devono essere ordinati (in ordine crescente) con tutti gli elementi distinti.

values[]

BasisStatusProto

La lunghezza deve essere uguale agli ID.

SparseDoubleMatrixProto

Una rappresentazione sparsa di una matrice di doppi.

La matrice è memorizzata come tripli di ID riga, ID colonna e coefficiente. Questi tre vettori devono avere la stessa lunghezza. Per tutti i valori i, la tupla (id_riga[i], id_colonna[i]) deve essere distinta. Le voci devono essere in ordine principale di riga.

Campi
row_ids[]

int64

column_ids[]

int64

coefficients[]

double

Non può contenere NaN.

SparseDoubleVectorProto

Una rappresentazione sparsa di un vettore di doppi.

Campi
ids[]

int64

Devono essere ordinati (in ordine crescente) con tutti gli elementi distinti.

values[]

double

La lunghezza deve essere uguale agli ID. Non può contenere NaN.

SparseInt32VectorProto

Una rappresentazione sparsa di un vettore di interi.

Campi
ids[]

int64

Deve essere ordinato (in ordine crescente) con tutti gli elementi distinti.

values[]

int32

La lunghezza deve essere uguale agli ID.

SparseVectorFilterProto

Questo messaggio consente di interrogare/impostare parti specifiche di uno SparseXxxxVector. Il comportamento predefinito non prevede l'esclusione di nulla. Un utilizzo comune è eseguire query solo su parti di soluzioni (solo valori diversi da zero e/o solo un insieme selezionato di valori di variabili).

Campi
skip_zero_values

bool

Per SparseBoolVectorProto il valore "zero" è false.

filter_by_ids

bool

Se true, restituisci solo i valori corrispondenti agli ID elencati in filter_id.

filtered_ids[]

int64

L'elenco di ID da utilizzare quando il valore di filter_by_id è true. Deve essere vuoto quando il valore di filter_by_id è false. NOTA: se è vuoto e il valore di filter_by_ids è true, significa che non vuoi ricevere informazioni nel risultato.

TerminationProto

Tutte le informazioni sul motivo per cui una chiamata a Solve() è stata terminata.

Campi
reason

TerminationReasonProto

Informazioni aggiuntive in limit quando il valore è TERMINATION_REASON_FEASIBLE o TERMINATION_REASON_NO_SOLUTION_FOUND, consulta limit per i dettagli.

limit

LimitProto

È LIMIT_UNSPECIFIED, a meno che il motivo non sia TERMINATION_REASON_FEASIBLE o TERMINATION_REASON_NO_SOLUTION_FOUND. Non tutti i risolutori sono in grado di determinare sempre il limite che ha causato la risoluzione. Se non è possibile determinarne la causa, viene utilizzato LIMIT_UNDETERMINED.

detail

string

Informazioni aggiuntive tipicamente specifiche per il risolutore in merito alla risoluzione.

problem_status

ProblemStatusProto

Stati di fattibilità per problemi primali e doppi. A partire dal 18 luglio 2023, questo messaggio potrebbe non essere presente. Se mancante, il valore problem_status si trova in SolveResultProto.solve_stats.

objective_bounds

ObjectiveBoundsProto

Limita il valore obiettivo ottimale. A partire dal 18 luglio 2023, questo messaggio potrebbe non essere presente. Se mancante, il campo goal_bounds.primal_bound si trova in SolveResultProto.solve.stats.best_primal_bound e object_bounds.dual_bound sono disponibili in SolveResultProto.solve.stats.best_dual_bound

TerminationReasonProto

Il motivo per cui una chiamata a Solve() viene terminata.

Enum
TERMINATION_REASON_UNSPECIFIED
TERMINATION_REASON_OPTIMAL È stata trovata una soluzione ottimale (fino a tolleranze numeriche).
TERMINATION_REASON_INFEASIBLE Il problema primordiale non ha soluzioni attuabili.
TERMINATION_REASON_UNBOUNDED Il problema primordiale è fattibile e si possono trovare soluzioni arbitrariamente buone lungo un raggio primordiale.
TERMINATION_REASON_INFEASIBLE_OR_UNBOUNDED Il problema primordiale è impossibile o illimitato. Ulteriori dettagli sullo stato del problema potrebbero essere disponibili in solve_stats.problem_status. Tieni presente che lo stato illimitato di Gurobi potrebbe essere mappato qui.
TERMINATION_REASON_IMPRECISE

Il problema è stato risolto con uno dei criteri di cui sopra (Ottimal, Infeasible, Illimitata o InfeasibleOrUnbounded), ma una o più tolleranze non sono state soddisfatte. Alcune soluzioni/raggi primitivi/doppi sono presenti, ma saranno leggermente inattuabili oppure (se il problema era quasi ottimale) potrebbero esserci un divario tra il miglior obiettivo della soluzione e il migliore vincolo per l'obiettivo.

Gli utenti possono comunque eseguire query su soluzioni/raggi e statistiche di soluzioni primarie/due, ma sono responsabili della gestione dell'imprecisione numerica.

TERMINATION_REASON_FEASIBLE L'ottimizzatore ha raggiunto un qualche tipo di limite e viene restituita una soluzione prima possibile. Consulta SolveResultProto.limit_detail per una descrizione dettagliata del tipo di limite che è stato raggiunto.
TERMINATION_REASON_NO_SOLUTION_FOUND L'ottimizzatore ha raggiunto un qualche tipo di limite e non ha trovato una soluzione inizialmente fattibile. Consulta SolveResultProto.limit_detail per una descrizione dettagliata del tipo di limite che è stato raggiunto.
TERMINATION_REASON_NUMERICAL_ERROR L'algoritmo si è interrotto perché si è verificato un errore numerico irreversibile. Nessuna informazione sulla soluzione disponibile.
TERMINATION_REASON_OTHER_ERROR L'algoritmo si è interrotto a causa di un errore non contemplato da uno degli stati definiti sopra. Nessuna informazione sulla soluzione disponibile.

VariablesProto

Come utilizzato di seguito, definiamo "#variables" = size(VariablesProto.ids).

Campi
ids[]

int64

Deve essere un numero non negativo ed essere necessariamente in aumento. Impossibile utilizzare il valore max(int64).

lower_bounds[]

double

Deve avere lunghezza uguale a #variables, valori in [-inf, inf).

upper_bounds[]

double

Deve avere lunghezza uguale a #variables, valori in (-inf, inf].

integers[]

bool

La lunghezza deve essere uguale a #variables. Il valore è false per le variabili continue e true per le variabili numeri interi.

names[]

string

Se non impostato, si presume che siano tutte stringhe vuote. In caso contrario, la lunghezza deve essere uguale a #variables.

Tutti i nomi non vuoti devono essere distinti.