<一覧に戻る

ブラックボードパターン

ブラックボードパターンは、複数の独立したコンポーネントが協力して問題を解決するためのデザインパターンです。このパターンは、知識を共有する「黒板」を中心に、異なるアルゴリズムや戦略を持つコンポーネントが集まり、協力して情報を処理します。主に、人工知能やエキスパートシステムの分野で使用されることが多いです。

ブラックボードパターンの構成要素

ブラックボードパターンには以下の主要な構成要素があります。

  1. ブラックボード: 共有されたデータのストレージ。ここに情報が追加され、コンポーネントはこの情報を利用します。
  2. ワーカー (またはエキスパート): 特定のタスクを処理するための独立したコンポーネント。ブラックボードにアクセスし、情報を取得または更新します。
  3. コントローラー: ワーカーの実行を管理し、どのワーカーがいつ実行されるかを制御します。

サンプルコード

以下は、ブラックボードパターンをPythonで実装した簡略化した例です。この例では、気象データを処理する複数のワーカーが存在します。

ブラックボードの実装

class BlackBoard:
    def __init__(self):
        self.data = {}

    def update_data(self, key, value):
        self.data[key] = value

    def get_data(self, key):
        return self.data.get(key, None)

解説

  • BlackBoard クラスは、共有データを格納するためのクラスです。
  • update_data メソッドでデータを更新し、get_data メソッドでデータを取得します。

ワーカーの実装

class TemperatureWorker:
    def __init__(self, blackboard):
        self.blackboard = blackboard

    def process(self):
        # 温度データを計算・更新
        temperature = 25  # 例として固定値
        self.blackboard.update_data('temperature', temperature)
        print(f'Temperature updated to {temperature}°C')


class HumidityWorker:
    def __init__(self, blackboard):
        self.blackboard = blackboard

    def process(self):
        # 湿度データを計算・更新
        humidity = 60  # 例として固定値
        self.blackboard.update_data('humidity', humidity)
        print(f'Humidity updated to {humidity}%')

解説

  • TemperatureWorkerHumidityWorker クラスは、異なる種類のデータを処理するワーカーです。
  • 各ワーカーは process メソッドを持ち、ブラックボードにデータを更新します。

コントローラーの実装

class Controller:
    def __init__(self, blackboard):
        self.blackboard = blackboard
        self.workers = [
            TemperatureWorker(blackboard),
            HumidityWorker(blackboard)
        ]

    def run(self):
        for worker in self.workers:
            worker.process()

解説

  • Controller クラスは、ワーカーを管理する役割を果たします。
  • run メソッドは、すべてのワーカーの process メソッドを呼び出します。

実行例

以下のコードを実行して、ブラックボードパターンの動作を確認できます。

if __name__ == "__main__":
    blackboard = BlackBoard()
    controller = Controller(blackboard)
    controller.run()

    # ブラックボードのデータを表示
    print("Blackboard Data:", blackboard.data)

解説

  • if __name__ == "__main__": ブロックで、プログラムのエントリーポイントを定義します。
  • BlackBoardController をインスタンス化し、コントローラーを実行します。
  • 最後に、ブラックボードに格納されたデータを表示します。

まとめ

ブラックボードパターンは、異なるコンポーネントが協力して問題を解決するための強力な手法です。このパターンを使用することで、モジュール性と拡張性を高めることができます。サンプルコードを通じて、ブラックボードパターンの基本的な実装を理解できたでしょう。実際のアプリケーションに応じて、ワーカーの数や種類を増やしたり、ブラックボードのデータ構造を拡張したりすることができます。

出力結果: