0 / 0
資料の 英語版 に戻る
Decision Optimization Modeling Assistant モデルのPythonで高度なカスタム制約を作成する
最終更新: 2024年11月21日
Decision Optimization Modeling Assistant の Python を使用した拡張カスタム制約の作成

この Decision Optimization Modeling Assistant の例は、 Pythonを使用する拡張カスタム制約を作成する方法を示しています。

開始前に

要件
Decision Optimization モデルを編集して実行するには、以下の前提条件が必要です。
管理者 または 編集者 の役割
プロジェクト内で 管理者 または 編集者 の役割を持っている必要があります。 共有プロジェクトのビューアーは、エクスペリメントのみを表示できますが、それらを変更したり実行したりすることはできません。
watsonx.aiランタイムサービス
プロジェクトに関連付けられたwatsonx.aiRuntimeサービスが必要です。 Decision Optimization エクスペリメントを作成するときに、テストを追加できます。
デプロイメント・スペース
Decision Optimization エクスペリメントに関連付けられたデプロイメント・スペースが必要です。 Decision Optimization エクスペリメントを作成するときに、デプロイメント・スペースを選択できます。

Decision Optimization Modeling AssistantDecision Optimization モデルを開きます。 この例では、 DO-samplesにある Shift Assignment サンプルを使用し、 AssignmentWithOnCallDuties シナリオを使用します。 この同じサンプルの AssignmentWithCustomRule シナリオは、このカスタム制約が既に追加されている完成したモデルを示しています。

このタスクについて

Modeling Assistant は、カスタマイズ可能な問題領域に対する多くの制約提案を提供します。 ただし、特定の領域に対して事前定義されている制約を超えて制約を表現することもできます。 これを実現するには、 Python DOcplexを使用する、より高度なカスタム制約を使用します。 この例は、これらを作成する方法を示しています。

このビデオは、この資料の概念とタスクを学習するための視覚的な方法を提供します。 Decision Optimization エクスペリメント にサンプルをロードした後、ビデオに従うことができます。

ビデオの特記事項: このビデオのいくつかのマイナー・ステップとグラフィカル・ステップは、ご使用のプラットフォームとは異なる場合があります。 ユーザー・インターフェースも頻繁に改善されます。

Python を使用したカスタム制約について詳しくは、 IBM Data Science コミュニティー・ページにあるこの Decision Optimization ブログ を参照してください。

手順

新しい拡張カスタム制約を作成するには、以下のようにします。

  1. 開いている Modeling Assistant モデルの モデルの作成 ビュー で、 「提案」 ペインを確認します。 検索フィールドの横にある 「すべて表示」 アイコンをクリックします。 すべての提案がカテゴリー別にリストされます。 「その他」 セクションを展開して 「新規カスタム制約」を見つけ、それをクリックしてモデルに追加します。 あるいは、すべての提案とカテゴリーが表示されていない状態で、例えば、検索フィールドに custom と入力して同じ提案を見つけ、それをクリックしてモデルに追加することもできます。
    新しいカスタム制約がモデルに追加されます。

    モデル内の新しいカスタム制約。ユーザーが入力する要素が強調表示されます。

  2. 制約を入力します。 データ、概念、変数、またはパラメーターに [大括弧] を使用する を入力し、指定する制約を入力します。 例えば、 No [employees] has [onCallDuties] for more than [2] consecutive days と入力して Enter キーを押します。
    この仕様は、カスタマイズするためのデフォルト・パラメーター (parameter1, parameter2, parameter3) とともに表示されます。 これらのパラメーターは、このカスタム・ルールを実装する Python 関数に渡されます。

    カスタム制約が展開され、デフォルトのパラメーターと関数名が表示されます。

  3. 仕様内のデフォルト・パラメーターを編集して、より意味のある名前を付けます。 例えば、パラメーターを employees, on_call_dutiesおよび limit に変更し、Enter をクリックします。
  4. 関数名をクリックし、関数の名前を入力します。 例えば、 limitConsecutiveAssignments と入力して Enter キーを押します。
    関数名が追加され、 Python の編集 ボタンが表示されます。

    カスタマイズされたパラメーターと「 Python の編集」ボタンを表示するカスタム・ルール。

  5. 「編集」 Python ボタンをクリックします。
    新しいウィンドウが開き、カスタム・ルールを実装するために編集できる Python コードが表示されます。 カスタマイズしたパラメーターは、以下のようにコード内で確認できます。

    カスタマイズするブロックを示す Python コード

    コードは、カスタム・ルールで定義したとおりに、対応するデータ・フレームと表の列名で文書化されていることに注意してください。 これは数値であるため、制限は文書化されていません。
  6. オプション: このウィンドウで Python コードを直接編集できますが、ここで使用する前にノートブックでコードを編集およびデバッグすると便利な場合があります。 この場合は、ここでこのウィンドウを閉じ、 「シナリオ」 ペインで 3 つの垂直ドットを展開して、カスタム・ルールを含むこのシナリオの 「ノートブックの生成」 を選択します。 このノートブックの名前を入力します。
    ノートブックがプロジェクト資産に作成され、編集およびデバッグできるようになります。 編集、実行、およびデバッグが完了したら、カスタム関数のコードを Modeling Assistant のこの Python の編集 ウィンドウにコピーして戻すことができます。
  7. 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)
  8. カスタム制約を使用してモデルを実行するには、 「実行」 ボタンをクリックします。
    実行が完了すると、 ソリューションの探索 ビューに結果が表示されます。