この Decision Optimization Modeling Assistant の例では、 Python を使用する拡張カスタム制約の作成方法を示します。
始める前に
- 要件
- Decision Optimization モデルを編集して実行するには、以下の前提条件が必要です。
- 管理者 または エディター の役割
- プロジェクト内で 管理者 役割または 編集者 役割を持っている必要があります。 共有プロジェクトの閲覧者は、エクスペリメントのみを表示できますが、変更したり実行したりすることはできません。
- デプロイメント・スペース
- Decision Optimization エクスペリメント に関連付けられた デプロイメント・スペース が必要です。 Decision Optimization エクスペリメント の作成時に、 デプロイメント・スペース を選択できます。
Decision Optimization Modeling Assistant で任意の Decision Optimization ・モデルを開きます。 この例では、 DO-samples にある Shift
Assignment サンプルを使用し、 AssignmentWithOnCallDuties シナリオを使用します。 この同じサンプルの AssignmentWithCustomRule シナリオでは、このカスタム制約が既に追加された完了モデルが示されています。
このタスクについて
Modeling Assistant は、問題ドメインに応じた多くの制約の提案を提供します。これらはカスタマイズできます。 ただし、特定の領域に対して事前定義されている制約を超えて制約を表現することもできます。 これは、 Python DOcplex を使用するより高度なカスタム制約を使用して実現できます。 この例は、これらを作成する方法を示しています。
このビデオでは、この資料の コンセプト とタスクを視覚的に学習する方法を紹介します。 Decision Optimization 実験 に例をロードした後、ビデオに従うことができます。
ビデオに関する特記事項: このビデオの一部の小さなステップおよびグラフィカル・ステップは、ご使用のプラットフォームとは異なる場合があります。 ユーザー・インターフェースも頻繁に改善されます。
IBM Data Science コミュニティー・ページにある Python を使用したカスタム制約については、この 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)
- 実行 ボタンをクリックして、カスタム制約でモデルを実行します。
実行が完了すると、 ソリューションの探索 ビュー に結果が表示されます。