Package google.research.optimization.v1

Indice

Ottimizzazione

Un'API One Platform che espone una serie di risolutori di ottimizzazione per problemi di ricerca operativa di alto livello. MOE:striscia_di_inizio

DesignShippingNetwork

rpc DesignShippingNetwork(DesignShippingNetworkRequest) returns (DesignShippingNetworkResponse)

Risolve il problema di progettazione e pianificazione della rete di spedizione di linea (LSNDSP) dal DesignShippingNetworkRequest specificato.

L'LSNDSP è un complesso problema di ottimizzazione che cerca di trovare la progettazione e la pianificazione ottimali di una rete di spedizione di linea. L'obiettivo è ridurre al minimo il costo totale di gestione della rete e soddisfare il più possibile la domanda di merci tra i porti.

L'LSNDSP può essere suddiviso in due sottoproblemi principali: progettazione della rete e pianificazione. Il sottoproblema di progettazione della rete determina l'insieme di porte servite dalla rete, il numero di navi da impiegare su ciascuna rotta e le rotte che dovranno seguire. Il sottoproblema di pianificazione determina gli orari delle navi, tenendo conto del tempo necessario per navigare tra i porti, del tempo necessario per caricare e scaricare le merci e la richiesta di trasporto di merci tra i porti.

In parole semplici, l'LSNDSP è il problema di decidere quali porti servire, quante navi usare e come pianificare le navi in modo da ridurre al minimo il costo di gestione della rete e massimizzare al contempo le entrate per soddisfare la domanda di carico. Un sottocomponente complesso dell'LSNDSP è il routing delle merci, che determina quali richieste soddisfare e quali percorsi assegnare alle merci per massimizzare le entrate.

SolveMathOptModel

rpc SolveMathOptModel(SolveMathOptModelRequest) returns (SolveMathOptModelResponse)

Risolvi il modello di input e restituisce il risultato immediatamente. Da utilizzare quando non hai bisogno di callback, di incrementalità e di monitorare l'avanzamento di una risoluzione.

SolveShiftGeneration

rpc SolveShiftGeneration(SolveShiftGenerationRequest) returns (SolveShiftGenerationResponse)

Risolve un problema di generazione dei turni da un dato SolveShiftGenerationRequest generando dei turni da determinati modelli di turni al fine di coprire la domanda dei dipendenti.

SolveShiftScheduling

rpc SolveShiftScheduling(SolveShiftSchedulingRequest) returns (SolveShiftSchedulingResponse)

Risolve un problema di pianificazione dei turni fisso da un determinato SolveShiftSchedulingRequest assegnando i dipendenti a turni in modo che le loro preferenze di pianificazione siano massimizzate e le violazioni dei vincoli di pianificazione siano ridotte al minimo.

DesignShippingNetworkRequest

La richiesta contiene un'istanza dell'LSNDSP e deve contenere un insieme di porte, una serie di candidati per le gambe, una serie di classi di navi e una serie di richieste di prodotti da soddisfare.

Campi
request_id

string

ID problema o richiesta.

solver_parameters

SolverParameters

Parametri del risolutore.

ports[]

Port

Elenco di possibili porte da chiamare nei servizi navale. La richiesta deve contenere solo gli ID delle porte presenti in questo elenco.

leg_candidates[]

LegCandidate

Elenco di potenziali candidati alla tappa da aggiungere ai servizi navale. La richiesta deve contenere solo gli ID dei candidati alle gambe presenti in questo elenco.

vessel_classes[]

VesselClass

Elenco di classi di imbarcazioni per eseguire servizi su imbarcazioni. Nota che tutte le navi della stessa classe sono completamente intercambiabili. La richiesta deve contenere solo gli ID delle classi delle imbarcazioni presenti in questo elenco.

commodity_demands[]

CommodityDemand

Elenco delle potenziali richieste di materie prime (ad es. container) che devono essere soddisfatte dai servizi navale.

vessel_services[]

VesselService

