使用生物免疫算法和遗传算法实现动态信道分配

1. 设计

1.1 动态信道分配问题描述

classdef DynamicChannelAllocation
    % 动态信道分配问题建模
    
    properties
        num_cells          % 小区数量
        num_channels       % 可用信道数量
        num_users          % 用户数量
        interference_map   % 干扰矩阵
        demand_matrix      % 需求矩阵
        cell_layout       % 小区布局
        user_positions    % 用户位置
        system_config     % 系统配置
    end
    
    methods
        function obj = DynamicChannelAllocation(config)
            % 初始化动态信道分配问题
            obj.num_cells = config.num_cells;
            obj.num_channels = config.num_channels;
            obj.num_users = config.num_users;
            obj.system_config = config;
            
            % 生成网络拓扑和干扰模型
            obj = generate_network_topology(obj);
            obj = generate_interference_map(obj);
            obj = generate_demand_matrix(obj);
        end
        
        function obj = generate_network_topology(obj)
            % 生成网络拓扑结构
            fprintf('生成网络拓扑...\n');
            
            % 生成小区布局(六边形蜂窝网络)
            obj.cell_layout = zeros(obj.num_cells, 2);
            radius = 1; % 小区半径
            
            % 六边形布局坐标计算
            k = 1;
            for ring = 0:ceil(sqrt(obj.num_cells)/2)
                for i = 0:6*ring-1
                    if k > obj.num_cells, break; end
                    angle = 2*pi*i/(6*max(ring,1));
                    obj.cell_layout(k, :) = [ring*cos(angle), ring*sin(angle)];
                    k = k + 1;
                end
            end
            
            % 生成用户位置
            obj.user_positions = zeros(obj.num_users, 2);
            for i = 1:obj.num_users
                cell_id = randi(obj.num_cells);
                angle = 2*pi*rand();
                dist = radius * sqrt(rand());
                obj.user_positions(i, :) = obj.cell_layout(cell_id, :) + ...
                    dist * [cos(angle), sin(angle)];
            end
        end
        
        function obj = generate_interference_map(obj)
            % 生成干扰矩阵
            fprintf('生成干扰矩阵...\n');
            obj.interference_map = zeros(obj.num_cells, obj.num_cells);
            
            for i = 1:obj.num_cells
                for j = 1:obj.num_cells
                    if i == j
                        obj.interference_map(i, j) = 1.0; % 同小区干扰
                    else
                        % 计算小区间距离
                        dist = norm(obj.cell_layout(i, :) - obj.cell_layout(j, :));
                        % 距离越近,干扰越大
                        obj.interference_map(i, j) = max(0, 1 - dist/3);
                    end
                end
            end
        end
        
        function obj = generate_demand_matrix(obj)
            % 生成用户需求矩阵
            fprintf('生成需求矩阵...\n');
            obj.demand_matrix = zeros(obj.num_cells, obj.num_channels);
            
            % 每个小区的用户数量分布
            users_per_cell = randi([1, 5], obj.num_cells, 1);
            total_users = sum(users_per_cell);
            
            % 调整用户数量
            if total_users ~= obj.num_users
                scale_factor = obj.num_users / total_users;
                users_per_cell = max(1, round(users_per_cell * scale_factor));
            end
            
            user_count = 0;
            for cell = 1:obj.num_cells
                num_cell_users = min(users_per_cell(cell), obj.num_users - user_count);
                for ch = 1:obj.num_channels
                    % 随机生成信道需求
                    if rand() < 0.3 % 30%的概率需要该信道
                        obj.demand_matrix(cell, ch) = ...
                            randi([1, num_cell_users]); % 需求用户数
                    end
                end
                user_count = user_count + num_cell_users;
                if user_count >= obj.num_users, break; end
            end
        end
        
        function fitness = evaluate_allocation(obj, allocation)
            % 评估信道分配方案的适应度
            % allocation: num_cells x num_channels 矩阵,表示信道分配
            
            total_interference = 0;
            total_satisfaction = 0;
            total_penalty = 0;
            
            % 计算干扰
            for ch = 1:obj.num_channels
                for i = 1:obj.num_cells
                    if allocation(i, ch) > 0 % 如果小区i使用了信道ch
                        for j = 1:obj.num_cells
                            if i ~= j && allocation(j, ch) > 0
                                % 累积干扰
                                total_interference = total_interference + ...
                                    obj.interference_map(i, j) * allocation(i, ch) * allocation(j, ch);
                            end
                        end
                    end
                end
            end
            
            % 计算需求满足度
            for i = 1:obj.num_cells
                for ch = 1:obj.num_channels
                    if allocation(i, ch) > 0
                        % 计算需求满足程度
                        satisfaction = min(allocation(i, ch), obj.demand_matrix(i, ch));
                        total_satisfaction = total_satisfaction + satisfaction;
                        
                        % 计算惩罚(过度分配或分配不足)
                        if allocation(i, ch) > obj.demand_matrix(i, ch)
                            penalty = (allocation(i, ch) - obj.demand_matrix(i, ch))^2;
                        else
                            penalty = (obj.demand_matrix(i, ch) - allocation(i, ch))^2;
                        end
                        total_penalty = total_penalty + penalty;
                    end
                end
            end
            
            % 计算总适应度(最大化)
            max_possible_satisfaction = sum(obj.demand_matrix(:));
            satisfaction_ratio = total_satisfaction / max_possible_satisfaction;
            
            % 适应度函数
            fitness = satisfaction_ratio - 0.5 * (total_interference / (obj.num_cells^2)) ...
                - 0.1 * (total_penalty / max_possible_satisfaction);
            
            % 确保适应度为非负
            fitness = max(0, fitness);
        end
    end
