W przykładzie Decision Optimization Modeling Assistant przedstawiono sposób tworzenia zaawansowanych ograniczeń niestandardowych, które korzystają z języka Python.
Zanim rozpoczniesz
Otwórz dowolny model Decision Optimization w programie Decision Optimization Modeling Assistant. W tym przykładzie użyto przykładu Shift
Assignment
, który jest dostępny w sekcji DO-samples, i użyto scenariusza AssignmentWithOnCallDuties
. Scenariusz AssignmentWithCustomRule
w tym samym przykładzie przedstawia kompletny model z już dodanym ograniczeniem niestandardowym.
O tym zadaniu
Modeling Assistant udostępnia wiele sugestii dotyczących ograniczeń dla danej domeny problemu, które można dostosować. Użytkownik może jednak chcieć wyrazić ograniczenia wykraczające poza te, które są predefiniowane dla danych domen. Można to osiągnąć, korzystając z bardziej zaawansowanych ograniczeń niestandardowych, które korzystają z języka Python DOcplex. W tym przykładzie pokazano, w jaki sposób można je utworzyć.
Zastrzeżenie dotyczące filmu wideo: Niektóre niewielkie kroki i kroki graficzne w tym filmie wideo mogą różnić się od platformy. Interfejs użytkownika jest również często ulepszany.
Więcej informacji na ten blogDecision Optimization o niestandardowych ograniczeniach w języku Python można znaleźć na stronie społeczności IBM Data Science.
Uwaga: Aby można było tworzyć i uruchamiać modele optymalizacji, do projektu musi być dodana zarówno usługa
Machine Learning , jak i obszar wdrażania, który jest powiązany z
eksperymentem:
- Dodaj plik Usługa systemu Machine Learning do projektu. Tę usługę można dodać na poziomie projektu (patrz sekcja Tworzenie instancji usługi Watson Machine Learning) lub podczas tworzenia nowego Decision Optimization eksperyment: należy kliknąć opcję Dodaj usługę systemu Machine Learning, wybrać lub utworzyć Nowa usługa, kliknąć opcję Powiąż, a następnie zamknąć okno.
- Powiąż obszar wdrażania z Decision Optimization eksperyment (patrz sekcja Obszary wdrażania). Obszar wdrażania można utworzyć lub wybrać podczas pierwszego tworzenia nowego Decision Optimization eksperymentu: kliknij opcję Utwórz obszar wdrażania, wprowadź nazwę obszaru wdrażania, a następnie kliknij opcję Utwórz. W przypadku istniejących modeli można również utworzyć lub wybrać obszar w panelu informacji Przegląd .
Procedura
Aby utworzyć nowe zaawansowane ograniczenie niestandardowe:
- W oknie Budowanie modelu Widok otwartego modelu Modeling Assistant sprawdź panel Sugestie . Jeśli wybrano opcję Wyświetl według kategorii , rozwiń sekcję Inne , aby znaleźć pozycję Nowe ograniczenie niestandardowe, a następnie kliknij ją, aby dodać ją do modelu. Alternatywnie, bez wyświetlania kategorii, można wprowadzić na przykład łańcuch custom w polu wyszukiwania, aby znaleźć tę samą sugestię, a następnie kliknąć ją, aby dodać ją do modelu.
Do modelu zostanie dodane nowe ograniczenie niestandardowe.
- Kliknij opcję Wprowadź ograniczenie. Użyj [ nawiasów] dla danych, pojęć, zmiennych lub parametrów i wprowadź ograniczenie, które chcesz określić. Na przykład wpisz No [employees] has [onCallDuties] for more than [2] consecutive days i naciśnij klawisz Enter.
Specyfikacja jest wyświetlana z parametrami domyślnymi (
parameter1, parameter2, parameter3
), które można dostosować. Te parametry zostaną przekazane do funkcji Python , która implementuje tę regułę niestandardową.
- Zmodyfikuj parametry domyślne w specyfikacji, aby nadać im bardziej znaczące nazwy. Na przykład zmień parametry na
employees, on_call_duties
i limit
, a następnie kliknij przycisk Enter.
- Kliknij nazwę funkcji i wprowadź jej nazwę. Na przykład wpisz limitConsecutiveAssignments i kliknij przycisk Enter.
Nazwa funkcji zostanie dodana i zostanie wyświetlony przycisk
Edytuj Python .
- Kliknij przycisk Edytuj Python .
Zostanie otwarte nowe okno zawierające kod Python , który można edytować w celu zaimplementowania reguły niestandardowej. Dostosowane parametry można wyświetlić w kodzie w następujący sposób:
Należy zauważyć, że kod jest udokumentowany przy użyciu odpowiednich ramek danych i nazw kolumn tabeli zgodnie z definicją w regule niestandardowej. Limit nie jest udokumentowany, ponieważ jest to wartość liczbowa.
- Opcjonalnie: kod Python można edytować bezpośrednio w tym oknie, ale przed użyciem go w tym miejscu może okazać się przydatne edytowanie i debugowanie kodu w notatniku. W takim przypadku należy teraz zamknąć to okno i w panelu Scenariusz rozwinąć trzy pionowe kropki i wybrać opcję Wygeneruj notatnik dla tego scenariusza, który zawiera regułę niestandardową. Wprowadź nazwę tego notatnika.
Notatnik jest tworzony w zasobach aplikacyjnych projektu, które są gotowe do edycji i debugowania. Po zakończeniu edycji, uruchomieniu i debugowaniu można skopiować kod funkcji niestandardowej z powrotem do tego okna Edycja Python w Modeling Assistant.
- Edytuj kod Python w oknie Modeling Assistant reguła niestandardowa Edytuj Python .
Na przykład można zdefiniować regułę dla kolejnych dni w języku Python w następujący sposób:
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)
- Kliknij przycisk Uruchom , aby uruchomić model z ograniczeniem niestandardowym.
Po zakończeniu wykonywania można wyświetlić wyniki w oknie Poznaj rozwiązanie Widok.