フェーズ4: 実践演習マニュアル

1. 概要

このフェーズでは,これまでに学んだ知識を総動員して,独自の目的関数(適応度関数)を設計し,実際の設計課題に取り組みます.


課題1: 安全性制約下でのコスト最小化

課題内容

安全率2.0以上という制約を満たしながら,建設コストを最小化する設計を見つけよ.ただし,最大評価回数は300回に制限される.

実装方法

1. PSO設定の調整

pso_config.pyでパラメータを設定:

📊 探索における評価回数
# ========================================
# 課題1用の設定(合計300評価)
# ========================================
N_PARTICLES = 20   # 粒子数
MAX_ITER = 15      # 最大繰り返し数
# 20粒子 × 15反復 = 300評価

# または
# N_PARTICLES = 15   # 粒子数
# MAX_ITER = 20      # 最大繰り返し数
# 15粒子 × 20反復 = 300評価

⚠️ 重要: 粒子数 × 反復数が300を超えないようにすること

設定例:
- N_PARTICLES=10, MAX_ITER=30 → ✅ OK(300評価)
- N_PARTICLES=25, MAX_ITER=12 → ✅ OK(300評価)
- N_PARTICLES=30, MAX_ITER=15 → ❌ NG(450評価で制限超過)

⚙️ PSOの制御パラメータ

決められた評価回数(300回)内で適切に粒子が収束するように,以下のパラメータを調整します:

# ========================================
# PSOアルゴリズムパラメータの調整
# ========================================
W = 0.7    # 慣性重み(0.1〜1.2の範囲で調整可能)
           # 0.1〜0.4:強い収束(局所探索重視)
           # 0.4〜0.9:標準的な探索と収束のバランス
           # 0.9〜1.2:強い探索(大域探索重視)

C1 = 1.5   # 個体経験の重み(0.0〜4.0の範囲で調整可能)
           # 0.0:自己の経験を無視
           # 1.0〜2.0:標準的な設定
           # 2.0〜4.0:強く自己の最良解を重視

C2 = 1.5   # 群れ経験の重み(0.0〜4.0の範囲で調整可能)
           # 0.0:群れの情報を無視
           # 1.0〜2.0:標準的な設定
           # 2.0〜4.0:強く全体最良解への追従

💡 ヒント: 評価回数が限られている場合,早い収束(小さいW,大きいC2)と十分な探索(大きいW,大きいC1)のバランスが重要です.

📐 定義域の指定

探索範囲をあらかじめ限定したり,広げることで,最適化の効率と解の質をコントロールできます:

# ========================================
# 探索変数の定義域調整(重要!)
# ========================================
# 各変数の探索範囲を [下限, 上限] で定義

# 例1: 探索範囲を狭くして収束を早める
"Lx": [9, 10],             # 建物幅を9-10mに限定
"Ly": [8, 9],              # 建物奥行を8-9mに限定

# 例2: 探索範囲を広くして多様性を確保
"Lx": [6, 15],             # 建物幅を6-15mまで拡大
"Ly": [5, 14],             # 建物奥行を5-14mまで拡大

# 例3: ピンポイントで固定
"Lx": [10, 10],            # 建物幅を10mに固定
"Ly": [8, 8],              # 建物奥行を8mに固定

# 特に材料パラメータは以下のように固定可能:

# 材料を木材(1.0)に固定する場合
"material_columns": [1.0, 1.0],  # 柱材料を木材に固定
"material_beams": [1.0, 1.0],    # 梁材料を木材に固定

# 材料をコンクリート(0.0)に固定する場合  
"material_walls": [0.0, 0.0],    # 壁材料をコンクリートに固定
"material_floors": [0.0, 0.0],   # 床材料をコンクリートに固定

📌 重要: 探索範囲を狭くすると収束は早くなりますが,より良い解を見逃す可能性があります.逆に範囲を広げると多様な解を探索できますが,限られた評価回数では収束しにくくなります.問題の特性に応じて適切に設定しましょう.

推奨設定パターン
探索戦略 W C1 C2 特徴
強収束型 0.2 0.5 2.5 全体最適解への強い収束,探索範囲は狭い
収束重視 0.4 1.0 2.0 早い収束,やや探索不足のリスク
バランス型 0.7 1.5 1.5 標準的な設定,探索と収束のバランス
探索重視 0.9 2.0 1.0 個体の経験重視で多様な探索,収束は遅い
強探索型 1.1 2.5 0.5 個体の独立性が高く広域探索,収束困難な場合も

課題1では,安全性制約を満たす解を効率的に見つけるため,バランス型または収束重視の設定から始めることを推奨します.ただし,結果を見ながら以下のような調整も試してください:

  • 早く収束させたい場合:C2を大きく(2.0〜3.0),Wを小さく(0.2〜0.4)
  • より広く探索したい場合:C1を大きく(2.0〜3.0),Wを大きく(0.9〜1.1)
  • 局所解に陥った場合:C1を増やして多様性確保(2.0〜2.5)
  • 収束が遅すぎる場合:C2を増やして全体最適解への引力強化(2.0〜3.0)