end

2. 遗传算法实现

2.1 遗传算法核心类

classdef GeneticAlgorithm
    % 遗传算法实现动态信道分配
    
    properties
        population_size    % 种群大小
        max_generations   % 最大迭代次数
        crossover_rate    % 交叉概率
        mutation_rate     % 变异概率
        elitism_count     % 精英保留数量
        problem          % 信道分配问题实例
        population       % 种群
        fitness          % 适应度值
        best_solution    % 最优解
        best_fitness     % 最优适应度
        convergence      % 收敛曲线
    end
    
    methods
        function ga = GeneticAlgorithm(problem, config)
            % 初始化遗传算法
            ga.problem = problem;
            ga.population_size = config.population_size;
            ga.max_generations = config.max_generations;
            ga.crossover_rate = config.crossover_rate;
            ga.mutation_rate = config.mutation_rate;
            ga.elitism_count = config.elitism_count;
            ga.convergence = zeros(config.max_generations, 1);
        end
        
        function ga = initialize_population(ga)
            % 初始化种群
            fprintf('初始化遗传算法种群...\n');
            
            num_cells = ga.problem.num_cells;
            num_channels = ga.problem.num_channels;
            
            ga.population = zeros(ga.population_size, num_cells, num_channels);
            ga.fitness = zeros(ga.population_size, 1);
            
            for i = 1:ga.population_size
                % 随机生成信道分配方案
                solution = zeros(num_cells, num_channels);
                for cell = 1:num_cells
                    for ch = 1:num_channels
                        if rand() < 0.4 % 40%的概率分配信道
                            max_users = ga.problem.demand_matrix(cell, ch);
                            if max_users > 0
                                solution(cell, ch) = randi([0, max_users]);
                            end
                        end
                    end
                end
                ga.population(i, :, :) = solution;
                ga.fitness(i) = ga.problem.evaluate_allocation(solution);
            end
            
            % 记录最优解
            [ga.best_fitness, best_idx] = max(ga.fitness);
            ga.best_solution = squeeze(ga.population(best_idx, :, :));
        end
        
        function ga = evolve(ga)
            % 执行遗传算法进化
            fprintf('开始遗传算法进化...\n');
            
            for gen = 1:ga.max_generations
                % 选择
                selected_indices = ga.selection();
                
                % 交叉
                new_population = ga.crossover(selected_indices);
                
                % 变异
                new_population = ga.mutation(new_population);
                
                % 评估新种群
                new_fitness = zeros(ga.population_size, 1);
                for i = 1:ga.population_size
                    new_fitness(i) = ga.problem.evaluate_allocation(...
                        squeeze(new_population(i, :, :)));
                end
                
                % 精英保留
                [ga.population, ga.fitness] = ga.elitism(...
                    ga.population, ga.fitness, new_population, new_fitness);
                
                % 更新最优解
                [current_best_fitness, best_idx] = max(ga.fitness);
                if current_best_fitness > ga.best_fitness
                    ga.best_fitness = current_best_fitness;
                    ga.best_solution = squeeze(ga.population(best_idx, :, :));
                end
                
                ga.convergence(gen) = ga.best_fitness;
                
                if mod(gen, 10) == 0
                    fprintf('代数 %d: 最优适应度 = %.4f\n', gen, ga.best_fitness);
                end
            end
        end
        
        function selected_indices = selection(ga)
            % 轮盘赌选择
            fitness_sum = sum(ga.fitness);
            if fitness_sum == 0
                % 如果所有适应度都为0,均匀选择
                selected_indices = randi(ga.population_size, ga.population_size, 1);
            else
                probabilities = ga.fitness / fitness_sum;
                cumulative_prob = cumsum(probabilities);
                selected_indices = zeros(ga.population_size, 1);
                
                for i = 1:ga.population_size
                    r = rand();
                    selected_indices(i) = find(cumulative_prob >= r, 1);
                end
            end
        end
        
        function new_population = crossover(ga, selected_indices)
            % 单点交叉
            num_cells = ga.problem.num_cells;
            num_channels = ga.problem.num_channels;
            
            new_population = zeros(ga.population_size, num_cells, num_channels);
            
            for i = 1:2:ga.population_size
                parent1_idx = selected_indices(i);
                parent2_idx = selected_indices(min(i+1, ga.population_size));
                
                parent1 = squeeze(ga.population(parent1_idx, :, :));
                parent2 = squeeze(ga.population(parent2_idx, :, :));
                
                if rand() < ga.crossover_rate
                    % 执行交叉
                    crossover_point = randi([1, num_cells-1]);
                    
                    child1 = [parent1(1:crossover_point, :); 
                             parent2(crossover_point+1:end, :)];
                    child2 = [parent2(1:crossover_point, :); 
                             parent1(crossover_point+1:end, :)];
                else
                    % 不交叉,直接复制
                    child1 = parent1;
                    child2 = parent2;
                end
                
                new_population(i, :, :) = child1;
                if i+1 <= ga.population_size
                    new_population(i+1, :, :) = child2;
                end
            end
        end
        
        function population = mutation(ga, population)
            % 变异操作
            num_cells = ga.problem.num_cells;
            num_channels = ga.problem.num_channels;
            
            for i = 1:ga.population_size
                individual = squeeze(population(i, :, :));
                
                for cell = 1:num_cells
                    for ch = 1:num_channels
                        if rand() < ga.mutation_rate
                            % 随机变异
                            max_users = ga.problem.demand_matrix(cell, ch);
                            if max_users > 0
                                individual(cell, ch) = randi([0, max_users]);
                            else
                                individual(cell, ch) = 0;
                            end
                        end
                    end
                end
                
                population(i, :, :) = individual;
            end
        end
        
        function [new_population, new_fitness] = elitism(ga, old_pop, old_fit, new_pop, new_fit)
            % 精英保留策略
            [~, sorted_indices] = sort(old_fit, 'descend');
            elite_indices = sorted_indices(1:ga.elitism_count);
            
            % 用精英个体替换新种群中最差的个体
            [~, worst_indices] = sort(new_fit, 'ascend');
            replace_indices = worst_indices(1:ga.elitism_count);
            
            new_population = new_pop;
            new_fitness = new_fit;
            
            for i = 1:ga.elitism_count
                new_population(replace_indices(i), :, :) = ...
                    old_pop(elite_indices(i), :, :);
                new_fitness(replace_indices(i)) = old_fit(elite_indices(i));
            end
        end
        
        function plot_convergence(ga)
            % 绘制收敛曲线
            figure;
            plot(1:ga.max_generations, ga.convergence, 'b-', 'LineWidth', 2);
            xlabel('进化代数');
            ylabel('最优适应度');
            title('遗传算法收敛曲线');
            grid on;
        end
        
        function visualize_allocation(ga)
            % 可视化信道分配结果
            figure('Position', [100, 100, 1200, 800]);
            
            % 子图1: 网络拓扑
            subplot(2, 3, 1);
            scatter(ga.problem.cell_layout(:, 1), ga.problem.cell_layout(:, 2), ...
                100, 'filled', 'b');
            hold on;
            scatter(ga.problem.user_positions(:, 1), ga.problem.user_positions(:, 2), ...
                30, 'r', 'filled');
            title('网络拓扑');
            xlabel('X坐标');
            ylabel('Y坐标');
            legend('基站', '用户', 'Location', 'best');
            grid on;
            axis equal;
            
            % 子图2: 干扰矩阵
            subplot(2, 3, 2);
            imagesc(ga.problem.interference_map);
            colorbar;
            title('干扰矩阵');
            xlabel('小区编号');
            ylabel('小区编号');
            
            % 子图3: 需求矩阵
            subplot(2, 3, 3);
            imagesc(ga.problem.demand_matrix);
            colorbar;
            title('信道需求矩阵');
            xlabel('信道编号');
            ylabel('小区编号');
            
            % 子图4: 最优分配方案
            subplot(2, 3, 4);
            imagesc(ga.best_solution);
            colorbar;
            title('最优信道分配');
            xlabel('信道编号');
            ylabel('小区编号');
            
            % 子图5: 收敛曲线
            subplot(2, 3, 5);
            plot(1:ga.max_generations, ga.convergence, 'b-', 'LineWidth', 2);
            title('收敛曲线');
            xlabel('进化代数');
            ylabel('最优适应度');
            grid on;
            
            % 子图6: 性能指标
            subplot(2, 3, 6);
            metrics = calculate_performance_metrics(ga);
            bar(1:3, [metrics.satisfaction_rate, metrics.interference_level, metrics.utilization]);
            set(gca, 'XTickLabel', {'满足率', '干扰水平', '利用率'});
            title('性能指标');
            ylim([0, 1]);
            grid on;
            
            sgtitle('遗传算法动态信道分配结果');
        end
        
        function metrics = calculate_performance_metrics(ga)
            % 计算性能指标
            total_demand = sum(ga.problem.demand_matrix(:));
            total_allocated = sum(ga.best_solution(:));
            
            % 计算实际满足的需求
            satisfied_demand = 0;
            for i = 1:ga.problem.num_cells
                for ch = 1:ga.problem.num_channels
                    satisfied_demand = satisfied_demand + ...
                        min(ga.best_solution(i, ch), ga.problem.demand_matrix(i, ch));
                end
            end
            
            metrics.satisfaction_rate = satisfied_demand / total_demand;
            metrics.utilization = total_allocated / (ga.problem.num_cells * ga.problem.num_channels * 5);
            metrics.interference_level = 1 - ga.best_fitness;
        end
    end
