Questo esempio di Decision Optimization Modeling Assistant mostra come creare vincoli personalizzati avanzati che utilizzano Python.
Prima di iniziare
- Requisiti
- Per modificare ed eseguire i modelli Decision Optimization , è necessario disporre dei seguenti prerequisiti:
- Ruoli Admin o Editor
- È necessario disporre di ruoli Admin o Editor nel progetto. I visualizzatori di progetti condivisi possono solo visualizzare gli esperimenti, ma non possono modificarli o eseguirli
- servizio di runtimewatsonx.ai
- È necessario disporre di un servizio watsonx.ai Runtime associato al progetto. È possibile aggiungerne uno quando si crea un esperimento Decision Optimization .
- Spazio di distribuzione
- Devi avere uno spazio di distribuzione associato al tuo esperimento Decision Optimization . È possibile scegliere uno spazio di distribuzione quando si crea un esperimento Decision Optimization .
Aprire qualsiasi modello Decision Optimization in Decision Optimization Modeling Assistant. Questo esempio utilizza l'esempio Shift
Assignment
, disponibile in DO - samplese utilizza lo scenario AssignmentWithOnCallDuties
. Lo scenario AssignmentWithCustomRule
in questo stesso esempio mostra il modello completato con questo vincolo personalizzato già aggiunto.
Informazioni su questa attività
Modeling Assistant fornisce molti suggerimenti sui vincoli per il dominio dei problemi che possono essere personalizzati. Si potrebbe, tuttavia, voler esprimere vincoli oltre quelli predefiniti per i domini indicati. Puoi farlo utilizzando vincoli personalizzati più avanzati che utilizzano Python DOcplex. Questo esempio illustra come si possono creare questi.
Questo video fornisce un metodo visivo per apprendere i concetti e le attività in questa documentazione. Dopo aver caricato l'esempio nel tuo esperimento Decision Optimization puoi seguire il video.
Disclaimer video: alcuni passi minori e passaggi grafici in questo video potrebbero differire dalla tua piattaforma. Anche l'interfaccia utente viene spesso migliorata.
Scopri di più in questo blogDecision Optimization sui vincoli personalizzati con Python disponibile nella pagina della community di IBM Data Science.
Procedura
Per creare un nuovo vincolo personalizzato avanzato:
- Nel Crea modello vista del tuo modello Modeling Assistant aperto, guarda il riquadro Suggerimenti . Fare clic sull'icona Visualizza tutto accanto al campo di ricerca. Tutti i suggerimenti vengono quindi visualizzati per categoria. Espandere la sezione Altri per individuare Nuovo vincolo personalizzatoe fare clic su di esso per aggiungerlo al modello. In alternativa, senza visualizzare tutti i suggerimenti e le categorie, è possibile immettere, ad esempio, custom nel campo di ricerca per individuare lo stesso suggerimento e fare clic su di esso per aggiungerlo al modello.
Un nuovo vincolo personalizzato viene aggiunto al tuo modello.
- Clicca Inserire il tuo vincolo. Utilizzare [ staffe] per dati, concetti, variabili o parametri ed inserire il vincolo che si desidera specificare. Ad esempio, immettere No [employees] has [onCallDuties] for more than [2] consecutive days e premere Invio.
La specifica viene visualizzata con i parametri predefiniti (
parameter1, parameter2, parameter3
) per personalizzare. Questi parametri verranno passati alla funzione Python che implementa questa regola personalizzata.
- Modifica i parametri predefiniti nella specifica per dare loro nomi più significativi. Ad esempio, modificare i parametri in
employees, on_call_duties
e limit
e fare clic su enter.
- Fare clic sul nome funzione e inserire un nome per la funzione. Ad esempio, immettere limitConsecutiveAssignments e fare clic su Invio.
Viene aggiunto il nome funzione e compare un pulsante
Modifica Python .
- Fare clic sul pulsante Modifica Python .
Si apre una nuova finestra che mostra il codice Python che è possibile modificare per implementare la tua regola personalizzata. È possibile visualizzare i parametri personalizzati nel codice come segue:
Si noti che il codice è documentato con corrispondenti frame di dati e nomi di colonne di tabella come si è definito nella regola personalizzata. Il limite non è documentato in quanto si tratta di un valore numerico.
- Optional: è possibile modificare il codice Python direttamente in questa finestra, ma potrebbe essere utile modificare e sottoporre a debug il proprio codice in un notebook prima di utilizzarlo qui. In questo caso, chiudere questa finestra per ora e nel riquadro Scenario , espandere i tre puntini verticali e selezionare Generare un notebook per questo scenario che contiene la regola personalizzata. Inserire un nome per questo notebook.
Il notebook viene creato nei tuoi asset di progetto pronti per la modifica e il debug. Una volta modificato, eseguito e sottoposto a debug, è possibile copiare nuovamente il codice per la funzione personalizzata in questa finestra Modifica Python in Modeling Assistant.
- Modificare il codice Python nella finestra Modifica Python di Modeling Assistant regola personalizzata.
Ad esempio, è possibile definire la regola per i giorni consecutivi in Python come segue:
def limitConsecutiveAssignments(self, mdl, employees, on_call_duties, limit):
global helper_add_labeled_cplex_constraint, helper_get_index_names_for_type, helper_get_column_name_for_property
print('Adding constraints for the custom rule')
for employee, duties in employees.associated(on_call_duties):
duties_day_idx = duties.join(Day) # Retrieve Day index from Day label
for d in Day['index']:
end = d + limit + 1 # One must enforce that there are no occurence of (limit + 1) working consecutive days
duties_in_win = duties_day_idx[((duties_day_idx['index'] >= d) & (duties_day_idx['index'] <= end)) | (duties_day_idx['index'] <= end - 7)]
mdl.add_constraint(mdl.sum(duties_in_win.onCallDutyVar) <= limit)
- Fare clic sul pulsante Esegui per eseguire il tuo modello con il tuo vincolo personalizzato.
Quando l'esecuzione viene completata è possibile vedere i risultati in Esplorare la soluzione vista.