Wykonuje obliczenia modelu wejściowego i zwraca wynik od razu. Skorzystaj z tej opcji, gdy nie potrzebujesz wywołań zwrotnych, przyrostu wartości ani śledzenia postępu rozwiązania.
Żądanie HTTP
POST https://optimization.googleapis.com/v1/mathopt:solveMathOptModel
Adres URL używa składni transkodowania gRPC.
Treść żądania
Treść żądania zawiera dane o następującej strukturze:
Zapis JSON |
---|
{ "solverType": enum ( |
Pola | |
---|---|
solverType |
Opcjonalnie: Typ rozwiązania matematycznego do rozwiązania zadania liczbowego. Pamiętaj, że jeśli rozwiązanie nie obsługuje konkretnej funkcji modelu, procedura optymalizacji się nie powiedzie. |
model |
Wymagane. Matematyczna reprezentacja zadania optymalizacyjnego do rozwiązania. |
parameters |
Opcjonalnie: Parametry do sterowania pojedynczym rozwiązaniem. Parametr allowoutput jest obsługiwany w szczególności. W przypadku rozwiązań, które obsługują wywołania zwrotne wiadomości, ustawienie wartości Prawda spowoduje, że serwer zarejestruje wywołanie zwrotne wiadomości. Otrzymane wiadomości zostaną zwrócone w formacie SolveMathOptModelResponse.messages. W przypadku innych rozwiązań ustawienie wartości allowOutput na „true” (prawda) spowoduje błąd. |
modelParameters |
Opcjonalnie: Parametry do sterowania pojedynczym rozwiązaniem, które są specyficzne dla modelu wejściowego (w sekcji SolveParametersProto znajdziesz parametry niezależne od modelu). |
Treść odpowiedzi
Odpowiedź na jednoargumentowe rozwiązanie zdalne w narzędziu MathOpt.
W przypadku powodzenia treść żądania zawiera dane o następującej strukturze:
Zapis JSON |
---|
{
"result": {
object ( |
Pola | |
---|---|
result |
Opis wyników rozwiązania modelu w żądaniu. |
messages[] |
Jeśli użyto parametru SolveParametersProto.enable_output, będą one zawierać komunikaty logu dotyczące rozwiązań obsługujących wywołania zwrotne wiadomości. |
SolverTypeProto
Rozwiązania obsługiwane przez funkcję MathOpt.
Wartości w polu enum | |
---|---|
SOLVER_TYPE_UNSPECIFIED |
|
SOLVER_TYPE_GSCIP |
Rozwiązywanie programów SCIP (Constraint Integer Programs – rozwiązania innych firm). Obsługuje zadania z zapisami LP, MIP oraz z niewypukłymi liczbami całkowitymi. Nie są jednak zwracane podwójne dane dotyczące stron docelowych. Preferuj GLOP w przypadku stron docelowych. |
SOLVER_TYPE_GUROBI |
Rozwiązanie Gurobi (inna firma). Obsługuje zadania z zapisami LP, MIP oraz z niewypukłymi liczbami całkowitymi. Jest to zwykle najszybsza opcja, ale ma specjalne licencje. |
SOLVER_TYPE_GLOP |
Rozwiązanie Google Glop. Obsługuje LP z użyciem metod podstawowych i podwójnych. |
SOLVER_TYPE_CP_SAT |
Rozwiązanie Google CP-SAT. Obsługuje zadania, w których wszystkie zmienne są liczbami całkowitymi i ograniczonymi (lub domniemane, że występuje po presolve). Eksperymentalna obsługa przeskalowania i dyskretowania problemów ze zmiennymi ciągłymi. |
SOLVER_TYPE_PDLP |
Rozwiązanie Google PDLP. Obsługuje obiektywy kwadratowe i wypukłe w kierunku LP. Używa metod pierwszego rzędu zamiast metody jednokierunkowej. mogą rozwiązać bardzo duże problemy. |
SOLVER_TYPE_GLPK |
GNU Linear Programming Kit (GLPK) (inna firma). Obsługuje MIP i LP. Bezpieczeństwo wątków: GLPK używa pamięci lokalnej wątku na potrzeby alokacji pamięci. W związku z tym instancje Solver muszą zostać zniszczone w tym samym wątku, w którym są tworzone. W przeciwnym razie GLPK ulegnie awarii. Wydaje się, że można wywołać funkcję Solver::Solve() z innego wątku niż ten użyty do utworzenia funkcji Solver, ale nie jest to udokumentowane w GLPK i należy tego unikać. Podczas ustalania LP za pomocą presora rozwiązanie (i niepowiązane promienie) jest zwracane tylko wtedy, gdy zostało znalezione optymalne rozwiązanie. W przeciwnym razie nic nie jest zwracane. Szczegółowe informacje można znaleźć na stronie glpk-5.0/doc/glpk.pdf nr 40 dostępnej pod adresem glpk-5.0.tar.gz. |
SOLVER_TYPE_OSQP |
Rozwiązanie do podziału operatora w ramach programu kwadratowego (OSQP) (firma zewnętrzna). Obsługuje ciągłe zadania z ograniczeniami liniowymi oraz liniowymi lub wypukłymi celami kwadratowymi. Używa metody pierwszego rzędu. |
SOLVER_TYPE_ECOS |
Embedded Conic Solver (ECOS) (inna firma). Obsługuje problemy LP i SOCP. Stosuje metody punktowe wewnątrz (przeszkoda). |
SOLVER_TYPE_SCS |
The Splitting Conic Solver (SCS) (firma zewnętrzna). Obsługuje problemy LP i SOCP. Używa metody pierwszego rzędu. |
SOLVER_TYPE_HIGHS |
HiGHS Solver (inna firma). Obsługuje problemy z poziomem strony docelowej i MIP (wypukłe QP nie są zaimplementowane). |
SOLVER_TYPE_SANTORINI |
Referencyjna implementacja rozwiązania MIP w MathOpt. Powolne działanie lub niezalecane w środowisku produkcyjnym. To nie jest narzędzie do rozwiązywania problemów LPD (brak zwróconych informacji). |
ModelProto
Problem z optymalizacją. MathOpt obsługuje: – ciągłe i całkowite zmienne decyzji z opcjonalnymi granicami skończonymi. – Cele liniowe i kwadratowe (jeden lub wiele celów), zminimalizowane lub zmaksymalizowane. – Wiele typów ograniczeń, w tym: * Ograniczenia liniowe * Ograniczenia kwadratowe * Ograniczenia stożkowe drugiego rzędu * Ograniczenia logiczne > Ograniczenia SOS1 i SOS2 > Ograniczenia wskaźnika
Domyślnie ograniczenia są przedstawione w formacie „identyfikator do danych” map. Reprezentujemy jednak ograniczenia liniowe w bardziej efektywnym „strukturze tablic” .
Zapis JSON |
---|
{ "name": string, "variables": { object ( |
Pola | |
---|---|
name |
|
variables |
|
objective |
Główny cel w modelu. |
auxiliaryObjectives |
Cele pomocnicze do wykorzystania w modelach wielocelowych. Identyfikatory kluczy mapowania muszą mieć format [0, max(int64)). Każdy priorytet i każda nazwa, która nie jest pusta, muszą być niepowtarzalne i różnić się od podstawowego elementu Obiekt zawierający listę par |
linearConstraints |
|
linearConstraintMatrix |
Współczynniki zmienne ograniczeń liniowych. Jeśli zmienna powiązana z tym ograniczeniem zostanie usunięta, jest traktowana tak, jakby miała wartość 0. Wymagania: * element linearConstraintMatrix.row_ids to elementy obiektu linearConstraints.ids. * Element linearConstraintMatrix.column_ids to elementy zmiennej hosts.ids. * Nieokreślone wpisy macierzy mają wartość 0. * Wszystkie wartości linearConstraintMatrix.values muszą być skończone. |
quadraticConstraints |
Ograniczenia kwadratowe w modelu. Obiekt zawierający listę par |
secondOrderConeConstraints |
Ograniczenia stożkowe drugiego rzędu w modelu. Obiekt zawierający listę par |
sos1Constraints |
Ograniczenia SOS1 w modelu, które określają, że maksymalnie 1 Obiekt zawierający listę par |
sos2Constraints |
Ograniczenia SOS2 w modelu, które sprawiają, że maksymalnie 2 wpisy funkcji Obiekt zawierający listę par |
indicatorConstraints |
Ograniczenia wskaźników w modelu, które go wymuszają w przypadku binarnej „zmiennej wskaźnika” ma wartość jeden, a następnie „domniemane ograniczenie” musi utrzymywać. Obiekt zawierający listę par |
VariablesProto
W poniższym przykładzie definiujemy „#variables” = size(ZmienneProto.ids).
Zapis JSON |
---|
{ "ids": [ string ], "lowerBounds": [ number ], "upperBounds": [ number ], "integers": [ boolean ], "names": [ string ] } |
Pola | |
---|---|
ids[] |
Musi być nieujemna i ściśle rosnąca. Nie można użyć wartości max(int64). |
lowerBounds[] |
Długość powinna być równa #zmiennym oraz wartościom w [-inf, inf). |
upperBounds[] |
Długość powinna być równa #variables, a wartości w (-inf, inf]. |
integers[] |
Długość powinna być równa #zmiennej. Wartość to „false” w przypadku zmiennych ciągłych i „prawda” w przypadku zmiennych liczb całkowitych. |
names[] |
Jeśli zasada nie jest skonfigurowana, zakłada się, że wszystkie ciągi są puste. W przeciwnym razie długość powinna być równa #variables. Wszystkie nazwy, które nie są puste, muszą być różne. |
ObjectiveProto
Zapis JSON |
---|
{ "maximize": boolean, "offset": number, "linearCoefficients": { object ( |
Pola | |
---|---|
maximize |
wartość fałsz oznacza minimalizację, prawda oznacza maksymalizację; |
offset |
Musi być skończony, a nie NaN. |
linearCoefficients |
Terminy ObjectiveProto liniowe w zmiennych decyzyjnych. Wymagania: * linearCoEffectives.ids są elementami zmiennej variablesProto.ids. * Nieokreślony parametr ZmiennesProto ma wartość 0. * Wszystkie wartości linearne.wartości muszą być skończone. * Wartość linearCoefficiencys.values może wynosić zero, ale powoduje to tylko marnowanie miejsca. |
quadraticCoefficients |
Terminy obiektywne w zmiennych decyzyjnych, które są kwadratowe. Wymagania oprócz wymagań dotyczących komunikatów SparseDoubleMatrixProto: * Każdy element quadraticCoeffectives.row_ids i każdego elementu parametru quadraticCoeffectives.column_ids musi być elementem ZmiennesProto.ids. * Macierz musi być trójkątna: dla każdego i współczynniki kwadratowe.identyfikatory_wierszy[i] <= współczynniki kwadratowe.identyfikatory_kolumn[i]. Uwagi: * współczynniki, które nie są bezpośrednio przechowywane, mają wartość zero. * Elementy składowe quadraticCo ocenias.coefficiencys mogą wynosić 0, ale powoduje to tylko zmarnowanie miejsca. |
name |
Wiadomości nadrzędne mogą mieć w tym polu wymagania dotyczące unikatowości. np. zapoznaj się z sekcjami ModelProto.objectives i AuxiliaryObjectivesUpdatesProto.new_objectives. |
priority |
W przypadku problemów wielozadaniowych priorytet tego celu w porównaniu z innymi (niższy jest ważniejszy). Ta wartość nie może być ujemna. Ponadto każdy priorytet celu w modelu musi być inny w czasie rozwiązania. Ten warunek nie jest weryfikowany na poziomie protokołu, dlatego modele mogą tymczasowo mieć cele o tym samym priorytecie. |
SparseDoubleVectorProto
Rzadka reprezentacja wektora liczby zmiennoprzecinkowej.
Zapis JSON |
---|
{ "ids": [ string ], "values": [ number ] } |
Pola | |
---|---|
ids[] |
Muszą być sortowane (w kolejności rosnącej), tak aby wszystkie elementy były inne. |
values[] |
Musi mieć taką samą długość jak identyfikatory. Nie może zawierać NaN. |
SparseDoubleMatrixProto
Rzadka reprezentacja macierzy liczby podwójnej precyzji.
Macierz jest przechowywana jako potrójne wartości identyfikatora wiersza, identyfikatora kolumny i współczynnika. Te 3 wektory muszą mieć taką samą długość. W przypadku każdego parametru i krotka (rowIds[i], columnIds[i]) powinna być inna. Wpisy muszą być w kolejności głównej.
Zapis JSON |
---|
{ "rowIds": [ string ], "columnIds": [ string ], "coefficients": [ number ] } |
Pola | |
---|---|
rowIds[] |
|
columnIds[] |
|
coefficients[] |
Nie może zawierać NaN. |
LinearConstraintsProto
W dalszej części artykułu definiujemy „#linearne ograniczenia”. = rozmiar(LinearConstraintsProto.ids).
Zapis JSON |
---|
{ "ids": [ string ], "lowerBounds": [ number ], "upperBounds": [ number ], "names": [ string ] } |
Pola | |
---|---|
ids[] |
Musi być nieujemna i ściśle rosnąca. Nie można użyć wartości max(int64). |
lowerBounds[] |
Długość powinna być równa #linearną ograniczeniom i wartościom w [-inf, inf). |
upperBounds[] |
Długość powinna być równa #linearne ograniczenia, wartości w (-inf, inf]. |
names[] |
Jeśli zasada nie jest skonfigurowana, zakłada się, że wszystkie ciągi są puste. W przeciwnym razie długość powinna być równa #linearne ograniczenia. Wszystkie nazwy, które nie są puste, muszą być różne. |
QuadraticConstraintProto
Jedno ograniczenie kwadratowe w formie: lb <= sum{linearTerms} + sum{quadraticTerms} <= ub.
Jeśli zmienna powiązana z tym ograniczeniem zostanie usunięta, jest traktowana tak, jakby miała wartość 0.
Zapis JSON |
---|
{ "linearTerms": { object ( |
Pola | |
---|---|
linearTerms |
Wyrazy liniowe w zmiennych decyzyjnych. Oprócz wymagań dotyczących komunikatów SparseDoubleVectorProto wymagamy, aby: * element linearTerms.ids był elementami parametru variablesProto.ids. * Parametr linearTerms.values musi mieć format skończony i inny niż NaN. Uwagi: * pominięte identyfikatory zmiennych mają odpowiedni współczynnik równy zero. * Parametr linearTerms.values może mieć wartość 0, ale powoduje to tylko marnowanie miejsca. |
quadraticTerms |
Wyrazy o równaniu kwadratowym w zmiennych decyzyjnych. Oprócz wymagań dotyczących komunikatów SparseDoubleMatrixProto wymagamy, aby: * Każdy element quadraticTerms.row_ids i każdego elementu quadraticTerms.column_ids musi być elementem ZmiennesProto.ids. * Macierz musi być trójkątną górną: w przypadku każdego i quadraticTerms.row_ids[i] <= quadraticTerms.column_ids[i]. Uwagi: * współczynniki, które nie są bezpośrednio przechowywane, mają wartość zero. * Elementy parametru quadraticTerms.coeffectives mogą wynosić zero, ale to tylko marnuje miejsce. |
lowerBound |
Musi mieć wartość w [-inf, inf) i być mniejsza lub równa |
upperBound |
Wartość musi być równa (-inf, inf] oraz większa lub równa |
name |
Wiadomości nadrzędne mogą mieć w tym polu wymagania dotyczące unikatowości. np. w sekcjach ModelProto.quadratic_constraints i QuadraticConstraintUpdatesProto.new_constraints. |
SecondOrderConeConstraintProto
Ograniczenie jednego stożka drugiego rzędu w formie:
||argumentsToNorm
||_2 <= upperBound
,
gdzie upperBound
i każdy element argumentsToNorm
są wyrażeniami liniowymi.
Jeśli zmienna powiązana z tym ograniczeniem zostanie usunięta, jest traktowana tak, jakby miała wartość 0.
Zapis JSON |
---|
{ "upperBound": { object ( |
Pola | |
---|---|
upperBound |
|
argumentsToNorm[] |
|
name |
Wiadomości nadrzędne mogą mieć w tym polu wymagania dotyczące unikatowości. np. patrz |
LinearExpressionProto
Rzadka reprezentacja wyrażenia liniowego (ważona suma zmiennych i stałe przesunięcie).
Zapis JSON |
---|
{ "ids": [ string ], "coefficients": [ number ], "offset": number } |
Pola | |
---|---|
ids[] |
Identyfikatory zmiennych. Muszą być sortowane (w kolejności rosnącej), tak aby wszystkie elementy były inne. |
coefficients[] |
Musi mieć taką samą długość jak identyfikatory. Wartości muszą być skończone, ale nie NaN. |
offset |
Musi być skończona i nie może być NaN. |
SosConstraintProto
Dane do reprezentowania pojedynczego ograniczenia SOS1 lub SOS2.
Jeśli zmienna powiązana z tym ograniczeniem zostanie usunięta, jest traktowana tak, jakby miała wartość 0.
Zapis JSON |
---|
{
"expressions": [
{
object ( |
Pola | |
---|---|
expressions[] |
Wyrażenia, w których należy zastosować ograniczenie SOS: * SOS1: maksymalnie jeden element ma wartość inną niż zero. * SOS2: maksymalnie 2 elementy mogą mieć wartości inne niż zero i muszą przylegać do siebie w powtarzającej się kolejności. |
weights[] |
Pole może być puste lub mieć taką samą długość jak wyrażenia. Jeśli pole jest puste, wagi domyślne to 1, 2, ... Jeśli występuje, wpisy muszą być unikalne. |
name |
Wiadomości nadrzędne mogą mieć w tym polu wymagania dotyczące unikatowości. np. zobacz model Proto.sos1_constraints i SosConstraintUpdatesProto.new_constraints. |
IndicatorConstraintProto
Dane do przedstawiania ograniczenia według jednego wskaźnika w postaci: zmienna(indicatorId) = (activateOnZero? 0 : 1) ⇒ dolna granica <= wyrażenie <= górna granica.
Jeśli zmienna powiązana z tym ograniczeniem (wskaźnik lub pojawiająca się w polu expression
) zostanie usunięta, jest traktowana tak, jakby miała wartość 0. W szczególności usunięcie zmiennej wskaźnika oznacza, że ograniczenie wskaźnika jest bezwartościowe, jeśli activateOnZero
ma wartość fałsz, i że jest to odpowiednik ograniczenia liniowego, jeśli activateOnZero
ma wartość prawda.
Zapis JSON |
---|
{
"activateOnZero": boolean,
"expression": {
object ( |
Pola | |
---|---|
activateOnZero |
Jeśli zmienna wskaźnika ma wartość 0, to jeśli zmienna wskaźnika ma wartość 0, musi obowiązywać domniemane ograniczenie. W przeciwnym razie, jeśli zmienna wskaźnika przyjmuje wartość 1, musi obowiązywać domniemane ograniczenie. |
expression |
Musi być prawidłowym wyrażeniem liniowym w odniesieniu do modelu, który z nich korzysta: * wszystkie podane warunki dla funkcji |
lowerBound |
Musi zawierać wartość w [-inf, inf); nie może być NaN. |
upperBound |
Musi mieć wartość w (-inf, inf]; nie może być NaN. |
name |
Wiadomości nadrzędne mogą mieć w tym polu wymagania dotyczące unikatowości. np. patrz |
indicatorId |
Identyfikator odpowiadający zmiennej binarnej lub nieskonfigurowany. Jeśli zasada jest nieskonfigurowana, ograniczenie wskaźnika jest ignorowane. Jeśli jest ustawiony, wymagamy, aby: * variablesProto.integers[indicatorId] = true, * ZmiennesProto.lower_bounds[indicatorId] >= 0, * ZmiennesProto.upper_bounds[indicatorId] <= 1. Te warunki nie są weryfikowane przez MathOpt, ale jeśli nie zostaną spełnione, narzędzie do rozwiązania zwróci błąd. |
SolveParametersProto
Parametry do sterowania pojedynczym rozwiązaniem.
Zawiera oba parametry wspólne dla wszystkich rozwiązań, np. limit czasu i parametry konkretnego rozwiązania, np. gscip. Jeśli wartość jest ustawiona zarówno we wspólnym polu, jak i w polu dotyczącym konkretnego rozwiązania, używane jest ustawienie dotyczące konkretnego rozwiązania.
Typowe parametry, które są opcjonalne i nieskonfigurowane, lub wyliczenie z nieokreśloną wartością wskazują, że używana jest wartość domyślna rozwiązania.
Określone parametry rozwiązywania problemów innych niż używany są ignorowane.
Parametry zależne od modelu (np. priorytet odgałęzienia jest ustawiany dla każdej zmiennej) są przekazywane w ModelSolveParametersProto.
Zapis JSON |
---|
{ "timeLimit": string, "enableOutput": boolean, "lpAlgorithm": enum ( |
Pola | |
---|---|
timeLimit |
Maksymalny czas, który musi poświęcić na rozwiązanie problemu (lub nieokreślony, jeśli nie jest ustawiony). Ta wartość nie jest sztywnym limitem; czas rozwiązania może go nieznacznie przekroczyć. Ten parametr jest zawsze przekazywany do bazowego rozwiązania do rozwiązywania problemów. Wartość domyślna rozwiązania nie jest używana. Czas trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „ |
enableOutput |
Umożliwia drukowanie logów czasu implementacji rozwiązania. Lokalizacja tych logów czasu zależy od rozwiązania. W przypadku SCIP i Gurobi są to standardowe strumienie wyjściowe. W przypadku Glop i CP-SAT spowoduje to LOG(INFO). Jeśli rozwiązanie obsługuje wywołanie zwrotne wiadomości, a użytkownik zarejestruje dla niego wywołanie zwrotne, ta wartość parametru będzie ignorowana, a ślady nie będą wyświetlane. |
lpAlgorithm |
Algorytm do rozwiązywania zadań liniowych. Jeśli wartość to LP_ALGORITHM_UNSPECIFIED, użyj domyślnego algorytmu rozwiązania. Ta wartość może zostać użyta w przypadku problemów, które nie są programami liniowymi, ale gdzie programowanie liniowe jest podprogramem. Na przykład: Rozwiązania MIP zazwyczaj używają tego rozwiązania tylko do rozwiązywania problemów z poziomem głównej strony głównej (w przeciwnym razie korzystają z technologii Dual Simplex). |
presolve |
Spróbuj uprościć zadanie przed uruchomieniem głównego algorytmu lub domyślny poziom wysiłku rozwiązania, jeśli EMPHASIS_UNSPECIFIED. |
cuts |
Wysiłek w celu uzyskania silniejszego złagodzenia LP (tylko MIP) lub domyślnego poziomu wysiłku rozwiązania, jeśli EMPHASIS_UNSPECIFIED. UWAGA: wyłączenie cięć może uniemożliwić wywołaniem zwrotnym dodanie cięć na poziomie MIP_NODE. To działanie jest specyficzne dla rozwiązania. |
heuristics |
Wysiłek w celu znalezienia realnych rozwiązań wykraczających poza te zastosowane w pełnej procedurze wyszukiwania (tylko w przypadku MOP) lub na domyślnym poziomie wysiłku rozwiązania (jeśli EMPHASIS_UNSPECIFIED). |
scaling |
Wysiłek związany z przeskalowaniem problemu w celu poprawy stabilności liczbowej lub domyślnego poziomu wysiłku rozwiązania, jeśli EMPHASIS_UNSPECIFIED. |
iterationLimit |
Ogranicz liczbę iteracji będącego podstawą algorytmu (np. przestawień prostego kodu). Konkretne zachowanie zależy od użytego rozwiązania i algorytmu, ale często może dać deterministyczny limit rozwiązań (może być potrzebna dodatkowa konfiguracja, np. 1 wątek). Zwykle obsługiwane przez rozwiązania LP, QP i MIP, ale w przypadku rozwiązań MIP sprawdź też limit węzłów. |
nodeLimit |
Ograniczenie liczby podproblemów rozwiązanych w wyszukiwaniu wyliczeniowym (np. gałęzi i bound). W przypadku wielu rozwiązań może to być używane do deterministycznego ograniczenia obliczeń (mogą być potrzebne dodatkowe ustawienia, np. 1 wątek). Wartość ta jest zwykle dostępna w przypadku rozwiązań MIP. Zapoznaj się też z zasadą iterationLimit. |
cutoffLimit |
Rozwiązanie zatrzymuje się wcześnie, jeśli może udowodnić, że nie ma rozwiązań pierwszych, które byłyby równie skuteczne jak wartość graniczna. W przypadku wcześniejszego zatrzymania rozwiązanie zwraca przyczynę zakończenia działania NO_SOLUTION_FOUND z limitem CUTOFF i nie musi podawać żadnych dodatkowych informacji o rozwiązaniu. Nie ma wpływu na wartość zwracaną, jeśli nie ma wcześniejszego zatrzymania. Zalecamy stosowanie tolerancji, jeśli chcesz, aby zwracane były rozwiązania o celu dokładnie równym wartości granicznej. Więcej informacji znajdziesz w przewodniku użytkownika oraz w porównaniu z bestBoundLimit. |
objectiveLimit |
Rozwiązanie zatrzymuje się wcześnie, gdy znajdzie rozwiązanie co najmniej tak dobre, z uzasadnioną przyczyną zamknięcia i ograniczeniem OBJECTIVE. |
bestBoundLimit |
Rozwiązanie zatrzymuje się wcześnie, gdy udowodni, że najlepsza granica jest przynajmniej taka dobra. Powód zamknięcia to FEASIBLE lub NO_SOLUTION_FOUND i ograniczenie OBJECTIVE. Więcej informacji znajdziesz w przewodniku użytkownika oraz porównanie wartości z limitem cutoffLimit. |
solutionLimit |
Po znalezieniu tak wielu realistycznych rozwiązań rozwiązanie zatrzymuje się wcześnie, przy czym powód zamknięcia jest PRAKTYCZNY i ogranicza ROZWIĄZANIE. Jeśli jest ustawione, wartość musi być większa niż 0. Często przydaje się to do zatrzymania rozwiązania przy pierwszym znalezionym możliwym rozwiązaniu. Pamiętaj, że nie ma gwarancji co do wartości celu dla każdego zwróconego rozwiązania. Rozwiązania matematyczne zwykle nie zwracają większej liczby rozwiązań niż limit, ale MathOpt nie jest egzekwowany (zobacz też b/214041169). Obecnie obsługiwane w przypadku Gurobi i SCIP oraz tylko w przypadku CP-SAT z wartością 1. |
threads |
Jeśli jest ustawiona, musi być >= 1. |
randomSeed |
Materiał wyjściowy dla generatora pseudolosowych liczb w podstawowym rozwiązaniu. Pamiętaj, że wszystkie rozwiązania używają pseudolosowych liczb do wybierania czynników takich jak perturbacja w algorytmie LP, reguły rozdzielania i ustalanie heurystyczne. Zmiana tej wartości może mieć zauważalny wpływ na działanie rozwiązań. Chociaż we wszystkich rozwiązaniach obowiązuje koncepcja nasion, pamiętaj, że prawidłowe wartości zależą od rzeczywistego rozwiązania. – Gurobi: [0:GRB_MAXINT] (co wg Gurobi 9.0 to 2x10^9). – GSCIP: [0:2147483647] (czyli MAX_INT lub kint32max lub 2^31-1). – GLOP: [0:2147483647] (tak samo jak powyżej) we wszystkich przypadkach rozwiązanie do rozwiązania otrzyma wartość równą: MAX(0; MIN(MAX_VALID_VALUE_FOR_SOLVER, randomSeed)). |
absoluteGapTolerance |
Bezwzględna tolerancja optymalizacji (przede wszystkim) w przypadku rozwiązań MIP. Bezwzględna wartość GAP to bezwzględna wartość różnicy między: * obiektywną wartością najlepszego znalezionego rozwiązania i * podwójną granicą wypracowaną przez wyszukiwanie. Rozwiązanie może zostać zatrzymane, gdy bezwzględna wartość GAP osiągnie wartość najwyżej bezwzględną (po ustawieniu) i zwrócić TERMINATION_REASON_OPTIMAL. Jeśli jest ustawiona, musi wynosić >= 0. Zobacz też względną lukę w tolerancji. |
relativeGapTolerance |
Względna tolerancja optymalizacji (głównie) w przypadku rozwiązań MIP. Względna wartość GAP to znormalizowana wersja bezwzględnej wartości GAP (zdefiniowana na podstawie tolerancji bezwzględnej), gdzie normalizacja zależy od rozwiązania, np. wartość bezwzględna GAP podzielona przez wartość obiektywną najlepszego znalezionego rozwiązania. Rozwiązanie może zostać zatrzymane, gdy względna wartość GAP będzie miała wartość co najmniej względnąGapTolerance (po ustawieniu) i zwróci TERMINATION_REASON_OPTIMAL. Jeśli jest ustawiona, musi wynosić >= 0. Zobacz też wartość bezwzględną tolerancji bezwzględnej. |
solutionPoolSize |
Podczas wyszukiwania zachowaj do |
LPAlgorithmProto
Wybiera algorytm do rozwiązywania programów liniowych.
Wartości w polu enum | |
---|---|
LP_ALGORITHM_UNSPECIFIED |
|
LP_ALGORITHM_PRIMAL_SIMPLEX |
Metoda (pierwotna) typu Simplex. Występują zwykle pierwotne i podwójne rozwiązania, pierwotne/podwójne promienie w przypadku problemów podstawowych/podwójnych, które są podstawą. |
LP_ALGORITHM_DUAL_SIMPLEX |
Metoda podwójnej prostoty. Występują zwykle pierwotne i podwójne rozwiązania, pierwotne/podwójne promienie w przypadku problemów podstawowych/podwójnych, które są podstawą. |
LP_ALGORITHM_BARRIER |
Metoda bariery, nazywana też metodą z punktem wewnętrznym (IPM). Zwykle można podać zarówno rozwiązanie pierwotne, jak i podwójne. Niektóre implementacje mogą też generować promienie w przypadku nieograniczonych lub niemożliwych problemów. Podstawa nie jest podana, chyba że bazowe rozwiązanie do wykonania „łączy się” i kończy kropką. |
LP_ALGORITHM_FIRST_ORDER |
Algorytm oparty na metodzie pierwszego rzędu. Takie rozwiązania dają zwykle zarówno podstawowe, jak i podwójne rozwiązania, a także certyfikaty pierwotnych lub podwójnych niewykonalności. Metody pierwszego zamówienia zwykle zapewniają rozwiązania o niższej dokładności, dlatego użytkownicy powinni zadbać o określanie parametrów jakości (np. tolerancje) i weryfikowanie rozwiązań. |
EmphasisProto
Poziom wysiłku zastosowany do zadania opcjonalnego w trakcie rozwiązywania problemu (patrz: SolveParametersProto).
Wyróżnienie jest używane do konfigurowania funkcji rozwiązania w ten sposób: * Jeśli rozwiązanie nie obsługuje tej funkcji, prawidłowa będzie tylko wartość UNSPECIFIED. Każde inne ustawienie będzie zwykle błędem nieprawidłowego argumentu (niektóre rozwiązania mogą też akceptować wartość WYŁ.). * Jeśli rozwiązanie obsługuje tę funkcję: – Jeśli zasada ma wartość UNSPECIFIED, używana jest podstawowa wartość domyślna. - Jeśli nie można wyłączyć tej funkcji, wyłączenie spowoduje zwrócenie błędu. – Jeśli funkcja jest domyślnie włączona, wartością domyślną rozwiązania jest zwykle ŚREDNI. - Jeśli funkcja jest obsługiwana, wartości LOW, ŚREDNIA, WYSOKA i BARDZO WYSOKA nigdy nie będą powodować błędu i zostaną zmapowane na najlepsze dopasowanie.
Wartości w polu enum | |
---|---|
EMPHASIS_UNSPECIFIED |
|
EMPHASIS_OFF |
|
EMPHASIS_LOW |
|
EMPHASIS_MEDIUM |
|
EMPHASIS_HIGH |
|
EMPHASIS_VERY_HIGH |
ModelSolveParametersProto
Zapis JSON |
---|
{ "variableValuesFilter": { object ( |
Pola | |
---|---|
variableValuesFilter |
Filtr stosowany do wszystkich zwracanych rozproszonych kontenerów kluczowanych przez zmienne w PrimalSolutionProto i PrimalRayProto (wartości PrimalSolutionProto.variable_wartości, PrimalRayProto.variable_values). Wymagania: * odfiltrowane identyfikatory to elementy parametru variablesProto.ids. |
dualValuesFilter |
Filtr stosowany do wszystkich zwróconych kontenerów rozproszonych, do których klucze są oparte na ograniczeniach liniowych w DualSolutionProto i DualRay (DualSolutionProto.dual_values, DualRay.dual_values). Wymagania: * filterIds to elementy LinearConstraints.ids. |
reducedCostsFilter |
Filtr stosowany do wszystkich zwracanych rozproszonych kontenerów kluczowanych przez zmienne w DualSolutionProto i DualRay (DualSolutionProto.reduced_costs, DualRay.reduced_costs). Wymagania: * odfiltrowane identyfikatory to elementy parametru variablesProto.ids. |
initialBasis |
Opcjonalna wstępna podstawa do rozwiązywania problemów LP z pamięci z pamięci. Jeśli jest ustawiony, powinien być poprawny zgodnie z zasadą |
solutionHints[] |
Opcjonalne wskazówki dotyczące rozwiązań. Jeśli bazowe rozwiązanie akceptuje tylko jedną wskazówkę, używana jest pierwsza wskazówka. |
branchingPriorities |
Opcjonalne priorytety rozgałęzienia. Zmienne z wyższymi wartościami zostaną rozgałęzione na początku. Zmienne, dla których nie zostały ustawione priorytety, otrzymują domyślny priorytet rozwiązania (zwykle 0). Wymagania: * wartość branchingPriorities.values musi być skończona. * branchingPriorities.ids muszą być elementami parametru ZmiennesProto.ids. |
SparseVectorFilterProto
Ten komunikat umożliwia wykonywanie zapytań lub ustawianie określonych części wektora SparseXxxxVector. Działanie domyślne nie polega na odfiltrowywaniu czegokolwiek. Typowym zastosowaniem jest wysyłanie zapytań dotyczących tylko części rozwiązań (tylko wartości innych niż zero lub ręcznie wybranego zbioru wartości zmiennych).
Zapis JSON |
---|
{ "skipZeroValues": boolean, "filterByIds": boolean, "filteredIds": [ string ] } |
Pola | |
---|---|
skipZeroValues |
W przypadku SparseBoolVectorProto „zero” jest |
filterByIds |
Jeśli zasada ma wartość prawda, zwracane są tylko wartości odpowiadające identyfikatorom wymienionym w identyfikatorze filtra. |
filteredIds[] |
Lista identyfikatorów, które mają być używane, gdy filterByIds mają wartość prawda. To pole musi być puste, jeśli parametr filterByIds ma wartość false (fałsz). UWAGA: jeśli to pole jest puste, a filterByIds ma wartość true, oznacza to, że w wyniku nie chcesz wyświetlać żadnych informacji. |
BasisProto
Charakterystyka kombinacyjna rozwiązania programu liniowego.
Metoda jednorazowa do rozwiązywania programów liniowych zawsze zwraca „podstawowe możliwe rozwiązanie” które można opisać kombinatoricznie za pomocą podstawy. Podstawa przypisuje wartość BasisStatusProto każdej zmiennej i ograniczeniu liniowemu.
Na przykład: użyj standardowej postaci LP: min c * x s.t. A * x = b x >= 0, który ma więcej zmiennych niż ograniczenia i pełną pozycję wiersza A.
Niech n będzie liczbą zmiennych, a m liczbą ograniczeń liniowych. Prawidłową podstawę tego problemu można zdefiniować w ten sposób: * Wszystkie ograniczenia będą miały stan podstawy FIXED. * Wybierz m zmiennych, aby kolumny A były liniowo niezależne i przypisano im stan PODSTAWOWY. * pozostałym zmiennym (n–m) przypisz stan AT_LOWER.
Podstawowym rozwiązaniem tej zasady jest unikalne rozwiązanie funkcji A * x = b, w którym wszystkie zmienne o stanie AT_LOWER mają stałą wartość u dolnych granic (wszystkie 0). Otrzymane rozwiązanie jest nazywane podstawowym, realnym rozwiązaniem, jeśli spełnia też warunki x >= 0.
Zapis JSON |
---|
{ "constraintStatus": { object ( |
Pola | |
---|---|
constraintStatus |
Stan podstawy ograniczenia. Wymagania: * constraintStatus.ids równa się LinearConstraints.ids. |
variableStatus |
Zmienna. Wymagania: * constraintStatus.ids równa się variablesProto.ids. |
basicDualFeasibility |
To zaawansowana funkcja wykorzystywana przez MathOpt do określania wykonalności nieoptymalnych rozwiązań LPG (rozwiązania optymalne zawsze mają stan SOLUTION_STATUS_FEASIBLE). W przypadku jednostronnych elementów strony docelowej powinna być ona równa stanowi wykonalności powiązanego rozwiązania podwójnego. W przypadku dwustronnych elementów LP może się różnić w niektórych przypadkach skrajnych (np. w nieukończonych rozwiązaniach z podstawowym elementem jednostkowym). Jeśli podajesz podstawę jako podstawę za pomocą ModelSolveParametersProto.initial_basis, ta wartość jest ignorowana. Ma znaczenie tylko dla podstawy zwróconej przez SolutionProto.basis. |
SparseBasisStatusVector
Rzadka reprezentacja wektora stanów podstaw.
Zapis JSON |
---|
{
"ids": [
string
],
"values": [
enum ( |
Pola | |
---|---|
ids[] |
Muszą być sortowane (w kolejności rosnącej), tak aby wszystkie elementy były inne. |
values[] |
Musi mieć taką samą długość jak identyfikatory. |
BasisStatusProto
Stan zmiennej/ograniczenia na podstawie elementu docelowego.
Wartości w polu enum | |
---|---|
BASIS_STATUS_UNSPECIFIED |
Wartość zabezpieczenia reprezentująca brak stanu. |
BASIS_STATUS_FREE |
Zmienna/ograniczenie jest swobodna (nie ma skończonych granic). |
BASIS_STATUS_AT_LOWER_BOUND |
Zmienna/ograniczenie znajduje się w dolnej granicy (która musi być skończona). |
BASIS_STATUS_AT_UPPER_BOUND |
Zmienna/ograniczenie znajduje się w górnej granicy (która musi być skończona). |
BASIS_STATUS_FIXED_VALUE |
Zmienna/ograniczenie ma identyczną dolną i górną granicę. |
BASIS_STATUS_BASIC |
Zmienna/ograniczenie jest podstawowa. |
SolutionStatusProto
Wykonalność pierwotnego lub podwójnego rozwiązania zgodnie z deklaracją rozwiązania.
Wartości w polu enum | |
---|---|
SOLUTION_STATUS_UNSPECIFIED |
Wartość zabezpieczenia reprezentująca brak stanu. |
SOLUTION_STATUS_UNDETERMINED |
Narzędzie Solver nie zgłasza praw do stanu wykonalności. |
SOLUTION_STATUS_FEASIBLE |
Według funkcji Solver rozwiązanie jest możliwe. |
SOLUTION_STATUS_INFEASIBLE |
Twórcy rozwiązań twierdzą, że rozwiązanie jest niewykonalne. |
SolutionHintProto
Sugerowane rozwiązanie początkowe.
Rozwiązania MIP wymagają zwykle informacji podstawowych (variableValues
), natomiast rozwiązania LP wymagają zarówno informacji podstawowych, jak i podwójnych (dualValues
).
Wiele rozwiązań MIP może działać z: (1) rozwiązaniami częściowymi, które nie określają wszystkich zmiennych, lub (2) rozwiązaniami niewykonalnymi. W takich przypadkach rozwiązania zazwyczaj rozwiązują inny plik MIP, aby uzupełnić lub poprawić podpowiedź.
Sposób, w jaki rozwiązanie wykorzysta wskazówkę, (o ile w ogóle) zależy od rozwiązania, typu problemu i zastosowanego algorytmu. Najbardziej niezawodnym sposobem na zapewnienie skuteczności podpowiedzi jest odczytywanie bazowych logów rozwiązań z użyciem podpowiedzi i bez niej.
Rozwiązania LP oparte na prostych rozwiązaniach LP zwykle wolą na początkowym etapie ścieżki (w przeciwnym razie muszą przejść na inną).
Zapis JSON |
---|
{ "variableValues": { object ( |
Pola | |
---|---|
variableValues |
Prawdopodobnie częściowe przypisanie wartości do podstawowych zmiennych problemu. Niezależne od rozwiązania wymagania dla tego komunikatu podrzędnego są następujące: * ZmienneValues.ids to elementy parametru variablesProto.ids. * ZmienneValues.values muszą być wartościami skończonymi. |
dualValues |
(potencjalnie częściowe) przypisanie wartości do liniowych ograniczeń problemu. Wymagania: * dualValues.ids to elementy obiektu LinearConstraintsProto.ids. * Wszystkie wartości dualValues.values muszą być skończone. |
SparseInt32VectorProto
Rzadka reprezentacja wektora liczb całkowitych.
Zapis JSON |
---|
{ "ids": [ string ], "values": [ integer ] } |
Pola | |
---|---|
ids[] |
Należy go sortować (w kolejności rosnącej), tak aby wszystkie elementy były inne. |
values[] |
Musi mieć taką samą długość jak identyfikatory. |
SolveResultProto
Umowa dotycząca rozwiązania podstawowego/podwójnego/promieniowania jest złożona. Pełny opis znajdziesz tutaj: termin_wykonania_reasons.md.
Do czasu ostatecznego zawarcia umowy najbezpieczniej jest po prostu sprawdzać, czy rozwiązanie jest dostępne, zamiast polegać na przyczynie rozwiązania umowy.
Zapis JSON |
---|
{ "termination": { object ( |
Pola | |
---|---|
termination |
Przyczyna zatrzymania rozwiązania. |
solutions[] |
Ogólna umowa dotycząca kolejności rozwiązań, które powinny wdrożyć rozwiązania w przyszłości, to porządkowanie według: 1. Rozwiązania z pierwotnym, wykonalnym rozwiązaniem, uporządkowane według najlepszego głównego celu. 2. Rozwiązania obejmujące 2 wykonalne rozwiązania, uporządkowane według najlepszego 2 celów (nieznany podwójny cel jest najgorszy) 3. Wszystkie pozostałe rozwiązania można zwrócić w dowolnej kolejności. |
primalRays[] |
Kierunki nieograniczonego pierwotnego ulepszania lub równoważnego podwójnego certyfikatu niewykonalności. Zwykle dostarczany w przypadku TerminationReasonProtos UNBOUNDED i DUAL_INFEASIBLE |
dualRays[] |
Kierunki nieograniczonego podwójnej poprawy lub równoważnych certyfikatów niewykonalności. Zwykle dostarczana w przypadku TerminationReasonProto INFEASIBLE. |
solveStats |
statystyki procesu rozwiązywania, np. czas trwania czy iteracje. |
TerminationProto
Wszystkie informacje na temat powodów zakończenia wywołania funkcji Solve().
Zapis JSON |
---|
{ "reason": enum ( |
Pola | |
---|---|
reason |
Dodatkowe informacje w polu |
limit |
Jest LIMIT_UNSPECIFIED, chyba że przyczyna to TERMINATION_REASON_FEASIBLE lub TERMINATION_REASON_NO_SOLUTION_FOUND. Nie wszystkie rozwiązania potrafią określić limit, który spowodował zamknięcie. Jeśli nie można ustalić przyczyny, używana jest wartość LIMIT_UNDETERMINED. |
detail |
Dodatkowe informacje dotyczące rozwiązania umowy. |
problemStatus |
Stany wykonalności problemów podstawowych i podwójnych. Od 18 lipca 2023 r. tej wiadomości może brakować. Jeśli jej nie ma, status problemStatus można znaleźć w funkcji SolveResultProto.solve_stats. |
objectiveBounds |
Granice przy optymalnej wartości celu. Od 18 lipca 2023 r. tej wiadomości może brakować. Jeśli go nie ma, pole celBounds.primal_bound można znaleźć w parametrach SolveResultProto.solve.stats.best_primal_bound oraz celBounds.dual_bound, który można znaleźć w funkcji SolveResultProto.solve.stats.best_dual_bound. |
TerminationReasonProto
Przyczyna zakończenia wywołania funkcji Solve().
Wartości w polu enum | |
---|---|
TERMINATION_REASON_UNSPECIFIED |
|
TERMINATION_REASON_OPTIMAL |
Znaleziono ewidentnie optymalne rozwiązanie (do tolerancji liczbowych). |
TERMINATION_REASON_INFEASIBLE |
Pierwotny problem nie ma żadnych realnych rozwiązań. |
TERMINATION_REASON_UNBOUNDED |
Pierwotny problem jest wykonalny i dowolnie dobre rozwiązania można znaleźć wzdłuż promienia pierwotnego. |
TERMINATION_REASON_INFEASIBLE_OR_UNBOUNDED |
Pierwotny problem jest albo niewykonalny lub nieograniczony. Więcej informacji o stanie problemu można znaleźć w sekcji resolveStats.problem_status. Nieograniczony status Gurobi może zostać naniesiony tutaj. |
TERMINATION_REASON_IMPRECISE |
Problem został rozwiązany w przypadku jednego z powyższych kryteriów (Optimal, Infeasible, Unbounded, InfeasibleOrUnbounded), ale nie została spełniona co najmniej 1 tolerancja. Niektóre rozwiązania pierwotne/podwójne/promieniowanie są wprawdzie nieco niemożliwe do realizacji, a jeśli problem był niemal optymalny, mogą one wskazywać na różnicę między najlepszym a najbardziej optymalnym celem. Użytkownicy mogą nadal wysyłać zapytania dotyczące rozwiązań podstawowych/podwójnych/promieni oraz statystyk rozwiązań, ale muszą sobie radzić z niedokładnością liczbową. |
TERMINATION_REASON_FEASIBLE |
Optymalizator osiągnął jakiś limit i zwrócone zostaje pierwsze wykonalne rozwiązanie. Szczegółowy opis rodzaju limitu znajdziesz w sekcji SolveResultProto.limit_detail. |
TERMINATION_REASON_NO_SOLUTION_FOUND |
Optymalizator osiągnął pewien limit i nie znalazł podstawowego wykonalnego rozwiązania. Szczegółowy opis rodzaju limitu znajdziesz w sekcji SolveResultProto.limit_detail. |
TERMINATION_REASON_NUMERICAL_ERROR |
Algorytm przestał działać, ponieważ napotkał nieodwracalny błąd numeryczny. Brak dostępnych informacji o rozwiązaniach. |
TERMINATION_REASON_OTHER_ERROR |
Algorytm przestał działać z powodu błędu, którego nie obejmuje żaden ze stanów. Brak dostępnych informacji o rozwiązaniach. |
LimitProto
Konkretny limit, który osiągnięto, gdy funkcja Solve() zatrzymuje się przed czasem przy funkcji TerminationReasonProto FEASIBLE lub NO_SOLUTION_FOUND.
Wartości w polu enum | |
---|---|
LIMIT_UNSPECIFIED |
Używana jako wartość null, gdy zakończenie nie występuje z powodu limitu (np. TERMINATION_REASON_OPTIMAL). |
LIMIT_UNDETERMINED |
Bazowe rozwiązanie do rozwiązywania problemów nie ujawnia, który limit został osiągnięty. |
LIMIT_ITERATION |
Algorytm iteracyjny zatrzymał się po wykonaniu maksymalnej liczby iteracji (np. iteracji typu jednokierunkowego lub powtórzenia bariery). |
LIMIT_TIME |
Algorytm przestał działać po upływie czasu obliczeń określonego przez użytkownika. |
LIMIT_NODE |
Algorytm gałęzi i powiązany został zatrzymany, ponieważ zbadał maksymalną liczbę węzłów w drzewie gałęzi i powiązanej. |
LIMIT_SOLUTION |
Algorytm przestał działać, ponieważ znalazł wymaganą liczbę rozwiązań. Jest to często stosowane w modelach MIP, aby rozwiązanie zwracało pierwsze realne rozwiązanie. |
LIMIT_MEMORY |
Algorytm przestał działać, ponieważ zabrakło pamięci. |
LIMIT_CUTOFF |
Rozwiązanie problemu zostało uruchomione z wartością odcięcia celu (np. ustawiona została wartość SolveParameters.cutoff_limit), co oznacza, że użytkownik nie życzył sobie rozwiązania gorszego niż wartość graniczna, a rozwiązanie stwierdziło, że nie ma rozwiązań o takiej samej jakości jak wartość graniczna. Zwykle nie podaje się żadnych dodatkowych informacji o rozwiązaniach. |
LIMIT_OBJECTIVE |
Algorytm przestał działać, ponieważ znalazł rozwiązanie lub wartość lepsza niż limit ustawiony przez użytkownika (patrz SolveParameters.objective_limit i SolveParameters.best_bound_limit). |
LIMIT_NORM |
Algorytm przestał działać, ponieważ norma iteracji stała się zbyt duża. |
LIMIT_INTERRUPTED |
Algorytm został zatrzymany z powodu sygnału przerwania działania lub żądania przerwania działania przez użytkownika. |
LIMIT_SLOW_PROGRESS |
Algorytm przestał działać, ponieważ nie mógł kontynuować pracy nad rozwiązaniem. |
LIMIT_OTHER |
Algorytm przestał działać z powodu limitu, którego nie obejmuje żaden z powyższych. Pamiętaj, że wartość LIMIT_UNDETERMINED jest używana, gdy nie można określić przyczyny, a wartość LIMIT_OTHER jest używana, gdy przyczyna jest znana, ale nie pasuje do żadnej z powyższych opcji. TerminationProto.detail może zawierać dodatkowe informacje na temat limitu. |
ProblemStatusProto
Stan wykonalności pierwotnego problemu i jego podwójny (lub podwójny ciągłe złagodzenie) zgodnie z deklaracją rozwiązania. Rozwiązanie nie musi zwracać certyfikatu dla twierdzenia (np. może twierdzić, że jest prawdziwa wykonalność, nie zwracając pierwotnego, wykonalnego rozwiązania). Ten połączony stan zapewnia kompleksowy opis twierdzeń rozwiązania problemu dotyczącego wykonalności i nieograniczenia rozwiązania. Przykład:
- Praktyczny stan dla problemów podstawowych i podwójnych wskazuje, że pierwsze jest możliwe i ograniczone, a najprawdopodobniej ma rozwiązanie optymalne (gwarantowane w przypadku problemów bez ograniczeń nieliniowych).
- podstawowy możliwy do realizacji, a podwójnie niewykonalny stan wskazuje, że pierwotny problem jest nieograniczony (tzn. ma arbitralnie dobre rozwiązania).
Uwaga: sam podwójny niemożliwy stan (tj. któremu towarzyszy nieokreślony status pierwotny) nie oznacza, że problem podstawowy jest nieograniczony, ponieważ oba problemy mogą być niewykonalne. Co więcej, chociaż stan podstawowy i podwójnie realistyczny może sugerować istnienie rozwiązania optymalnego, nie gwarantuje, że to rozwiązanie rzeczywiście znalazło takie optymalne rozwiązanie.
Zapis JSON |
---|
{ "primalStatus": enum ( |
Pola | |
---|---|
primalStatus |
Stan pierwszego problemu. |
dualStatus |
Stan podwójnego problemu (lub podwójnej relaksacji). |
primalOrDualInfeasible |
Jeśli funkcja ma wartość prawda, funkcja rozwiązywania problemów twierdzi, że podstawowy lub podwójny problem jest niemożliwy do zrealizowania, ale nie wie, który z nich (lub czy oba te problemy są niewykonalne). Może być prawdziwa tylko wtedy, gdy primal_problem_status = dual_problem_status = kUndetermined. Te dodatkowe informacje są często potrzebne, gdy wstępne przetwarzanie wskazuje, że nie ma optymalnego rozwiązania problemu (ale nie można określić, czy wynika to z niewykonalności, braku ograniczeń, czy z obu tych powodów). |
FeasibilityStatusProto
Stan wykonalności zadania określony przez rozwiązanie (nie jest wymagany zwracanie certyfikatu dla roszczenia).
Wartości w polu enum | |
---|---|
FEASIBILITY_STATUS_UNSPECIFIED |
Wartość zabezpieczenia reprezentująca brak stanu. |
FEASIBILITY_STATUS_UNDETERMINED |
Solver nie zgłasza praw do stanu. |
FEASIBILITY_STATUS_FEASIBLE |
Rozwiązanie twierdzi, że problem jest wykonalny. |
FEASIBILITY_STATUS_INFEASIBLE |
Rozwiązanie twierdzi, że problem jest niemożliwy do zrealizowania. |
ObjectiveBoundsProto
Granice przy optymalnej wartości celu.
Zapis JSON |
---|
{ "primalBound": number, "dualBound": number } |
Pola | |
---|---|
primalBound |
Twierdzi, że optymalna wartość jest równa lub większa (mniejsza przy zminimalizowaniu i większa w przypadku maksymalizacji) niż primalBound do pierwotnej tolerancji wykonalności (patrz ostrzeżenie poniżej): * pierwotna granica jest trudna (+inf w przypadku minimalizacji i -inf), gdy rozwiązanie nie twierdzi, że ma takie ograniczenie. * PrimalBound może być bliższa wartości optymalnej niż cel najlepszego pierwotnego rozwiązania. W szczególności wartość primalBound może być niezrozumiała nawet wtedy, gdy nie zostały zwrócone żadne pierwotne, realne rozwiązanie. Ostrzeżenie: dokładne twierdzenie jest takie, że istnieje podstawowe rozwiązanie, które: * jest możliwe z użyciem liczb (tj. możliwe do osiągnięcia tolerancji rozwiązań), a * ma obiektywną wartość „pierimalBound”. To rozwiązanie liczbowe może być trochę niewykonalne. W takim przypadku primalBound może być znacznie lepsze od wartości optymalnej. Przekształcenie pierwotnej tolerancji wykonalności na tolerancję na wartość primalBound nie jest proste, zwłaszcza gdy tolerancja wykonalności jest stosunkowo duża (np. w przypadku zastosowania PDLP). |
dualBound |
Twierdzi, że optymalna wartość jest równa lub mniejsza (większa w przypadku minimalizacji i mniejsza w przypadku maksymalizacji) niż w przypadku rozwiązania dualBound do podwójnej tolerancji wykonalności (patrz ostrzeżenie poniżej): * Podwójna granica jest trudna (-inf w przypadku minimalizacji i + maksymalizacji inf), gdy rozwiązanie nie twierdzi, że ma takie ograniczenie. Podobnie jak w przypadku primalBound ten problem może wystąpić w przypadku niektórych rozwiązań nawet wtedy, gdy zwracany jest parametr optymalny. Rozwiązania MIP zazwyczaj zgłaszają ograniczenia, nawet jeśli są nieprecyzyjne. * W przypadku ciągłych problemów funkcja DualBound może być bliższa wartości optymalnej niż cel najlepszego, ale możliwego do zrealizowania celu rozwiązania. W przypadku MIP jedna z pierwszych nieprostych wartości dla DualBound jest często optymalną wartością zrelaksowania LP MIP. * Wartość dualBound powinna być lepsza (mniejsza w przypadku minimalizacji i większa w celu maksymalizacji) niż primalBound do tolerancji rozwiązań (zobacz ostrzeżenie poniżej). Ostrzeżenie: * w przypadku ciągłych problemów dokładne twierdzenie polega na tym, że istnieje podwójne rozwiązanie, które: * jest możliwe pod względem liczbowym (czyli możliwe do osiągnięcia tolerancji rozwiązań), a * ma celową wartość dualBound. To realistyczne rozwiązanie liczbowe może być trochę niewykonalne. W takim przypadku wartość dualBound może być znacznie gorsza od wartości optymalnej i pierwotnej granicy. Podobnie jak w przypadku pierwszej sytuacji przełożenie podwójnej tolerancji wykonalności na tolerancję dla dualBound nie jest proste, zwłaszcza gdy tolerancja wykonalności jest względnie duża. Niektóre rozwiązania udostępniają jednak poprawioną wersję funkcji DualBound, która może być bezpieczniejsza liczbowo. Do tej poprawionej wersji można uzyskać dostęp za pomocą określonych danych wyjściowych rozwiązania (np. w przypadku PDLP: pdlp_output.confergence_information. corrected_dual_objective). * W przypadku rozwiązań MIP rozwiązanie dualBound może być powiązane z rozwiązaniem podwójnym zapewniającym ciągłą relaksację (np. relaksacją LP), ale często jest to złożona konsekwencja zastosowania tych rozwiązań i zwykle jest bardziej nieprecyzyjna niż granice zgłaszane przez te rozwiązania. |
SolutionProto
Zastosowanie rozwiązania zależy od rodzaju problemu i sposobu jego rozwiązania. Obecnie typowe wzorce to 1. Rozwiązania MIP zwracają tylko rozwiązanie pierwotne. 2. Rozwiązania proste LPD często zwracają podstawę oraz rozwiązania podstawowe i podwójne związane z tą podstawą. 3. Inne rozwiązania ciągłe zwracają często pierwotne i podwójne rozwiązanie połączone w postaci zależnej od rozwiązania.
Wymagania: * musisz ustawić co najmniej jedno pole; rozwiązanie nie może być puste.
Zapis JSON |
---|
{ "primalSolution": { object ( |
Pola | |
---|---|
primalSolution |
|
dualSolution |
|
basis |
|
PrimalSolutionProto
Rozwiązanie problemu optymalizacyjnego.
Na przykład: należy rozważyć prosty program liniowy: min. c * x s.t. A * x >= b x >= 0. Rozwiązanie podstawowe to przypisanie wartości do x. Jest to możliwe, jeśli spełnia powyższe warunki: A * x >= b oraz x >= 0. W komunikacie PrimalSolutionProto poniżej zmienna zmiennaValues to x, a celValue to c * x.
Zapis JSON |
---|
{ "variableValues": { object ( |
Pola | |
---|---|
variableValues |
Wymagania: * zmiennaValues.ids jest elementami zmiennej variablesProto.ids. * ZmienneValues.values muszą być wartościami skończonymi. |
objectiveValue |
Wartość obiektywna obliczana przez rozwiązanie źródłowe. Nie może to być wartość nieskończona ani wartość NaN. |
auxiliaryObjectiveValues |
Wartości celów dodatkowych obliczone przez rozwiązanie źródłowe. Klucze muszą być prawidłowymi identyfikatorami celów pomocniczych. Wartości nie mogą być nieskończone ani naN. Obiekt zawierający listę par |
feasibilityStatus |
Stan wykonalności rozwiązania zgodnie z jego bazowym rozwiązaniem. |
DualSolutionProto
Rozwiązanie dwóch problemów optymalizacyjnych.
Na przykład: uwzględnij podstawową parę liniową w podwójnej parze podstawowej: (Primal) (Podwójna) min c * x max b * y s.t. A * x >= b s.t. y * A + r = c x >= 0 y, r >= 0. Podwójnym rozwiązaniem jest para (y i r). Jest to wykonalne, jeśli spełnia ograniczenia opisane powyżej (Dual).
W poniższym komunikacie y oznacza wartość dualValues, r oznacza obniżoną cenę, a b * y jest wartością obiektywną.
Zapis JSON |
---|
{ "dualValues": { object ( |
Pola | |
---|---|
dualValues |
Wymagania: * dualValues.ids to elementy obiektu LinearConstraints.ids. * Wszystkie wartości dualValues.values muszą być skończone. |
reducedCosts |
Wymagania: * RedCosts.ids to elementy zmiennej VariablesProto.ids. * Zmniejszone koszty.wartości muszą być skończone. |
feasibilityStatus |
Stan wykonalności rozwiązania zgodnie z jego bazowym rozwiązaniem. |
objectiveValue |
|
PrimalRayProto
kierunek nieograniczonej eliminacji problemu optymalizacyjnego; a także zaświadczenie o niemożliwości realizacji 2 problemów optymalizacyjnych.
Na przykład: należy rozważyć prosty program liniowy: min. c * x s.t. A * x >= b x >= 0 Promień podstawowy to x, która spełnia następujące warunki: c * x < 0 A * x >= 0 x >= 0 Zwróć uwagę, że w przypadku praktycznych rozwiązań dowolna dodatnia wielokrotność promienia pierwotnego i tego rozwiązania jest nadal wykonalna i daje lepszą wartość obiektywną. Promień pierścienia potwierdza również niemożliwy do wykonania problem podwójnej optymalizacji.
W wiadomości PrimalRay poniżej zmienna zmiennaValues to x.
Zapis JSON |
---|
{
"variableValues": {
object ( |
Pola | |
---|---|
variableValues |
Wymagania: * zmiennaValues.ids jest elementami zmiennej variablesProto.ids. * ZmienneValues.values muszą być wartościami skończonymi. |
DualRayProto
kierunek nieograniczonego ulepszania podwójnej optymalizacji – problemu; a następnie zaświadczenie o pierwotnej niewykonalności.
Na przykład: uwzględnij podstawową parę liniową w podwójnej parze podstawowej: (Primal) (Podwójna) min c * x max b * y s.t. A * x >= b s.t. y * A + r = c x >= 0 y, r >= 0. Promień podwójny to para (y, r) zadowalająca: b * y > 0 y * A + r = 0 y, r >= 0 Zwróć uwagę, że dodanie dodatniej wielokrotności (y, r) do podwójnego wykonalnego rozwiązania zapewnia podwójną wykonalność i poprawia cel (udowodnienie, że podwójna jest nieograniczona). Promień podwójny pokazuje również, że pierwotny problem jest niewykonalny.
W poniższym komunikacie DualRay y oznacza dualValues, a r oznacza obniżone koszty.
Zapis JSON |
---|
{ "dualValues": { object ( |
Pola | |
---|---|
dualValues |
Wymagania: * dualValues.ids to elementy obiektu LinearConstraints.ids. * Wszystkie wartości dualValues.values muszą być skończone. |
reducedCosts |
Wymagania: * RedCosts.ids to elementy zmiennej VariablesProto.ids. * Zmniejszone koszty.wartości muszą być skończone. |
SolveStatsProto
Zapis JSON |
---|
{
"solveTime": string,
"problemStatus": {
object ( |
Pola | |
---|---|
solveTime |
Upłynęło: czas zegara ściennego mierzony za pomocą parametru math_opt, przybliżony czas w funkcji Solver::Solve(). Uwaga: nie dotyczy to pracy wykonanej przy tworzeniu modelu. Czas trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „ |
problemStatus |
Stany wykonalności problemów podstawowych i podwójnych. |
simplexIterations |
|
barrierIterations |
|
firstOrderIterations |
|
nodeCount |
|