0 / 0
資料の 英語版 に戻る
Decision Optimizationモデルの策定と実行:住宅建設スケジューリング
最終更新: 2024年11月21日
Decision Optimization Modeling Assistant スケジューリング・チュートリアル

このチュートリアルでは、 Modeling Assistant を使用して、住宅建設スケジューリング問題のモデルを定義、作成、および実行する方法を示します。 データを含む完成したモデルは、 DO サンプルにも用意されています。 Decision Optimization エクスペリメント・サンプル (Python、OPL、 Modeling Assistant)を参照してください。

問題

住宅建設プロジェクトのアクティビティーと下請事業者を計画してスケジュールを組む必要があります。 スケジュールは、特定の日付に開始する必要があります。 すべてのアクティビティー (石工、木工、配管など) をスケジュールする必要があり、各アクティビティーは指定順序に従って行う必要があります (例えば、屋根が完成するまで窓をはめ込むことはできないなど)。 下請事業者はそれぞれ、必要なアクティビティーの一部を実行できます。下請事業者のスキル・レベルはさまざまです。 スケジュールでは、すべてのアクティビティーを確実にスケジュールした状態で建設プロジェクトの最適な (最も早い) 終了時期を判断し、各アクティビティーに割り当てる下請事業者を決定する必要があります。 また、このプロジェクトにおいて下請事業者のスキル・レベルを最適化する方法を知りたいと考えています。

データ

このプロジェクトには、以下のスプレッドシートに示すデータが用意されています。 アクティビティーごとに、完了までに必要な期間、事前に行う必要のあるアクティビティー、およびそのアクティビティーを実施する資格がある対応可能な下請事業者候補があります。

「アクティビティー」、「期間 (日数)」、「先行アクティビティー」、「可能な下請事業者」というタイトルの列を持つデータの住宅建設スプレッドシート

説明のため、ここではアクティビティーは 10 件、下請事業者は 3 名しか示されていません。 Decision Optimization を使用すると、データを簡単に変更して、より大きなデータ・セットで同じ問題を解決することができます。

また、アクティビティーごとの各下請事業者の専門知識レベルに関するデータもあります。 数値が大きいほど、下請事業者の専門知識も高いということになります。 下請事業者のスキル・レベルがゼロの場合は、そのタスクに割り当ててはなりません。 以下の表はこのスプレッドシートの一部を示します。

一部の行と、すべての列「アクティビティー」、「下請事業者」、および「スキル・レベル」を示すアクティビティー・スプレッドシート

このプロジェクトに対応可能な下請事業者の名前 (Joe、Jack など) が含まれた表もあります。

この例のデータ・ファイルの入手

この例で使用されているデータ・ファイルは、 DO-samplesにあります。 通常、ファイルはデータ資産としてプロジェクトに既に保管されているか、マシン上にローカルに保管されています。 ただし、説明のために、モデルを自分で作成できるようにするために、この例では、まずデータ・ファイルをマシンにダウンロードしてから、作成したばかりのプロジェクトにインポートします。 HouseConstructionSchedulingDO-samplesを参照してください。

  1. すべての DO サンプル をマシンにダウンロードして解凍します。
  2. プロジェクトを開きます。
  3. データ・ペインを開くには、 「データの追加 +」をクリックします。
  4. ここにデータ・ファイルをドロップするか、アップロードするファイルを参照しますを選択します。
  5. ダウンロードした DO-samples を参照して、 datasets フォルダー内の house_activity.csvhouse_expertise.csv、および house_subcontractor.csv を見つけます。
  6. 「開く」をクリックします。 ファイルは、プロジェクト内のデータ資産としてアップロードされます。

シナリオ の作成

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

シナリオを作成するには、以下のようにします。

  1. プロジェクトを開くか、空のプロジェクトを作成します。
  2. 「資産」 タブを選択します。
  3. モデルの処理 セクションで 「新規資産」>「最適化問題の解決」 を選択します。
  4. 開いた「 新規 Decision Optimization エクスペリメント 」ウィンドウで、名前を入力します。
  5. まだwatsonx.aiRuntimeサービスをプロジェクトに関連付けていない場合は、実験用のデプロイメントスペースを選択する前に、まずAdd aMachine Learningservice を選択してサービスを選択または作成する必要があります。
  6. 「新規デプロイメント・スペース」をクリックし、名前を入力して、 「作成」 をクリックします (またはドロップダウン・メニューから既存のスペースを選択します)。
  7. 作成」 をクリックします。 モデルとともに「Scenario 1」が作成されるので、「Scenario 1」で作業します。

