<?php
class FuzzyLogicExamples {
public static function airConditionerDemo() { echo "=== 智能空调控制系统演示 ===\n"; $ac = new SmartAirConditioner(); $testConditions = [ ['temp' => 17, 'humidity' => 35], ['temp' => 20, 'humidity' => 45], ['temp' => 24, 'humidity' => 50], ['temp' => 27, 'humidity' => 65], ['temp' => 32, 'humidity' => 75], ]; foreach ($testConditions as $condition) { $ac->displayControl($condition['temp'], $condition['humidity']); } }
public static function cruiseControlDemo() { echo "=== 汽车巡航控制系统演示 ===\n"; $fuzzySystem = new FuzzyLogicSystem(); $speedDiff = new FuzzyVariable('speed_difference', -30, 30); $speedDiff->addSet(new FuzzySet('slow_down', MembershipFunctionFactory::trapezoidal(-30, -30, -20, -10))); $speedDiff->addSet(new FuzzySet('maintain', MembershipFunctionFactory::triangular(-15, 0, 15))); $speedDiff->addSet(new FuzzySet('speed_up', MembershipFunctionFactory::trapezoidal(10, 20, 30, 30))); $distance = new FuzzyVariable('distance', 0, 200); $distance->addSet(new FuzzySet('too_close', MembershipFunctionFactory::trapezoidal(0, 0, 20, 50))); $distance->addSet(new FuzzySet('safe', MembershipFunctionFactory::triangular(30, 80, 130))); $distance->addSet(new FuzzySet('too_far', MembershipFunctionFactory::trapezoidal(100, 150, 200, 200))); $control = new FuzzyVariable('control', -100, 100); $control->addSet(new FuzzySet('brake_hard', MembershipFunctionFactory::triangular(-100, -100, -50))); $control->addSet(new FuzzySet('brake_light', MembershipFunctionFactory::triangular(-75, -50, -25))); $control->addSet(new FuzzySet('maintain', MembershipFunctionFactory::triangular(-25, 0, 25))); $control->addSet(new FuzzySet('accelerate_light', MembershipFunctionFactory::triangular(25, 50, 75))); $control->addSet(new FuzzySet('accelerate_hard', MembershipFunctionFactory::triangular(50, 100, 100))); $fuzzySystem->addInputVariable($speedDiff); $fuzzySystem->addInputVariable($distance); $fuzzySystem->addOutputVariable($control); $rules = [ [['speed_difference' => 'slow_down', 'distance' => 'too_close'] => ['control' => 'brake_hard']], [['speed_difference' => 'slow_down', 'distance' => 'safe'] => ['control' => 'brake_light']], [['speed_difference' => 'slow_down', 'distance' => 'too_far'] => ['control' => 'maintain']], [['speed_difference' => 'maintain', 'distance' => 'too_close'] => ['control' => 'brake_light']], [['speed_difference' => 'maintain', 'distance' => 'safe'] => ['control' => 'maintain']], [['speed_difference' => 'maintain', 'distance' => 'too_far'] => ['control' => 'accelerate_light']], [['speed_difference' => 'speed_up', 'distance' => 'too_close'] => ['control' => 'brake_hard']], [['speed_difference' => 'speed_up', 'distance' => 'safe'] => ['control' => 'accelerate_light']], [['speed_difference' => 'speed_up', 'distance' => 'too_far'] => ['control' => 'accelerate_hard']], ]; foreach ($rules as $rule) { $fuzzySystem->addRule(new FuzzyRule(key($rule), current($rule))); } $testScenarios = [ ['diff' => -25, 'dist' => 30], ['diff' => -10, 'dist' => 80], ['diff' => 0, 'dist' => 100], ['diff' => 15, 'dist' => 60], ['diff' => 25, 'dist' => 180], ]; foreach ($testScenarios as $scenario) { $result = $fuzzySystem->evaluate([ 'speed_difference' => $scenario['diff'], 'distance' => $scenario['dist'] ]); $control = $result['crisp_outputs']['control']; $action = $control < -50 ? "紧急刹车" : ($control < -10 ? "轻踩刹车" : ($control < 10 ? "保持油门" : ($control < 50 ? "轻踩油门" : "大力加速"))); echo "速度差: {$scenario['diff']} km/h, 距离: {$scenario['dist']} m => " . "控制值: " . round($control) . " ({$action})\n"; } }
public static function washingMachineDemo() { echo "\n=== 智能洗衣机控制系统演示 ===\n"; $fuzzySystem = new FuzzyLogicSystem(); $dirtiness = new FuzzyVariable('dirtiness', 0, 100); $dirtiness->addSet(new FuzzySet('slightly_dirty', MembershipFunctionFactory::trapezoidal(0, 0, 20, 40))); $dirtiness->addSet(new FuzzySet('moderately_dirty', MembershipFunctionFactory::triangular(30, 50, 70))); $dirtiness->addSet(new FuzzySet('very_dirty', MembershipFunctionFactory::trapezoidal(60, 80, 100, 100))); $load = new FuzzyVariable('load', 0, 10); $load->addSet(new FuzzySet('light', MembershipFunctionFactory::trapezoidal(0, 0, 2, 4))); $load->addSet(new FuzzySet('medium', MembershipFunctionFactory::triangular(3, 5, 7))); $load->addSet(new FuzzySet('heavy', MembershipFunctionFactory::trapezoidal(6, 8, 10, 10))); $washTime = new FuzzyVariable('wash_time', 10, 60); $washTime->addSet(new FuzzySet('short', MembershipFunctionFactory::triangular(10, 10, 30))); $washTime->addSet(new FuzzySet('medium', MembershipFunctionFactory::triangular(20, 35, 50))); $washTime->addSet(new FuzzySet('long', MembershipFunctionFactory::triangular(40, 60, 60))); $fuzzySystem->addInputVariable($dirtiness); $fuzzySystem->addInputVariable($load); $fuzzySystem->addOutputVariable($washTime); $rules = [ [['dirtiness' => 'slightly_dirty', 'load' => 'light'] => ['wash_time' => 'short']], [['dirtiness' => 'slightly_dirty', 'load' => 'medium'] => ['wash_time' => 'short']], [['dirtiness' => 'slightly_dirty', 'load' => 'heavy'] => ['wash_time' => 'medium']], [['dirtiness' => 'moderately_dirty', 'load' => 'light'] => ['wash_time' => 'medium']], [['dirtiness' => 'moderately_dirty', 'load' => 'medium'] => ['wash_time' => 'medium']], [['dirtiness' => 'moderately_dirty', 'load' => 'heavy'] => ['wash_time' => 'long']], [['dirtiness' => 'very_dirty', 'load' => 'light'] => ['wash_time' => 'long']], [['dirtiness' => 'very_dirty', 'load' => 'medium'] => ['wash_time' => 'long']], [['dirtiness' => 'very_dirty', 'load' => 'heavy'] => ['wash_time' => 'long']], ]; foreach ($rules as $rule) { $fuzzySystem->addRule(new FuzzyRule(key($rule), current($rule))); } $testScenarios = [ ['dirt' => 15, 'weight' => 2], ['dirt' => 25, 'weight' => 5], ['dirt' => 60, 'weight' => 3], ['dirt' => 45, 'weight' => 8], ['dirt' => 85, 'weight' => 7], ]; foreach ($testScenarios as $scenario) { $result = $fuzzySystem->evaluate([ 'dirtiness' => $scenario['dirt'], 'load' => $scenario['weight'] ]); $time = $result['crisp_outputs']['wash_time']; echo "脏污度: {$scenario['dirt']}%, 重量: {$scenario['weight']}kg => " . "洗涤时间: " . round($time) . "分钟\n"; } }
public static function performanceTest() { echo "\n=== 模糊逻辑系统性能测试 ===\n"; $ac = new SmartAirConditioner(); $startTime = microtime(true); $testCount = 100; for ($i = 0; $i < $testCount; $i++) { $temp = 15 + ($i / $testCount) * 20; $humidity = 20 + ($i / $testCount) * 60; $ac->calculateControl($temp, $humidity); } $endTime = microtime(true); $executionTime = ($endTime - $startTime) * 1000; echo "执行 {$testCount} 次推理耗时: " . number_format($executionTime, 2) . "ms\n"; echo "平均每次推理: " . number_format($executionTime / $testCount, 2) . "ms\n"; } }
FuzzyLogicExamples::airConditionerDemo(); FuzzyLogicExamples::cruiseControlDemo(); FuzzyLogicExamples::washingMachineDemo(); FuzzyLogicExamples::performanceTest();
?>
|