이 Decision Optimization Modeling Assistant 예제는 Python을 사용하는 고급 사용자 정의 제약조건을 작성하는 방법을 보여줍니다.
시작하기 전에
- 요구사항
- Decision Optimization 모델을 편집하고 실행하려면 다음 전제조건이 있어야 합니다.
- 관리 또는 편집자 역할
- 프로젝트에서 관리 또는 편집자 역할이 있어야 합니다. 공유 프로젝트의 뷰어는 실험을 볼 수만 있고 수정하거나 실행할 수는 없습니다.
- watsonx.ai 런타임 서비스
- 프로젝트와 연결된 watsonx.ai 런타임 서비스가 있어야 합니다. Decision Optimization 실험을 작성할 때 하나를 추가할 수 있습니다.
- 배치 공간
- Decision Optimization 실험과 연관된 배치 공간이 있어야 합니다. Decision Optimization 실험을 작성할 때 배치 영역을 선택할 수 있습니다.
Decision Optimization Modeling Assistant에서 Decision Optimization 모델을 여십시오. 이 예에서는 DO 샘플에서 사용 가능한 Shift
Assignment
샘플을 사용하고 AssignmentWithOnCallDuties
시나리오를 사용합니다. 이 동일한 샘플의 AssignmentWithCustomRule
시나리오는 이 사용자 정의 제약조건이 이미 추가된 완료된 모델을 표시합니다.
이 태스크에 대한 정보
Modeling Assistant 는 사용자 정의할 수 있는 문제점 도메인에 대한 많은 제한조건 제안사항을 제공합니다. 그러나 지정된 도메인에 대해 사전 정의된 제한조건 이상으로 제한조건을 표현할 수 있습니다. Python DOcplex를 사용하는 고급 사용자 정의 제한조건을 사용하여 이를 수행할 수 있습니다. 이 예제에서는 이를 작성하는 방법에 대해 설명합니다.
이 비디오는 이 문서의 개념 및 태스크를 학습하기 위한 시각적 방법을 제공합니다. Decision Optimization 실험 에서 예제를 로드한 후 비디오를 관심 대상으로 등록할 수 있습니다.
비디오 면책사항: 이 비디오의 일부 사소한 단계 및 그래픽 단계는 플랫폼과 다를 수 있습니다. 사용자 인터페이스도 자주 개선됩니다.
이 Decision Optimization 블로그 에서 IBM Data Science 커뮤니티 페이지에 있는 Python 을 사용한 사용자 정의 제한조건에 대한 자세한 정보를 읽으십시오.
프로시저
새 고급 사용자 정의 제한조건을 작성하려면 다음을 수행하십시오.
- 열린 Modeling Assistant 모델의 모델 빌드 보기 에서 제안사항 분할창을 보십시오. 검색 필드 옆에 있는 모두 표시 아이콘을 클릭하십시오. 그러면 모든 제안사항이 카테고리별로 표시되어 나열됩니다. 기타 섹션을 펼쳐 새 사용자 정의 제한조건을 찾은 후 클릭하여 모델에 추가하십시오. 또는 모든 제안 및 카테고리를 표시하지 않고 검색 필드에 custom 등을 입력하여 동일한 제안을 찾고 클릭하여 모델에 추가할 수 있습니다.
새 사용자 정의 제한조건이 모델에 추가됩니다.
- 클릭 제한조건을 입력하십시오. 데이터, 개념, 변수 또는 매개변수에 [대괄호]를 사용합니다. 을(를) 입력하고 지정하려는 제한조건을 입력하십시오. 예를 들어, No [employees] has [onCallDuties] for more than [2] consecutive days 를 입력하고 Enter를 누르십시오.
사용자 정의할 기본 매개변수(
parameter1, parameter2, parameter3
)와 함께 스펙이 표시됩니다. 이러한 매개변수는 이 사용자 정의 규칙을 구현하는 Python 함수로 전달됩니다.
- 스펙에서 기본 매개변수를 편집하여 보다 의미 있는 이름을 지정하십시오. 예를 들어, 매개변수를
employees, on_call_duties
및 limit
로 변경하고 Enter를 클릭하십시오.
- 함수 이름을 클릭하고 함수의 이름을 입력하십시오. 예를 들어, limitConsecutiveAssignments 를 입력하고 Enter를 클릭하십시오.
함수 이름이 추가되고
Python 편집 단추가 표시됩니다.
- Python편집 단추를 클릭하십시오.
사용자 정의 규칙을 구현하기 위해 편집할 수 있는 Python 코드를 표시하는 새 창이 열립니다. 다음과 같이 코드에서 사용자 정의된 매개변수를 볼 수 있습니다.
코드는 사용자 정의 규칙에서 정의한 대로 해당 데이터 프레임 및 테이블 컬럼 이름으로 문서화됩니다. 이 한계는 숫자 값으로 문서화되지 않습니다.
- 선택사항: 이 창에서 Python 코드를 직접 편집할 수 있지만 여기서 사용하기 전에 노트북에서 코드를 편집하고 디버그하는 것이 유용할 수 있습니다. 이 경우에는 지금 이 창을 닫고 시나리오 분할창에서 세 개의 세로 점을 펼치고 사용자 정의 규칙을 포함하는 이 시나리오에 대해 노트북 생성 을 선택하십시오. 이 노트북의 이름을 입력하십시오.
편집 및 디버그할 준비가 된 프로젝트 자산에 노트북이 작성됩니다. 편집한 후에는 모델링 지원 프로그램의 이 Python 편집 창에 사용자 정의 함수의 코드를 다시 복사할 수 있습니다.
- Modeling Assistant 사용자 정의 규칙 Python 창에서 Python 코드를 편집하십시오.
예를 들어, 다음과 같이 Python에서 연속 일에 대한 규칙을 정의할 수 있습니다.
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)
- 실행 단추를 클릭하여 사용자 정의 제한조건으로 모델을 실행하십시오.
실행이 완료되면 솔루션 탐색 보기에서 결과를 볼 수 있습니다.