end

3. 生物免疫算法实现

3.1 生物免疫算法核心类

classdef ImmuneAlgorithm
    % 生物免疫算法实现动态信道分配
    
    properties
        population_size    % 抗体种群大小
        memory_size       % 记忆细胞数量
        max_generations   % 最大迭代次数
        clone_rate       % 克隆率
        mutation_rate    % 变异率
        suppression_threshold % 抑制阈值
        problem          % 信道分配问题实例
        population       % 抗体种群
        memory_cells     % 记忆细胞
        fitness          % 适应度
        affinity         % 亲和度
        best_solution    % 最优解
        best_fitness     % 最优适应度
        convergence      % 收敛曲线
    end
    
    methods
        function ia = ImmuneAlgorithm(problem, config)
            % 初始化免疫算法
            ia.problem = problem;
            ia.population_size = config.population_size;
            ia.memory_size = config.memory_size;
            ia.max_generations = config.max_generations;
            ia.clone_rate = config.clone_rate;
            ia.mutation_rate = config.mutation_rate;
            ia.suppression_threshold = config.suppression_threshold;
            ia.convergence = zeros(config.max_generations, 1);
        end
        
        function ia = initialize_population(ia)
            % 初始化抗体种群
            fprintf('初始化免疫算法种群...\n');
            
            num_cells = ia.problem.num_cells;
            num_channels = ia.problem.num_channels;
            
            ia.population = zeros(ia.population_size, num_cells, num_channels);
            ia.fitness = zeros(ia.population_size, 1);
            ia.affinity = zeros(ia.population_size, 1);
            
            for i = 1:ia.population_size
                solution = generate_random_solution(ia, num_cells, num_channels);
                ia.population(i, :, :) = solution;
                ia.fitness(i) = ia.problem.evaluate_allocation(solution);
            end
            
            % 初始化记忆细胞
            ia.memory_cells = zeros(ia.memory_size, num_cells, num_channels);
            ia = update_memory_cells(ia);
            
            % 记录最优解
            [ia.best_fitness, best_idx] = max(ia.fitness);
            ia.best_solution = squeeze(ia.population(best_idx, :, :));
        end
        
        function solution = generate_random_solution(ia, num_cells, num_channels)
            % 生成随机解
            solution = zeros(num_cells, num_channels);
            for cell = 1:num_cells
                for ch = 1:num_channels
                    if rand() < 0.4
                        max_users = ia.problem.demand_matrix(cell, ch);
                        if max_users > 0
                            solution(cell, ch) = randi([0, max_users]);
                        end
                    end
                end
            end
        end
        
        function ia = evolve(ia)
            % 执行免疫算法进化
            fprintf('开始免疫算法进化...\n');
            
            for gen = 1:ia.max_generations
                % 计算亲和度
                ia = calculate_affinity(ia);
                
                % 克隆选择
                ia = clonal_selection(ia);
                
                % 亲和度成熟(变异)
                ia = affinity_maturation(ia);
                
                % 网络抑制
                ia = network_suppression(ia);
                
                % 更新记忆细胞
                ia = update_memory_cells(ia);
                
                % 更新最优解
                [current_best_fitness, best_idx] = max(ia.fitness);
                if current_best_fitness > ia.best_fitness
                    ia.best_fitness = current_best_fitness;
                    ia.best_solution = squeeze(ia.population(best_idx, :, :));
                end
                
                ia.convergence(gen) = ia.best_fitness;
                
                if mod(gen, 10) == 0
                    fprintf('代数 %d: 最优适应度 = %.4f\n', gen, ia.best_fitness);
                end
            end
        end
        
        function ia = calculate_affinity(ia)
            % 计算抗体亲和度(基于适应度和多样性)
            ia.affinity = ia.fitness; % 基础亲和度 = 适应度
            
            % 添加多样性惩罚
            for i = 1:ia.population_size
                diversity_penalty = 0;
                for j = 1:ia.population_size
                    if i ~= j
                        % 计算抗体间相似度
                        similarity = calculate_similarity(...
                            squeeze(ia.population(i, :, :)), ...
                            squeeze(ia.population(j, :, :)));
                        diversity_penalty = diversity_penalty + similarity;
                    end
                end
                % 相似度越高,亲和度惩罚越大
                ia.affinity(i) = ia.affinity(i) - 0.1 * (diversity_penalty / (ia.population_size-1));
            end
            
            % 确保亲和度非负
            ia.affinity = max(0, ia.affinity);
        end
        
        function similarity = calculate_similarity(antibody1, antibody2)
            % 计算两个抗体的相似度
            diff = abs(antibody1 - antibody2);
            max_possible_diff = max(antibody1(:)) + max(antibody2(:));
            if max_possible_diff == 0
                similarity = 0;
            else
                similarity = sum(diff(:)) / (numel(antibody1) * max_possible_diff);
            end
        end
        
        function ia = clonal_selection(ia)
            % 克隆选择操作
            num_cells = ia.problem.num_cells;
            num_channels = ia.problem.num_channels;
            
            % 根据亲和度选择抗体进行克隆
            clone_population = zeros(ia.population_size, num_cells, num_channels);
            clone_fitness = zeros(ia.population_size, 1);
            clone_affinity = zeros(ia.population_size, 1);
            
            clone_count = 1;
            
            for i = 1:ia.population_size
                clone_num = round(ia.affinity(i) * ia.clone_rate * ia.population_size);
                clone_num = max(1, clone_num); % 至少克隆1个
                
                for j = 1:clone_num
                    if clone_count > ia.population_size
                        break;
                    end
                    clone_population(clone_count, :, :) = ia.population(i, :, :);
                    clone_fitness(clone_count) = ia.fitness(i);
                    clone_affinity(clone_count) = ia.affinity(i);
                    clone_count = clone_count + 1;
                end
                if clone_count > ia.population_size
                    break;
                end
            end
            
            % 填充剩余位置
            while clone_count <= ia.population_size
                idx = randi(ia.population_size);
                clone_population(clone_count, :, :) = ia.population(idx, :, :);
                clone_fitness(clone_count) = ia.fitness(idx);
                clone_affinity(clone_count) = ia.affinity(idx);
                clone_count = clone_count + 1;
            end
            
            ia.population = clone_population;
            ia.fitness = clone_fitness;
            ia.affinity = clone_affinity;
        end
        
        function ia = affinity_maturation(ia)
            % 亲和度成熟(变异操作)
            num_cells = ia.problem.num_cells;
            num_channels = ia.problem.num_channels;
            
            for i = 1:ia.population_size
                individual = squeeze(ia.population(i, :, :));
                
                % 变异概率与亲和度成反比
                mutation_prob = ia.mutation_rate * (1 - ia.affinity(i));
                
                for cell = 1:num_cells
                    for ch = 1:num_channels
                        if rand() < mutation_prob
                            max_users = ia.problem.demand_matrix(cell, ch);
                            if max_users > 0
                                % 基于当前值的智能变异
                                current_val = individual(cell, ch);
                                if rand() < 0.5 && current_val < max_users
                                    individual(cell, ch) = current_val + 1;
                                elseif current_val > 0
                                    individual(cell, ch) = current_val - 1;
                                else
                                    individual(cell, ch) = randi([0, max_users]);
                                end
                            else
                                individual(cell, ch) = 0;
                            end
                        end
                    end
                end
                
                ia.population(i, :, :) = individual;
                ia.fitness(i) = ia.problem.evaluate_allocation(individual);
            end
        end
        
        function ia = network_suppression(ia)
            % 网络抑制(去除相似抗体)
            num_cells = ia.problem.num_cells;
            num_channels = ia.problem.num_channels;
            
            to_remove = false(ia.population_size, 1);
            
            for i = 1:ia.population_size
                if to_remove(i), continue; end
                
                for j = i+1:ia.population_size
                    if ~to_remove(j)
                        similarity = calculate_similarity(...
                            squeeze(ia.population(i, :, :)), ...
                            squeeze(ia.population(j, :, :)));
                        
                        if similarity > ia.suppression_threshold
                            % 移除适应度较低的抗体
                            if ia.fitness(i) > ia.fitness(j)
                                to_remove(j) = true;
                            else
                                to_remove(i) = true;
                                break;
                            end
                        end
                    end
                end
            end
            
            % 移除标记的抗体并用新抗体替换
            remove_count = sum(to_remove);
            if remove_count > 0
                new_antibodies = zeros(remove_count, num_cells, num_channels);
                new_fitness = zeros(remove_count, 1);
                
                for k = 1:remove_count
                    new_solution = generate_random_solution(ia, num_cells, num_channels);
                    new_antibodies(k, :, :) = new_solution;
                    new_fitness(k) = ia.problem.evaluate_allocation(new_solution);
                end
                
                ia.population(to_remove, :, :) = new_antibodies;
                ia.fitness(to_remove) = new_fitness;
            end
        end
        
        function ia = update_memory_cells(ia)
            % 更新记忆细胞
            [sorted_fitness, sorted_indices] = sort(ia.fitness, 'descend');
            top_indices = sorted_indices(1:min(ia.memory_size, ia.population_size));
            
            for i = 1:length(top_indices)
                ia.memory_cells(i, :, :) = ia.population(top_indices(i), :, :);
            end
            
            % 如果记忆细胞未满,用随机解填充
            if length(top_indices) < ia.memory_size
                for i = length(top_indices)+1:ia.memory_size
                    ia.memory_cells(i, :, :) = generate_random_solution(...
                        ia, ia.problem.num_cells, ia.problem.num_channels);
                end
            end
        end
        
        function plot_convergence(ia)
            % 绘制收敛曲线
            figure;
            plot(1:ia.max_generations, ia.convergence, 'r-', 'LineWidth', 2);
            xlabel('进化代数');
            ylabel('最优适应度');
            title('免疫算法收敛曲线');
            grid on;
        end
    end