シナリオ では、解決するデータと最適化モデルの設計の組み合わせを指定します。 データとモデルの設計のさまざまなバリアントを使用して、さまざまなシナリオを作成できます。

データ準備

エクスペリメント UI が開き、 「データの準備 (Prepare data)」 ビューが表示されます。 プロジェクト内のデータ・ファイルがデータ・ペインに表示されます。 (必要に応じて、 データ・ペイン・アイコン をクリックしてデータ・ペインを開きます。) 3 つの住宅のサンプル・ファイルを選択して、「インポート」をクリックします。

インポートしたデータ・ファイルが、 「データの準備」 ビューに表として表示されます。 以下の画像は、 シナリオでインポートされたデータ・ファイル house_activity.csvhouse_expertise.csv、および house_subcontractor.csv を示しています。

アクティビティー、下請事業者、専門知識の 3 つの表を表示するデータ・ビューを作成します。

表をスクロールすることにより、すべてのデータを表示できます。 また、特定のデータ表の「表を完全モードで開く」アイコンをクリックすることでも、すべてのデータを表示できます。 データ値を表で直接編集することも、フル・モードで編集することもできます。

Modeling Assistant を選択します。

  1. サイドバーの モデルの作成 をクリックすると、ポップアップ・ウィンドウが表示され、モデルの作成方法 ( Modeling Assistant を使用して補助モードを使用するか、 Python、OPL、LP (CPLEX)、または CPO コードでモデルを作成またはインポートするかを尋ねられます。
  2. Modeling Assistantの選択

意思決定ドメイン の定義

「モデル」 ビュー: 問題の 意思決定ドメイン を選択します。 この場合、「スケジューリング (Scheduling)」を選択します。 現在定義されている 意思決定ドメイン は、「 スケジューリング」、「 リソース割り当て」、 選択と割り振り および 供給と需要 ドメイン

  1. ドメインを選択すると、データをスケジューリング概念の 「タスク」 および 「リソース」にマップするためのポップアップ・ウィンドウが表示されます。 タスクは、期間にわたって計画およびスケジュールするものを指します。 スケジュールするタスクを少なくとも 1 つ定義する必要があります。 この例では、タスクは、石工などの建設アクティビティーです。 リソースは、人材、機械、機器など、タスクで使用するあらゆるものにすることができます。 ここでのリソースは下請事業者です。
  2. 「TASKS」の下で、 タスクの選択 をクリックし、ドロップダウン・リストから house_activity を選択します。 次に、「リソース」の下で リソースの選択 をクリックし、 house_subcontractorを選択します。 選択できるタスクおよびリソースの名前は、インポートしたデータから取得されます。 この例では、アクティビティーと下請事業者をマップするだけですが、モデルで必要であれば、他のタスクとリソースのマッピングを追加することもできます。 マッピングの上にカーソルを移動して削除アイコンを選択することで、マッピングを削除できます。
  3. 続行をクリックします。

タスクでのリソースの使用方法

ウィンドウでは、スケジュールするタスクごとに、以下の 3 つのオプションがあります。

  • 割り当てを行ってリソースを使用する (Use resources with assignment):すべてのオプションを選択し、特定の下請事業者にアクティビティーを割り当てることを選択できます。 これは、開始時期、期間、優先順位などを考慮した最適な順序の住宅建設アクティビティーのスケジュールを取得し、かつその、アクティビティーには指名した下請事業者を割り当てることを意味します。 デフォルトでは、このオプションが選択されています。
  • 割り当てなしでリソースを使用: リソースを使用して、 割り当て中 ... をクリアすることができます。 特定の契約社員をアクティビティーに割り当てないことを選択するには、チェック・ボックスを選択します。 これは、開始時期、期間、優先順位などを考慮した、最適な順序の住宅建設アクティビティーのスケジュールを取得することを意味します。 取得したスケジュールで検討することができる下請け業者の数とタイプ (例えば、3 つの配管工、2 つの大工、...) が必要です。 )、 ただし、特定の人 (例えば、Joe、Jack、Jim) に割り当てる必要はありません。

    リソースを使用する場合、割り当ての有無を問わず、さらに時間ベースの人数制約をモデルに追加することもできます。 例えば、任意の時点で並行して依頼できる下請事業者の数に対する制限や、特定の期間における対応可能な特定の下請事業者、あるいは対応可能なすべての下請事業者の数に対する制限を指定することもできます。

    割り当てなしのスケジューリングの例については、 DO-samplesBridgeScheduling を参照してください。

  • リソースなしで続行する: すべてのオプションをクリアし、「Continue」をクリックすることで、すべてのリソース制限を無視する タスクをスケジュールできます。 これは、開始時期、期間、優先順位などを考慮するが、下請事業者については考慮せずに、最適な順序の住宅建設アクティビティーのスケジュールを取得することを意味します。

