この Decision Optimization Modeling Assistant の例は、 Pythonを使用する拡張カスタム制約を作成する方法を示しています。
開始前に
- 要件
- Decision Optimization モデルを編集して実行するには、以下の前提条件が必要です。
- 管理者 または 編集者 の役割
- プロジェクト内で 管理者 または 編集者 の役割を持っている必要があります。 共有プロジェクトのビューアーは、エクスペリメントのみを表示できますが、それらを変更したり実行したりすることはできません。
- watsonx.aiランタイムサービス
- プロジェクトに関連付けられたwatsonx.aiRuntimeサービスが必要です。 Decision Optimization エクスペリメントを作成するときに、テストを追加できます。
- デプロイメント・スペース
- Decision Optimization エクスペリメントに関連付けられたデプロイメント・スペースが必要です。 Decision Optimization エクスペリメントを作成するときに、デプロイメント・スペースを選択できます。
Decision Optimization Modeling Assistantの Decision Optimization モデルを開きます。 この例では、 DO-samplesにある Shift
Assignment
サンプルを使用し、 AssignmentWithOnCallDuties
シナリオを使用します。 この同じサンプルの AssignmentWithCustomRule
シナリオは、このカスタム制約が既に追加されている完成したモデルを示しています。
このタスクについて
Modeling Assistant は、カスタマイズ可能な問題領域に対する多くの制約提案を提供します。 ただし、特定の領域に対して事前定義されている制約を超えて制約を表現することもできます。 これを実現するには、 Python DOcplexを使用する、より高度なカスタム制約を使用します。 この例は、これらを作成する方法を示しています。
このビデオは、この資料の概念とタスクを学習するための視覚的な方法を提供します。 Decision Optimization エクスペリメント にサンプルをロードした後、ビデオに従うことができます。
ビデオの特記事項: このビデオのいくつかのマイナー・ステップとグラフィカル・ステップは、ご使用のプラットフォームとは異なる場合があります。 ユーザー・インターフェースも頻繁に改善されます。
Python を使用したカスタム制約について詳しくは、 IBM Data Science コミュニティー・ページにあるこの Decision Optimization ブログ を参照してください。
手順
新しい拡張カスタム制約を作成するには、以下のようにします。
- 開いている 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 コードを直接編集できますが、ここで使用する前にノートブックでコードを編集およびデバッグすると便利な場合があります。 この場合は、ここでこのウィンドウを閉じ、 「シナリオ」 ペインで 3 つの垂直ドットを展開して、カスタム・ルールを含むこのシナリオの 「ノートブックの生成」 を選択します。 このノートブックの名前を入力します。
ノートブックがプロジェクト資産に作成され、編集およびデバッグできるようになります。 編集、実行、およびデバッグが完了したら、カスタム関数のコードを Modeling Assistant のこの 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)
- カスタム制約を使用してモデルを実行するには、 「実行」 ボタンをクリックします。
実行が完了すると、 ソリューションの探索 ビューに結果が表示されます。