end

4. 主程序与比较分析

4.1 主程序实现

function main_dynamic_channel_allocation()
    % 动态信道分配主程序
    
    fprintf('=== 动态信道分配算法比较 ===\n\n');
    
    % 系统配置
    config.num_cells = 7;      % 7个小区
    config.num_channels = 10;  % 10个信道
    config.num_users = 50;     % 50个用户
    
    % 遗传算法参数
    ga_config.population_size = 50;
    ga_config.max_generations = 100;
    ga_config.crossover_rate = 0.8;
    ga_config.mutation_rate = 0.1;
    ga_config.elitism_count = 5;
    
    % 免疫算法参数
    ia_config.population_size = 50;
    ia_config.memory_size = 10;
    ia_config.max_generations = 100;
    ia_config.clone_rate = 0.3;
    ia_config.mutation_rate = 0.15;
    ia_config.suppression_threshold = 0.1;
    
    % 创建问题实例
    fprintf('初始化动态信道分配问题...\n');
    problem = DynamicChannelAllocation(config);
    
    % 运行遗传算法
    fprintf('\n--- 遗传算法 ---\n');
    tic;
    ga = GeneticAlgorithm(problem, ga_config);
    ga = initialize_population(ga);
    ga = evolve(ga);
    ga_time = toc;
    
    fprintf('遗传算法运行时间: %.2f 秒\n', ga_time);
    fprintf('遗传算法最优适应度: %.4f\n', ga.best_fitness);
    
    % 运行免疫算法
    fprintf('\n--- 免疫算法 ---\n');
    tic;
    ia = ImmuneAlgorithm(problem, ia_config);
    ia = initialize_population(ia);
    ia = evolve(ia);
    ia_time = toc;
    
    fprintf('免疫算法运行时间: %.2f 秒\n', ia_time);
    fprintf('免疫算法最优适应度: %.4f\n', ia.best_fitness);
    
    % 性能比较
    fprintf('\n--- 性能比较 ---\n');
    compare_algorithms(ga, ia, problem);
    
    % 可视化结果
    fprintf('\n生成可视化结果...\n');
    visualize_comparison(ga, ia, problem);
