demo_simulation.py 3,84 ko
Newer Older
"""
Demo script to test the queueing network simulation.

This demonstrates Scenario 1 from the project requirements:
1 fast server - should be UNSTABLE (ρ > 1)
"""
from src.core.simulation import Simulator, SimulationConfig


def main():
    print("=" * 70)
    print("QUEUEING NETWORK SIMULATION - DEMO")
    print("=" * 70)

    # Scenario 1: 1 fast server (should be unstable)
    print("\n📊 SCENARIO 1: Single Fast Server (Instability Test)")
    print("-" * 70)

    config = SimulationConfig(
        arrival_rate=1/125,  # Mean inter-arrival: 125ms
        coordinator_service_rate=1/10,  # Mean service: 10ms
        coordinator_exit_probability=0.5,  # p = 0.5
        server_service_rates=[1/120],  # Mean service: 120ms (fast server)
        server_routing_probs=[0.5],  # q1 = 0.5
        warmup_time=10000.0,
        simulation_time=50000.0,
        random_seed=42
    )

    print(f"\nConfiguration:")
    print(f"  λ (arrival rate) = {config.arrival_rate:.6f} req/ms")
    print(f"  μc (coordinator) = {config.coordinator_service_rate:.6f} req/ms")
    print(f"  μ1 (server 1) = {config.server_service_rates[0]:.6f} req/ms")
    print(f"  p (exit prob) = {config.coordinator_exit_probability}")
    print(f"  q1 (routing prob) = {config.server_routing_probs[0]}")

    # Calculate theoretical utilizations
    lambda_ext = config.arrival_rate
    lambda_c = lambda_ext
    lambda_1 = lambda_ext * config.server_routing_probs[0]

    rho_c = lambda_c / config.coordinator_service_rate
    rho_1 = lambda_1 / config.server_service_rates[0]

    print(f"\n📐 Theoretical Analysis (Jackson):")
    print(f"  λc = {lambda_c:.6f} (effective arrival rate at coordinator)")
    print(f"  λ1 = {lambda_1:.6f} (effective arrival rate at server 1)")
    print(f"  ρc = λc/μc = {rho_c:.4f}")
    print(f"  ρ1 = λ1/μ1 = {rho_1:.4f} {'❌ UNSTABLE (>1)' if rho_1 >= 1 else '✅ STABLE'}")

    if rho_c >= 1 or rho_1 >= 1:
        print(f"\n⚠️  EXPECTED: System is UNSTABLE - queues will grow without bound")
    else:
        print(f"\n✅ EXPECTED: System is STABLE")

    # Run simulation
    print(f"\n🚀 Running simulation...")
    simulator = Simulator(config)
    results = simulator.run()

    # Display results
    print("\n" + "=" * 70)
    print("SIMULATION RESULTS")
    print("=" * 70)

    print(f"\n📈 Overall Statistics:")
    print(f"  Total requests arrived: {results.total_requests_arrived}")
    print(f"  Requests completed (after warmup): {results.total_requests_completed}")
    print(f"  Average system time: {results.average_system_time:.2f} ms")

    print(f"\n📊 Coordinator Queue:")
    coord = results.coordinator_stats
    print(f"  Arrivals: {coord['total_arrivals']}")
    print(f"  Departures: {coord['total_departures']}")
    print(f"  Avg wait time: {coord['average_wait_time']:.2f} ms")
    print(f"  Avg service time: {coord['average_service_time']:.2f} ms")
    print(f"  Avg system time: {coord['average_system_time']:.2f} ms")
    print(f"  Utilization: {coord['utilization']:.4f} (theoretical: {rho_c:.4f})")

    print(f"\n📊 Server 1 Queue:")
    server1 = results.server_stats['server_1']
    print(f"  Arrivals: {server1['total_arrivals']}")
    print(f"  Departures: {server1['total_departures']}")
    print(f"  Avg wait time: {server1['average_wait_time']:.2f} ms")
    print(f"  Avg service time: {server1['average_service_time']:.2f} ms")
    print(f"  Avg system time: {server1['average_system_time']:.2f} ms")
    print(f"  Utilization: {server1['utilization']:.4f} (theoretical: {rho_1:.4f})")

    # Verdict
    print("\n" + "=" * 70)
    if server1['utilization'] > 0.95:
        print("⚠️  VERDICT: System is UNSTABLE - Server 1 is overloaded")
        print("   Queue is growing, system cannot keep up with arrivals")
    else:
        print("✅ VERDICT: System appears STABLE")
    print("=" * 70)


if __name__ == "__main__":
    main()