🏛️ Public Works Simulator

Mainstream Economics vs. SBCM Theory


Flow of Wealth (富の流出先)

🏢 東京 (Central): 0%

🏡 地方 (Local): 0%

Local Survival Rate (地域生存率)
0%

-


Admin Cost (行政コスト)
¥0
System Ready...
Select a mode and click 'Run'.
import js from pyodide.ffi import create_proxy # 定数定義 LOCAL_CAPACITY_LIMIT = 5 # 地方企業の単独受注限界 (億円) ADMIN_COST_MANUAL = 0.20 # 手動管理コスト (20%) ADMIN_COST_ALGO = 0.01 # アルゴリズム管理コスト (1%) def run_simulation(*args): # 1. 入力値の取得 budget_oku_str = js.document.getElementById('budget_slider').value budget_oku = int(budget_oku_str) budget = budget_oku * 100000000 # 円換算 # ラジオボタンの状態取得 mode_scale = js.document.getElementById('mode_scale').checked mode = "G-Scale" if mode_scale else "G-Cart" # UIのリセットとモード反映 dashboard = js.document.getElementById('dashboard') if mode_scale: dashboard.classList.remove("cart-mode") dashboard.classList.add("scale-mode") else: dashboard.classList.remove("scale-mode") dashboard.classList.add("cart-mode") logs = [] logs.append(f"🚀 Simulation Started: {mode}") logs.append(f"💰 Project Budget: {budget:,}円") # ========================================== # 🔴 G-Scale Logic (Mainstream Economics) # ========================================== if mode == "G-Scale": logs.append("--- Logic: Efficiency & Scale ---") logs.append("ℹ️ Policy: 'Bundling small projects for efficiency.'") # 1. バンドリング(包括発注) # 予算が大きければ大きいほど、単一の巨大契約にする contract_size = budget logs.append(f"📦 Bundled into 1 contract: {contract_size:,}円") # 2. 受注判定 (キャパ不足の地方は排除) # 5億円を超えると地方企業は受注不能になる設定 if contract_size > (LOCAL_CAPACITY_LIMIT * 100000000): winner = "Tokyo General Contractor" leakage_rate = 1.0 # 100%漏出 logs.append(f"⚠️ Local Capacity Exceeded ({LOCAL_CAPACITY_LIMIT}億 < {budget_oku}億)") logs.append(f"🏆 Winner: {winner} (Capital > 100億)") local_survival = 0 survival_text = "💀 壊滅 (受注ゼロ)" else: winner = "Local SME" leakage_rate = 0.1 # 資材費などは漏れる local_survival = 100 survival_text = "😊 生存 (受注可能)" # 3. 行政コスト admin_cost = int(budget * ADMIN_COST_MANUAL) logs.append(f"💸 Admin/Margin Cost: {admin_cost:,}円 (20%)") # ========================================== # 🟢 G-Cart Logic (SBCM Theory) # ========================================== else: logs.append("--- Logic: Mesh Refinement & Retention ---") logs.append("ℹ️ Policy: 'Splitting budget to fit local capacity.'") # 1. メッシュ細分化 (Mesh Refinement) # 地方企業のキャパ(5億円)に合わせて分割発注 # 安全率0.8をかけて、4億円単位くらいで分割する split_unit = LOCAL_CAPACITY_LIMIT * 100000000 * 0.8 num_contracts = int(budget / split_unit) if num_contracts < 1: num_contracts = 1 unit_price = int(budget / num_contracts) logs.append(f"✂️ Mesh Refinement: Split into {num_contracts} contracts") logs.append(f"📉 Unit Price: {unit_price:,}円") # 2. 受注判定 # 分割したので地方企業が受注可能 winner = "Local SME Alliance" leakage_rate = 0.05 # 最小限の漏出 local_survival = 100 survival_text = "🎉 繁栄 (全社受注・循環)" logs.append(f"✅ Capacity Check: OK ({unit_price} < Limit)") logs.append(f"🤝 Formed {num_contracts} Virtual JVs") # 3. 行政コスト admin_cost = int(budget * ADMIN_COST_ALGO) logs.append(f"⚡ Algo Cost: {admin_cost:,}円 (1%)") # ========================================== # 📊 結果の計算と描画 # ========================================== # 東京への流出額 (Leakage) tokyo_amount = int(budget * leakage_rate) local_amount = budget - tokyo_amount tokyo_percent = int(leakage_rate * 100) local_percent = 100 - tokyo_percent # DOM更新 js.document.getElementById('tokyo_share').innerText = str(tokyo_percent) js.document.getElementById('bar_tokyo').style.width = f"{tokyo_percent}%" tokyo_text = f"{tokyo_amount:,}円" if tokyo_percent > 15 else "" js.document.getElementById('bar_tokyo').innerText = tokyo_text js.document.getElementById('local_share').innerText = str(local_percent) js.document.getElementById('bar_local').style.width = f"{local_percent}%" local_text = f"{local_amount:,}円" if local_percent > 15 else "" js.document.getElementById('bar_local').innerText = local_text js.document.getElementById('survival_rate').innerText = f"{local_survival}%" js.document.getElementById('survival_desc').innerText = survival_text js.document.getElementById('admin_cost').innerText = f"{admin_cost:,}円" # ログ表示更新 log_html = "
".join(logs) js.document.getElementById('log_output').innerHTML = log_html # スライダーの値をリアルタイム表示 def on_slider_change(event): val = event.target.value js.document.getElementById('budget_display').innerText = f"{val}億円" slider_proxy = create_proxy(on_slider_change) js.document.getElementById('budget_slider').addEventListener("input", slider_proxy) # 初回実行 run_simulation()