この例では、次のようになります。

  1. すべてのオプション (リソースの使用 ... が選択されたデフォルト設定を選択します 割り当て中 ...) 選択して 続行します。 をクリックします

    これで、解決すべき問題が、簡潔なステートメントで設計されます。

  2. 「完了」をクリックします。

    「モデル」 ビューに戻ります。 「インテントの編集 (Edit intent)」(鉛筆) アイコンをクリックし、マッピングおよびスケジューリング・オプションを再定義することで、いつでも問題の定義を再編集できます。

モデルの設計

これで、求解する問題が指定されました。 Modeling Assistant は、このモデル・ ビューで部分的に完成した定式化を提供します。 「目的」 ペインと 「制約」 ペインには、実行するモデルが含まれています。 「モデルに追加」 ペインには、モデルの設計に含めることができる追加の提案が含まれています。 ウィンドウをサイズ変更した場合、「モデルに追加 (Add to model)」ペインが「目標 (Objectives)」ペインおよび「制約」ペインの下部に表示されることがあります。

モデルは、達成する目標 (最大または最小) と満たす必要がある制約で構成されます。 今回のようなスケジューリングの問題では、目標は、最適なスケジュールを得ることです。 この場合の最適とは、すべてのアクティビティーが完了するまでの時間を最小限に抑えることです。 (できる限り迅速に住宅建設を完了させてコストを削減したいと考えています。) この目標と、いくつかの標準的なスケジューリングの制約がモデルに自動的に追加されています。 また、「目標」検索フィールドを使用して、目標と制約を検索することもできます。

「目的関数と制約 (Objective function and constraints)」ペイン、および「可能な提案 (possible suggestions)」ペインを示すモデル・ビュー

このスケジューリング制約により、以下が保証されます。
  • 建設プロジェクトに定義した開始時期からスケジューリングが実行される
  • 各下請事業者は一度に 1 つのタスクにのみ割り当てることができる
  • 各アクティビティーに 1 人の下請事業者が割り当てられる
  • すべてのアクティビティーがスケジュールに含まれている (つまり、どのアクティビティーもスケジュールから省くことはできない)
  • 各アクティビティーの期間が遵守される

制約は異なる順序で表示されることがあります。 割り当てについてのすべてのスケジューリング問題に自動的に追加される制約もあります。 これにより、スケジュールされているアクティビティー中に従事できない期間がある下請事業者の割り当てを受け入れるか、拒否できるようになります。 この例では、従事できない期間は考慮されないため、この制約はデフォルトの表示のままになります。

一部の制約には詳細が含まれており、各行にある矢印をクリックすることで詳細の表示と非表示を切り替えることができます。 制約の横にあるバーは、追加する必要がある値または定義があることを示しています。 項目を追加するには、下線付きの条件をクリックして入力するか、ドロップダウン・リストから選択します。モデルを実行するには前もってモデルを完成させておく必要がありますが、これを行う前に、このセクションで後述のとおり最初にシナリオを複製してコピーを保存しておきます。