end

function compare_algorithms(ga, ia, problem)
    % 比较两种算法的性能
    
    % 计算性能指标
    ga_metrics = calculate_detailed_metrics(problem, ga.best_solution);
    ia_metrics = calculate_detailed_metrics(problem, ia.best_solution);
    
    fprintf('\n性能指标对比:\n');
    fprintf('%-15s %-10s %-10s %-10s\n', '指标', '遗传算法', '免疫算法', '改善');
    fprintf('%-15s %-10.4f %-10.4f %-10.4f\n', '需求满足率', ...
        ga_metrics.satisfaction_rate, ia_metrics.satisfaction_rate, ...
        ia_metrics.satisfaction_rate - ga_metrics.satisfaction_rate);
    fprintf('%-15s %-10.4f %-10.4f %-10.4f\n', '信道利用率', ...
        ga_metrics.utilization, ia_metrics.utilization, ...
        ia_metrics.utilization - ga_metrics.utilization);
    fprintf('%-15s %-10.4f %-10.4f %-10.4f\n', '干扰水平', ...
        ga_metrics.interference, ia_metrics.interference, ...
        ia_metrics.interference - ga_metrics.interference);
    fprintf('%-15s %-10.4f %-10.4f %-10.4f\n', '公平性指数', ...
        ga_metrics.fairness, ia_metrics.fairness, ...
        ia_metrics.fairness - ga_metrics.fairness);