2. 適応度関数の実装

課題の目的に適した適応度関数をpso_config.pyに設定します.安全性制約を満たしながらコストを最小化するため,制約違反には大きなペナルティを与える設計が重要です.

💡 ヒント: 適応度関数は「小さいほど良い」値を返すように設計します.制約違反のペナルティは,通常の適応度値よりも(ある程度)大きくすることで,制約を満たさない解が選ばれないようにします.

実行手順

  1. 設定ファイルの編集
  2. pso_config.pyを開く
  3. 粒子数と反復数を設定(合計300評価になるように)
  4. 適応度関数を上記に置き換える

  5. PSOの実行
    python pso_algorithm_win.py

  6. 結果の確認
    python gbest_generate_building.py

評価のポイント

確認項目 目標
安全率 2.0以上を達成しているか
建設コスト どこまで削減できたか
評価回数 300回以内で収束したか
設計の妥当性 現実的な建物(FCstdファイル)になっているか

結果の記録

以下の情報を記録:
- 最終的な設計パラメータ
- 最終的な建設コスト(円/㎡)
- 達成した安全率
- 収束に要した反復数


課題2: 独自の適応度関数設計

課題内容

グループで話し合い,独自の「理想の建物」の評価基準を作成し,それを適応度関数として実装せよ

評価指標の理解

適応度関数を設計する前に,各評価指標の意味と最適化の方向を理解しましょう:

指標 変数名 内容 目標
🔒 安全性 safety 構造安全率(応力/変形) ⬆️ 最大化
💰 経済性 cost 建設コスト(円/m²) ⬇️ 最小化
🌱 環境性 co2 CO2排出量(kg-CO2/m²) ⬇️ 最小化
🏠 快適性 comfort 居住快適性スコア(0-10) ⬆️ 最大化
🔨 施工性 constructability 施工容易性スコア(0-10) ⬆️ 最大化

重要: 配布したPSOは適応度関数の値を最小化するアルゴリズムです.そのため:
- 最大化したい指標(安全性,快適性,施工性)は,負の値にするか,逆数を取る必要があります
- 最小化したい指標(コスト,CO2)は,そのまま使用できます

探索範囲のカスタマイズ

適応度関数だけでなく,探索変数の定義域を制限することで,特定のコンセプトに沿った建物を設計できます:

設定例:
- 全て木造建築: すべての材料パラメータを[1.0, 1.0]に固定
- 低層建築: 階高を[2.6, 3.0]など狭い範囲に限定
- 頑丈な構造: 柱の太さを[600, 800]など太めに設定
- コンパクト設計: 建物サイズLx, Lyを小さめの範囲に限定

💡 ヒント: 材料を固定することで「木造専門」「RC造専門」など,特定の構造形式に特化した最適化が可能です.また,寸法を限定することで,敷地条件や法規制に対応した現実的な設計を探索できます.

⚠️ 注意: 形状パラメータ(寸法・厚さ・角度など)をpso_config.pyのデフォルト範囲から極端に外れた値に設定すると,3Dモデルが正しく生成されない場合があります.特に,壁厚を建物幅より大きくしたり,階高を極端に小さくすると,モデルが崩れる原因となります.

適応度関数の設計例

以下の例は,そのままpso_config.pycalculate_fitness関数にコピー&ペーストして使用できます.差し替える際は,インデントに注意してください(Pythonはインデントが重要な言語です).

基本形(コスト最小化)

def calculate_fitness(cost, safety, co2, comfort, constructability):
    # 安全率の閾値
    SAFETY_THRESHOLD = 2.0

    # 基本適応度:コストのみ
    fitness = cost

    # 安全率ペナルティ
    if safety < SAFETY_THRESHOLD:
        fitness += (SAFETY_THRESHOLD - safety) * 10000

    return fitness

例1: 環境重視型(CO2最小化)

def calculate_fitness(cost, safety, co2, comfort, constructability):
    # 安全率の閾値
    SAFETY_THRESHOLD = 2.0

    # 基本適応度:CO2排出量のみ
    fitness = co2 * 100  # スケール調整

    # 安全率ペナルティ
    if safety < SAFETY_THRESHOLD:
        fitness += (SAFETY_THRESHOLD - safety) * 10000

    return fitness

例2: 快適性重視型(快適性最大化)

def calculate_fitness(cost, safety, co2, comfort, constructability):
    # 安全率の閾値
    SAFETY_THRESHOLD = 2.0

    # 基本適応度:快適性を最大化(負の値)
    fitness = -comfort * 10000

    # 安全率ペナルティ
    if safety < SAFETY_THRESHOLD:
        fitness += (SAFETY_THRESHOLD - safety) * 10000

    return fitness

例3: 2目的最適化(コスト+環境)