È possibile fornire una rete di servizi navale validi (in genere lo stato attuale della rete) da utilizzare come punto di partenza per l'ottimizzazione.

DesignShippingNetworkResponse

La risposta contiene la soluzione dell'istanza LSNDSP passata nella richiesta. Contiene una rete valida di servizi navale e percorsi di domanda delle materie prime. La domanda totale di materie prime attraversando ogni tratto non può superare la capacità della classe della nave che gestisce questa tratta. Tieni presente che non disporre di servizi per navi senza domanda soddisfatta è sempre una soluzione fattibile al problema di progettazione e pianificazione della rete di spedizione di linea.

Campi
request_id

string

L'ID della richiesta a cui è associata questa risposta.

vessel_services[]

VesselService

Rete di servizi navale. Per ciascuna classe di navi, il numero totale di navi utilizzate non può superare il numero disponibile di navi per questa classe.

commodity_demand_paths[]

CommodityDemandPath

Elenco di tutti i percorsi di domanda delle materie prime attraverso cui viene evasa la domanda positiva delle materie prime. Tieni presente che alcuni ID domanda di materie prime potrebbero non essere inclusi se non viene evasa nessuna domanda. In alternativa, la domanda di materie prime può essere parzialmente soddisfatta. Per ogni domanda di materie prime, la quantità totale soddisfatta non può superare la domanda totale. Infine, i percorsi commodity_demand_path dipendono da vessel_services (vedi la definizione di CommodityDemandPath).

SolveMathOptModelRequest

Richiesta di una risoluzione remota unaria in MathOpt.

Campi
solver_type

SolverTypeProto

Campo facoltativo. Tipo di risolutore per risolvere numericamente il problema. Tieni presente che se un risolutore non supporta una funzionalità specifica del modello, la procedura di ottimizzazione non avrà esito positivo.

model

ModelProto

Obbligatoria. Una rappresentazione matematica del problema di ottimizzazione da risolvere.

parameters

SolveParametersProto

Campo facoltativo. Parametri per controllare una singola risoluzione. Il parametro allow_output viene gestito in modo specifico. Per i risolutori che supportano i callback dei messaggi, se il criterio viene impostato su true, il server registra un callback dei messaggi. I messaggi risultanti verranno restituiti in SolveMathOptModelResponse.messages. Per altri risolutori, impostare abilita_output su true genererà un errore.

model_parameters

ModelSolveParametersProto

Campo facoltativo. Parametri per controllare una singola risoluzione specifici del modello di input (consulta SolveParametersProto per i parametri indipendenti dal modello).

SolveMathOptModelResponse

Risposta per una risoluzione remota unaria in MathOpt.

Campi
result

SolveResultProto

Descrizione dell'output della risoluzione del modello nella richiesta.

messages[]

string

Se è stato utilizzato SolveParametersProto.enable_output, questo conterrà messaggi di log per i risolutori che supportano i callback dei messaggi.

SolveShiftGenerationRequest

Richiesta per risolvere il problema della generazione dei turni. Le regole per la generazione delle variazioni sono descritte in ogni ShiftTemplate. È possibile generare più variazioni nella risposta da un singolo modello ShiftTemplate. I cambiamenti generati e selezionati dal risolutore devono rispettare le regole delineate in ShiftTemplate e coprire la domanda specificata dei dipendenti.

Campi
solver_config

SolverConfig

Campo facoltativo. Parametri del risolutore.

shift_templates[]

ShiftTemplate

Obbligatoria. Insieme di modelli di turni che specificano le regole per generare i turni.

employee_demands[]

EmployeeDemand

Obbligatoria. Domanda totale dei dipendenti che i turni generati da shift_templates devono coprire.

SolveShiftGenerationResponse

Risposta per il problema relativo alla generazione di turni. Se il valore solution_status restituito è SOLVED, viene restituito un insieme di variazioni valide generate dal risolutore in employee_schedules. Per una pianificazione dei turni valida, vengono mantenute le seguenti proprietà:

  1. Ogni variazione generata in employee_schedules è conforme alle regole specificate nei ShiftTemplate corrispondenti.
  2. Ogni evento selezionato in ogni turno rispetta le regole specificate nei ShiftTemplate.Event corrispondenti.
  3. Il numero totale di dipendenti assegnati all'insieme di turni generati dallo stesso modello ShiftTemplate non è superiore a maximum_employee_count di quel modello.
  4. L'insieme di dipendenti assegnati copre la domanda a intervalli specifici.

Campi
solution_status

ShiftGenerationSolutionStatus

Stato della soluzione restituita. Se solution_status non è SOLVED, il campo employee_schedules sarà vuoto.

employee_schedules[]

EmployeeSchedule

Insieme di turni generati dal risolutore insieme al numero di dipendenti assegnati a ciascun programma.

demand_coverage_violations[]

DemandCoverageViolation

Violazioni della copertura della domanda in base al valore employee_counts assegnato nel criterio employee_schedules specificato. I valori employee_demands specificati nella richiesta vengono aggregati: se due intervalli employee_demand si sovrappongono, la domanda viene sommata per la parte sovrapposta dell'intervallo.

SolveShiftSchedulingRequest

Richiesta per l'API Workload Programming. La richiesta specifica almeno un insieme di dipendenti, un insieme di turni, un insieme di possibili ruoli che un dipendente può svolgere e una serie di requisiti di copertura. I requisiti di copertura specificano, in un arco di tempo, il numero di dipendenti necessari per ricoprire ciascun ruolo. Ai dipendenti assegnati a un turno viene anche assegnato un (e solo uno) ruolo per quel turno e i dipendenti non possono essere assegnati a due turni sovrapposti. Consulta la SolveShiftSchedulingResponse di seguito per ulteriori dettagli su ciò che rende valida un'assegnazione basata su turni.

È possibile specificare ulteriori vincoli di pianificazione per ciascun dipendente per limitare ulteriormente il problema. A tutti i vincoli di pianificazione e ai requisiti di copertura viene assegnato un livello di priorità (OBBLIGATORIO, ALTO, MEDIO, BASSO). Tutti i vincoli con livello di priorità PRIORITY_MANDATORY devono essere soddisfatti dal risolutore. Il risolutore può violare i vincoli con qualsiasi altra priorità, ma queste violazioni vengono ridotte al minimo in ordine di priorità. Consulta l'enumerazione Priority per ulteriori dettagli su come vengono gestiti i livelli di priorità per ogni vincolo.

Il risolutore cercherà di massimizzare i valori di ShiftPreference.preference per ogni dipendente rispetto ai vincoli specificati. Il risolutore non violerà un vincolo per soddisfare più preferenze; violerà un vincolo solo se l'assegnazione di pianificazione non è fattibile con i vincoli specificati.

Nota sull'ora: tutti gli orari del problema vengono specificati utilizzando il messaggio DateTime. Questo messaggio include un campo TimeZone. Se non diversamente specificato dall'utente, il fuso orario è UTC. I messaggi DateTime devono essere specificati solo fino ai minuti; tutti i secondi e i nano vengono ignorati.

Campi
request_id

string

ID problema o richiesta.

solve_parameters

SolveParameters

Parametri per controllare una singola soluzione del problema.

employees[]

Employee

Tutti i dipendenti disponibili da pianificare.

shifts[]

Shift

Tutti i turni formano il programma.

coverage_requirements[]

CoverageRequirement

Requisiti di copertura per l'intero orizzonte di pianificazione. Queste norme specificano il numero di dipendenti che devono svolgere ciascun ruolo o possedere una competenza, durante una finestra temporale o un elenco di ID turni. Tutti i requisiti di copertura devono essere specificati con finestre temporali o un elenco di ID turni (ma non entrambi). Le finestre temporali (se presenti) per i requisiti di copertura non possono sovrapporsi per ogni località specifica. Il livello di priorità predefinito per ciascuno di questi vincoli è PRIORITY_MANDATORY per i requisiti dei ruoli e PRIORITY_LOW per i requisiti delle competenze. Per ulteriori dettagli, consulta l'enum Priority.