シナリオのモデル・ ビュー で、 Modeling Assistantの横にある「置換」アイコン 「置換」アイコン (矢印) をクリックすると、 Modeling Assistant を使用して Python または OPL でモデルを作成するか、 Python notebook でモデルを作成するか、既存のモデルをインポートするかを選択する画面に戻ります。 この段階でモデルの置換を選択した場合、現在のモデルは上書きされ、変更が失われます。 進行中の現在の作業のコピーを保持する場合は、モデルを変更する前に新規シナリオを作成してください。

シナリオの複製

このモデルのコピーを保持するには、以下のようにしてこのシナリオのコピーを作成します。

  1. シナリオ・ペインが開かれていない場合は、「Scenarios」アイコンをクリックします。
  2. 「Scenario 1」の横にある 3 つのドットをクリックし、「Duplicate」を選択します。
  3. 新しいシナリオの名前 (例えば、Scenario 2) を入力し、「Create」をクリックします。 Scenario 2 で作業を続行します。

モデルの完成

強調表示されている制約を完成させます。 以下のように、制約に含まれている各アクティビティーの期間およびスケジュール開始を定義します。
  1. 必要であれば、この行にある矢印をクリックして期間の制約を展開し、完全な定義を表示します。 強調表示されている definition を選択し、列名 Duration in daysを選択します。 デフォルトの期間単位「expressed in default duration unit」が制約の末尾に追加されます。 これを変更するには、「default duration unit」をクリックして「days」を選択します。ただし、デフォルト単位は「days」です。 また、「Settings」パネルで、デフォルトの期間単位を変更し、日時の定義方法をカスタマイズすることもできます。 期間の制約が完成したら、行は強調表示されなくなります。

    完了した期間の制約

  2. 「Schedule start」制約で、表示された日付をクリックします。 次に、日付 (または日付と時刻) を入力し、ドロップダウン・メニューからこれを選択して、現在表示されている日付を置き換えます。 時刻を指定せずに日付を入力した場合、デフォルトの時刻は 00:00 になります。

値を入力すると、制約は強調表示されなくなります。 ただし、モデルはまだ完成していません。 各アクティビティーがそれより前に行う必要があるアクティビティーの後にのみ開始できるようにするため、スケジュールでタスクの優先順位を考慮するようにする必要がある場合があります。 この制約は後から追加します。

モデルにさらに目標および制約がある場合は、「Find in my objectives and constraints」検索フィールドを使用して、それらを参照またはフィルタリングできます。

ステートメントの横にある 3 つの垂直ドットをクリックすることで、モデル内の目標または制約のいずれかを「無効にする」「削除」することができます。 このメニューでは、ステートメントの順序を上下に移動して再編成することもできます。また、ステートメントを複製することもできます。

モデルが完成したら、あるいは強調表示されている目標および制約がなくなったら、モデルを実行して、モデルの目標および制約に基づいて最適なスケジュールを決定するソリューションを検出できます。

モデルの実行

提案の横にある 設定 タブをクリックして、 モデルの作成 表示 でモデルの解決時間制限を変更できます。 この例では、デフォルトの制限を使用します。 その他のパラメーターは、 「実行構成」 パラメーターを使用して設定することもできます (詳しくは、 Decision Optimization エクスペリメントでのシナリオの実行パラメーターの構成 を参照してください)。

シナリオ 2 で、 「実行」 ボタンをクリックします。 初期目的値が検出されると、 「結合された目的」「求解の進行状況」 グラフに表示されます。 最適なソリューションを得る前にこの実行を終了する場合は、「停止」をクリックして終了できます。 最適解が見つかると、 「解の探索」 ビュー が開きます。

ソリューション

実行が完了すると、 ソリューションの探索 ビューで結果を確認できます。 また、 「エンジン統計」 または 「ログ」 をクリックして、ソリューション・グラフを表示し、ログ・ファイルを調べることもできます。 ソリューションの探索 ビュー の最初のタブには、目的 (複数ある場合は複数の目的) とその値および重みが表示されます。 「ソリューション表 (Solution tables)」タブでは、最適なスケジュールおよび下請事業者へのアクティビティーの割り当てが示されます。

ソリューション・テーブルを csv ファイルとしてダウンロードすることもできます。