end

function metrics = calculate_detailed_metrics(problem, solution)
    % 计算详细的性能指标
    
    total_demand = sum(problem.demand_matrix(:));
    total_allocated = sum(solution(:));
    max_possible = problem.num_cells * problem.num_channels * 5;
    
    % 计算需求满足情况
    satisfied_demand = 0;
    for i = 1:problem.num_cells
        for ch = 1:problem.num_channels
            satisfied_demand = satisfied_demand + ...
                min(solution(i, ch), problem.demand_matrix(i, ch));
        end
    end
    
    % 计算干扰
    interference = 0;
    interference_pairs = 0;
    for ch = 1:problem.num_channels
        for i = 1:problem.num_cells
            if solution(i, ch) > 0
                for j = i+1:problem.num_cells
                    if solution(j, ch) > 0
                        interference = interference + ...
                            problem.interference_map(i, j) * solution(i, ch) * solution(j, ch);
                        interference_pairs = interference_pairs + 1;
                    end
                end
            end
        end
    end
    
    % 计算公平性(Jain's Fairness Index)
    cell_utilization = zeros(problem.num_cells, 1);
    for i = 1:problem.num_cells
        cell_utilization(i) = sum(solution(i, :)) / sum(problem.demand_matrix(i, :));
    end
    cell_utilization(isnan(cell_utilization)) = 0;
    
    fairness = (sum(cell_utilization))^2 / (problem.num_cells * sum(cell_utilization.^2));
    if isnan(fairness), fairness = 0; end
    
    metrics.satisfaction_rate = satisfied_demand / total_demand;
    metrics.utilization = total_allocated / max_possible;
    metrics.interference = interference / (problem.num_cells^2 * max(solution(:))^2);
    metrics.fairness = fairness;
end

function visualize_comparison(ga, ia, problem)
    % 可视化比较结果
    
    figure('Position', [50, 50, 1400, 900]);
    
    % 收敛曲线比较
    subplot(2, 3, 1);
    plot(1:ga.max_generations, ga.convergence, 'b-', 'LineWidth', 2);
    hold on;
    plot(1:ia.max_generations, ia.convergence, 'r-', 'LineWidth', 2);
    xlabel('进化代数');
    ylabel('最优适应度');
    title('算法收敛曲线比较');
    legend('遗传算法', '免疫算法', 'Location', 'southeast');
    grid on;
    
    % 性能指标比较
    subplot(2, 3, 2);
    ga_metrics = calculate_detailed_metrics(problem, ga.best_solution);
    ia_metrics = calculate_detailed_metrics(problem, ia.best_solution);
    
    metrics_names = {'需求满足率', '信道利用率', '干扰水平', '公平性'};
    ga_values = [ga_metrics.satisfaction_rate, ga_metrics.utilization, ...
                1 - ga_metrics.interference, ga_metrics.fairness];
    ia_values = [ia_metrics.satisfaction_rate, ia_metrics.utilization, ...
                1 - ia_metrics.interference, ia_metrics.fairness];
    
    bar_data = [ga_values; ia_values]';
    bar(bar_data);
    set(gca, 'XTickLabel', metrics_names);
    ylabel('性能值');
    title('性能指标比较');
    legend('遗传算法', '免疫算法', 'Location', 'best');
    grid on;
    
    % 遗传算法分配方案
    subplot(2, 3, 3);
    imagesc(ga.best_solution);
    colorbar;
    title('遗传算法分配方案');
    xlabel('信道编号');
    ylabel('小区编号');
    
    % 免疫算法分配方案
    subplot(2, 3, 4);
    imagesc(ia.best_solution);
    colorbar;
    title('免疫算法分配方案');
    xlabel('信道编号');
    ylabel('小区编号');
    
    % 需求矩阵
    subplot(2, 3, 5);
    imagesc(problem.demand_matrix);
    colorbar;
    title('信道需求矩阵');
    xlabel('信道编号');
    ylabel('小区编号');
    
    % 干扰矩阵
    subplot(2, 3, 6);
    imagesc(problem.interference_map);
    colorbar;
    title('小区干扰矩阵');
    xlabel('小区编号');
    ylabel('小区编号');
    
    sgtitle('动态信道分配算法比较结果');
end

% 运行主程序
main_dynamic_channel_allocation();

5. 实时动态调整

5.1 动态环境模拟

classdef DynamicEnvironment
    % 动态环境模拟
    
    properties
        base_problem      % 基础问题
        time_steps       % 时间步数
        traffic_patterns % 流量模式
        mobility_model   % 移动性模型
        event_schedule   % 事件调度
    end
    
    methods
        function de = DynamicEnvironment(base_problem, time_steps)
            de.base_problem = base_problem;
            de.time_steps = time_steps;
            de = initialize_traffic_patterns(de);
            de = initialize_mobility_model(de);
        end
        
        function de = initialize_traffic_patterns(de)
            % 初始化流量模式(日间变化)
            de.traffic_patterns = zeros(de.time_steps, de.base_problem.num_cells);
            
            for t = 1:de.time_steps
                % 模拟日间流量变化
                hour = mod(t, 24);
                if hour >= 8 && hour <= 18
                    % 白天高峰期
                    base_load = 0.7 + 0.3 * sin(2*pi*(hour-8)/10);
                else
                    % 夜间低峰期
                    base_load = 0.3 + 0.2 * cos(2*pi*(hour)/24);
                end
                
                % 添加随机波动
                for cell = 1:de.base_problem.num_cells
                    de.traffic_patterns(t, cell) = base_load * (0.8 + 0.4*rand());
                end
            end
        end
        
        function problem = get_problem_at_time(de, t)
            % 获取特定时间的信道分配问题
            problem = de.base_problem;
            
            % 根据流量模式调整需求矩阵
            scale_factors = de.traffic_patterns(t, :);
            for cell = 1:problem.num_cells
                problem.demand_matrix(cell, :) = ...
                    problem.demand_matrix(cell, :) * scale_factors(cell);
            end
        end
        
        function run_dynamic_simulation(de)
            % 运行动态仿真
            fprintf('开始动态信道分配仿真...\n');
            
            % 初始化算法
            config.num_cells = de.base_problem.num_cells;
            config.num_channels = de.base_problem.num_channels;
            config.num_users = de.base_problem.num_users;
            
            ga_config.population_size = 30;
            ga_config.max_generations = 50;
            
            ia_config.population_size = 30;
            ia_config.max_generations = 50;
            
            % 存储历史性能
            ga_performance = zeros(de.time_steps, 1);
            ia_performance = zeros(de.time_steps, 1);
            
            for t = 1:de.time_steps
                fprintf('时间步 %d/%d\n', t, de.time_steps);
                
                % 获取当前时间的问题
                current_problem = get_problem_at_time(de, t);
                
                % 遗传算法
                ga = GeneticAlgorithm(current_problem, ga_config);
                ga = initialize_population(ga);
                ga = evolve(ga);
                ga_performance(t) = ga.best_fitness;
                
                % 免疫算法
                ia = ImmuneAlgorithm(current_problem, ia_config);
                ia = initialize_population(ia);
                ia = evolve(ia);
                ia_performance(t) = ia.best_fitness;
            end
            
            % 绘制动态性能
            figure;
            plot(1:de.time_steps, ga_performance, 'b-', 'LineWidth', 2);
            hold on;
            plot(1:de.time_steps, ia_performance, 'r-', 'LineWidth', 2);
            plot(1:de.time_steps, de.traffic_patterns(:, 1), 'g--', 'LineWidth', 1);
            xlabel('时间步');
            ylabel('性能指标');
            title('动态环境下的算法性能');
            legend('遗传算法', '免疫算法', '流量负载', 'Location', 'best');
            grid on;
        end
    end
end

参考代码 用生物免疫算法和遗传算法实现动态信道分配 www.youwenfan.com/contentcnl/80038.html

总结

这个完整的动态信道分配解决方案提供了:

主要特点:

  1. 完整的问题建模:包含网络拓扑、干扰模型、需求分析
  2. 双算法实现:遗传算法和生物免疫算法
  3. 动态环境适应:支持时变流量模式
  4. 全面性能评估:多维度性能指标比较
  5. 可视化分析:丰富的图形化结果展示

算法优势:

  • 遗传算法:全局搜索能力强,实现相对简单
  • 免疫算法:具有记忆功能和多样性保持,适应动态环境更好

应用价值:

  • 为5G/6G网络资源管理提供智能解决方案
  • 可扩展至大规模网络场景
  • 支持实时动态调整和优化
posted @ 2025-11-14 11:33  我是一只小小鸟~  阅读(5)  评论(0)    收藏  举报