role_ids[]

string

Elenco di tutti i ruoli possibili nella forza lavoro. Ogni dipendente deve avere almeno un ruolo che può essere assegnato per un turno. Un ruolo si riferisce a uno specifico incarico durante un turno (ad es. infermiere iscritto, dirigente chef, cameriere e così via). Quando un dipendente è assegnato a un turno, viene anche assegnato a un singolo ruolo specifico.

skill_ids[]

string

Elenco di tutte le possibili competenze nella forza lavoro. Una competenza si riferisce a qualifiche aggiuntive che un dipendente può avere e che non riguardano un lavoro specifico assegnabile (ad esempio, certificazioni, lingue parlate e così via). Questo elenco può essere vuoto. Quando un dipendente viene assegnato a un turno, deve soddisfare tutte le competenze necessarie per quel turno.

location_ids[]

string

Elenco di tutte le posizioni possibili per l'insieme di turni nella programmazione. Questo elenco può essere vuoto. Specificare luoghi diversi può essere utile quando, ad esempio, un direttore infermieristico vuole pianificare molti infermieri in unità diverse dell'ospedale o, per un altro esempio, un direttore di hotel vuole programmare dipendenti in più hotel.

budget_requirements[]

BudgetRequirement

Specifica del budget per il problema di pianificazione. Il livello di priorità predefinito per ciascuno di questi requisiti è PRIORITY_LOW. Per ulteriori dettagli, consulta l'enum Priority.

assignments_hint[]

ShiftAssignment

Sposta le assegnazioni da usare come soluzione provvisoria (ovvero suggerimento per soluzione) al problema di pianificazione. I suggerimenti per i compiti vengono ignorati se il compito è in contraddizione con un turno non assegnabile o una richiesta di pianificazione.

SolveShiftSchedulingResponse

Risposta per l'API forza lavoro di pianificazione. Per ogni risposta, shift_assignments sarà vuoto se il valore solution_status restituito è NOT_SOLVED_DEADLINE_EXCEEDED o INFEASIBLE. Se il valore solution_status restituito è OPTIMAL o FEASIBLE, viene restituito un compito valido in shift_assignments. Per un'assegnazione di turni valida, vengono mantenute le seguenti proprietà:

  1. Ogni ID dipendente è contenuto nell'insieme di dipendenti indicato nella richiesta.
  2. Ogni ID ruolo assegnato al dipendente è contenuto nella serie di ID ruolo del dipendente specificato.
  3. Ogni ID variazione è contenuto nell'insieme di variazioni specificato nella richiesta.
  4. Ogni ID turno non è uno degli ID turno non assegnabili per un determinato dipendente.
  5. A un dipendente non verranno mai assegnati due turni che si sovrappongono.
  6. Per la pianificazione specificata, non viene violata nessuna delle limitazioni o delle richieste con livello di priorità PRIORITY_MANDATORY.

Campi
request_id

string

L'ID della richiesta a cui è associata questa risposta.

solution_status

SolutionStatus

Stato della soluzione restituita. Se la soluzione non è FATTIBILE o OTTIMA, gli altri campi di questo protocollo potrebbero essere vuoti. Se lo stato è NOT_SOLVED_DEADLINE_EXCEEDED, il limite di tempo è stato raggiunto senza trovare una soluzione fattibile o senza determinare se esiste una soluzione fattibile. Le richieste potrebbero non essere fattibili se i vincoli del livello di priorità OBBLIGATORIO non possono essere soddisfatti.

shift_assignments[]

ShiftAssignment

Elenco di tutti i compiti. Ogni ShiftAssignment specifica un dipendente, il turno a cui è assegnato e il ruolo che deve svolgere per quel turno.

status_message

string

Se solution_status non è ottimale, questo campo può contenere informazioni aggiuntive sul risolutore.