モデル内に競合する制約がある場合、これらは、モデルを解決するために必要な「緩和 (Relaxations)」とともに「競合 (Conflicts)」タブに表示されます。

視覚化 ビューで、 「ガント」 をクリックして、ソリューションをガント・チャートとして表示します。

新規シナリオ (異なるモデル、同じデータ) の作成

モデルが解決され、下請事業者が割り当てられた最適なアクティビティー・スケジュールが得られましたが、アクティビティーの優先順位も割り当てを行う際の下請事業者のスキル・レベル・データもまだ考慮していません。 シナリオでは、複数のモデルおよびデータを分析して比較できます。

まず、以下のように、制約を追加した新規シナリオを調べます

モデルの ビューでは、 「提案」 ペインに他の目標と制約が表示されます。 これらをクリックすることでモデルに追加できます。 リストされていないその他の提案を表示するには、検索フィールドへの入力を開始し、Enter キーまたは最新表示ボタンを押します。 その後、表示される提案を参照し、その中から追加できます。

優先順位制約をモデルに追加して、アクティビティー間に時間のずれが生じないようにするには、以下のようにします。

  1. Scenario 2 を複製し、Scenario 3 という名前を付けます。 次に、シナリオ・ペインを閉じます。
  2. モデル・ ビューの「提案」ペインで、自然言語 activity after preceding activities(例えば、検索フィールドに) を入力し、Enter をクリックします。
  3. 提案の新規リストにある「Each house_activity starts after the end of preceding activities」をクリックして制約に追加します。

    新規優先順位制約がモデルの設計に表示されます。

  4. モデル (Scenario 3) を再実行し、新しいソリューションを確認します。 このソリューションを、この制約なしでモデルを解決した Scenario 2 で得たソリューションと比較できます。 ソリューションを比較するには、 「シナリオ・ペインを開く」 ペインを開き、各シナリオをクリックします。 視覚化 ビュー でガントをクリックして、各シナリオのガント・チャートとして表示されているソリューションを比較することもできます。
次に、以下のように、目標および制約をさらに追加した新しいシナリオを調べます
  1. Scenario 3 を複製し、Scenario 4 という名前を付けます。 次に、シナリオ・ペインを閉じます。

    アクティビティーへの割り当てで下請事業者のスキル・レベルを最大化するために、以下のようにします。

  2. モデルの ビューで、提案検索フィールドに overall quality と入力して、以下の目的を見つけてモデルに追加します。

    Maximize overall quality of house_subcontractor-house_activity assignments according to table of assignment values

    下線付きの < 割り当て値の表> をクリックし、 house_expertiseを入力または選択します。

    新しい目標は「Maximize overall quality of house_subcontractor-house_activity assignments according to house_expertiseになりました。 この目標を展開し、タスクに「Activity」、リソースに「Subcontractor」、値に「Skill level」(表の列) を選択して、定義を完成させます。

    これで、2 つの目標が設定されました。 目標を同等に考慮するのか、異なる重み付けを使用して考慮するのかを決定できます。 隣接するスライダーを使用して、各目標の重み付けを増減できます。 2 つのスライダーを 5 のままにすると、2 つの目標は均一に重み付けされます。 目標のスケール係数を追加することもできます。 この例では、スケール係数を 1 のままにします。 詳しくは、 ソリューションに表示される重み付けとスケール係数を参照してください。

  3. 実行が許可されたタスクのみを下請事業者が引き受けるようにするために、新しい制約を追加します。 提案を入力します (例: subcontractor must be one of possible subcontractors)。 「Display by category」「on」に設定して (スイッチにチェック・マークが表示されます)、フィルター「Assignment」を選択し、割り当てに関連した提案を表示することもできます。
  4. フィルタリングされた提案から、制約「For each house_subcontractor-house_activity assignment, assigned house_subcontractors must be one of Possible Subcontractors of house_activity」を探して追加します。
  5. モデルを実行します。

これで、新しいソリューションに下請事業者の新しい割り当てが表示されるようになりました。

モデル・ ビュー の詳細

「Suggestions」フィルター