def calculate_fitness(cost, safety, co2, comfort, constructability):
    # 安全率の閾値
    SAFETY_THRESHOLD = 2.0

    # 基本適応度:コストとCO2の両方を考慮
    fitness = cost * 0.7 + co2 * 300  # 重み付けで調整

    # 安全率ペナルティ
    if safety < SAFETY_THRESHOLD:
        fitness += (SAFETY_THRESHOLD - safety) * 10000

    return fitness

例4: 2目的最適化(快適性+施工性)

def calculate_fitness(cost, safety, co2, comfort, constructability):
    # 安全率の閾値
    SAFETY_THRESHOLD = 2.0

    # 基本適応度:快適性と施工性を最大化(負の値)
    fitness = -comfort * 5000 - constructability * 3000

    # 安全率ペナルティ
    if safety < SAFETY_THRESHOLD:
        fitness += (SAFETY_THRESHOLD - safety) * 10000

    return fitness

例5: 3目的最適化(快適性+施工性+環境)

def calculate_fitness(cost, safety, co2, comfort, constructability):
    # 安全率の閾値
    SAFETY_THRESHOLD = 2.0

    # 基本適応度:快適性と施工性を最大化、CO2を最小化
    fitness = -comfort * 1000 - constructability * 800 + co2 * 200

    # 安全率ペナルティ
    if safety < SAFETY_THRESHOLD:
        fitness += (SAFETY_THRESHOLD - safety) * 10000

    return fitness

💡 ヒント: 複数の評価指標を合成するときは,各指標の取りうる値の範囲(レンジ)が異なることに注意しましょう.例えばサンプリング結果より:
- コスト: 400,000〜1,600,000 円/m²(範囲:1,200,000)
- CO2: 200〜2,000 kg-CO2/m²(範囲:1,800)
- 快適性: 0〜10(範囲:10)

となっているので,これらをそのまま足すとコストの影響が大きくなりすぎます.異なる指標を合成する際は,重みを調整して各指標の影響度をバランスよくすることが重要です.

⚠️ 注意: 上記の例で示した重み(例:cost * 0.7co2 * 300-comfort * 1000など)は説明のための仮の値です.実際の最適化では,各指標の実際の値の範囲を確認し,適切な重みを設定する必要があります.

グループワークの進め方

  1. 目標設定(15分)
  2. どのような建物を「理想」とするか議論
  3. 重視する指標の優先順位を決定

  4. 適応度関数の設計(30分)

  5. 各指標の重み付けを決定
  6. 制約条件の設定
  7. 数式として表現

  8. 実装とテスト(30分)

  9. pso_config.pyに実装
  10. PSOを実行して結果を確認

  11. 結果の分析(15分)

  12. 得られた建物の特徴を分析
  13. 目標との一致度を評価

評価基準の例

重視する価値観 適応度関数の設計方針
経済性重視 コストを最小化,他は制約のみ
安全第一 安全率を最大化,コストは二次的
環境配慮 CO2排出量最小化,木材使用推奨
快適性追求 快適性スコア最大化,採光重視
バランス型 全指標を重み付けして統合

グループ発表

プレゼンテーション資料(PowerPoint)を作成し,課題1と課題2の両方の結果を発表する.

発表内容の構成

第1部:課題1の結果(安全性制約下でのコスト最小化)

  1. 取り組み内容
  2. 設定したPSOパラメータ(粒子数,反復数,W,C1,C2)
  3. 探索範囲の調整内容

  4. 結果

  5. 達成した安全率とコスト
  6. 最適化過程の説明
  7. 得られた建物の3Dモデル

第2部:課題2の結果(独自の適応度関数設計)

  1. 設計コンセプト
  2. どのような建物を目指したか
  3. なぜその評価基準を選んだか

  4. 適応度関数の説明

  5. 各指標の重み付けの根拠
  6. 工夫した点(正規化,ペナルティなど)

  7. 最適化結果

  8. 得られた建物の特徴(パラメータ)
  9. 性能評価(5つの指標)の比較
  10. 得られた建物の3Dモデル

  11. まとめ

  12. 設計コンセプトは実現できたか
  13. 期待した性能と実際の結果の比較
  14. うまくいった点と改善が必要な点

💡 プレゼンのコツ: モニタリングツールから取得した収束グラフや散布図のスクリーンショットを活用すると,最適化の過程が視覚的に伝わりやすくなります.


まとめ

この実践演習を通じて:

  1. 目的関数の重要性を理解
  2. 何を「良い」とするかで結果が大きく変わる
  3. トレードオフの関係を数式で表現

  4. 最適化の実践的応用を体験

  5. 現実の制約条件の考慮
  6. 複数目標の同時最適化

  7. チームでの設計思想の共有

  8. 価値観の違いと合意形成
  9. 数値化による客観的評価

これらの経験は,実際の建築設計や他の最適化問題にも応用できる重要なスキルです.