提案をフィルタリングして目標および制約を見つけることもできます。 「Display by category」「on」に設定すると (スイッチにチェック・マークが表示されます) 、関心がある多様なカテゴリーを選択して、提案のリストにフィルターを適用するためのペインが開きます。 フィルターを使用すると、表示される提案の数が減ります。 検索フィールドの横にある表示アイコンをクリックすると、無効になっている式を含め、スケジューリング・ドメインで使用可能なすべての式が表示されます。 それぞれの式の情報アイコンの上にカーソルを移動すると、説明が表示されます。 無効になっている項目については、式自体の上にカーソルを移動すると、このモデルでそれが無効になっている理由の説明も表示されます。

「設定」 タブ

モデル・ ビュー の「設定」タブには、編集可能なさまざまなスケジューリング・パラメーターと最適化パラメーターがリストされます。 この例では、デフォルトの期間単位、最適化実行時間、および日時フォーマットが示されています。 ここで、ご使用のデータに合わせて、カスタマイズした日時フォーマットを指定できます。

「Data Schema」タブ

「データ・スキーマ」タブの 「ビュー」 には、 Modeling Assistant によってインポートされ、スケジューリング問題の解決に必要な入力データから推定されたすべての情報が表ごとにリストされます。 スキーマ内の特定の項目を編集して、モデルを更新できます。暗黙指定されるモデル変更を受け入れるか、編集内容をキャンセルするかを選択するように求めるプロンプトが出されます。 これは、データのデバッグのために、専門家ユーザーに役立ちます。 例えば、ID を含む列が数値型であると推論された場合は、主キーとして使用できるように、この列を名義型に変更すると役立つことがあります。

「決定」 タブ

このタブを表示するには、 設定 タブの 意思決定の視覚化と編集trueに設定します。 「決定 (Decisions)」タブに、モデルで定義されている決定 (インテント) が表示されます。 ここでカスタムの決定を追加することもできます。 詳しくは、 カスタム決定の定義を参照してください。

シナリオからの Python ノートブック の生成

Modeling Assistantを使用して作成したモデルから Python notebook を生成する場合は、以下のようにします。

  1. シナリオ・ペインが開かれていない場合は、「Scenarios」アイコンをクリックします。
  2. シナリオの 1 つの横にある 3 つのドットをクリックし、「ノートブックの生成 (Generate notebook)」を選択します。
  3. ノートブック の名前を入力し、 「生成」をクリックします。

このモデルの Python ノートブック がプロジェクト内に作成されます。

「概要」 ペイン

「概要」 ペインで、すべてのシナリオの要約情報を一目で確認できます。 シナリオを選択して 3 つのドットをクリックすることにより、この ビューで選択したシナリオに対して、複製、名前変更、 Python ノートブックの生成、シナリオのエクスポート、デプロイメントのためのシナリオの保存などのアクションを実行できます。 このペインの構成方法について詳しくは、「 Decision Optimization エクスペリメントでのすべてのシナリオの表示 」を参照してください。

可視化ビュー

視覚化ビュー では、任意のシナリオから表示する内容をカスタマイズできます。 入力データおよびソリューションを表示し、メモを追加できます。 例えば、この住宅のチュートリアルでは、最適なソリューション・スケジュールのガント・チャートを表示できます。

表ウィジェットおよびグラフ・ウィジェットを使用してこれらのビューのレイアウトをカスタマイズできます。 メモ、表、またはグラフについて、見出しを追加したり、背景色などのプロパティーを変更したりすることができます。 折れ線グラフ、棒グラフなど、さまざまなタイプのグラフを選択できます。 これらのグラフでデータを集約する方法を定義し、 calculate プロパティーを使用して、グラフで特定のデータ値を表現する方法を定義できます。

表またはグラフ・ウィジェットを選択した場合、一部の入力データを使用して、デフォルト・インスタンスが表示されます。 このオブジェクトのコンテンツとフォーマットを変更するには、鉛筆アイコンをクリックし、グラフィカル・エディターで、または json ファイルを編集してウィジェットを編集します。

この ビュー を使用して、シナリオを視覚的に比較できます。

詳しくは、 Decision Optimization エクスペリメントの視覚化ビューを参照してください。

生成 AI の検索と回答
これらの回答は、製品資料の内容に基づいて、 watsonx.ai のラージ言語モデルによって生成されます。 詳細