⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subcarrier_allocation.m

📁 子载波的分配 考虑每个带宽的大小 及子信道的噪声 最后得出每个基站到用户的分配
💻 M
📖 第 1 页 / 共 2 页
字号:
                for j=1:1:subcarrier_number
                    if i~=j
                         if (C_max(occupy(j),i)+C_max(occupy(i),j))>(C_max(occupy(i),i)+C_max(occupy(j),j))
                            if (R1(t,occupy(i))-C_max(occupy(i),i)+C_max(occupy(i),j))>=R_least(1,occupy(i)) && (R1(t,occupy(j))-C_max(occupy(j),j)+C_max(occupy(j),i))>=R_least(1,occupy(j))
                                R1(t,occupy(i))=R1(t,occupy(i))-C_max(occupy(i),i)+C_max(occupy(i),j);
                                R1(t,occupy(j))=R1(t,occupy(j))-C_max(occupy(j),j)+C_max(occupy(j),i);
                            end
                         end
                    end
                end
            end
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            %fairness-aware allocation algorithm
            C=zeros(user_number(for_user_number),subcarrier_number,3);
            C=C_all;
            user_index=ones(1,user_number(for_user_number));
            subcarrier_index=ones(1,subcarrier_number);
            while sum(user_index)>0
                row_max=1;
                column_max=1;
                height_max=1;
                C_max=C(1,1,1);
                for i=1:1:user_number(for_user_number)
                    if user_index(1,i)>0
                        for j=1:1:subcarrier_number
                             for k=1:1:3
                                 if C(i,j,k)>C_max
                                     row_max=i;
                                     column_max=j;
                                     height_max=k;
                                     C_max=C(i,j,k);
                                 end
                             end
                        end
                    end
                end
                R2(t,row_max)=R2(t,row_max)+C_max;
                C(:,column_max,:)=0;
                subcarrier_index(1,column_max)=0;
                if R2(t,row_max)>=R_least(1,row_max)
                    user_index(1,row_max)=0;
                end
            end
            for j=1:1:subcarrier_number
                if subcarrier_index(1,j)>0
                    C1=zeros(user_number(for_user_number),3);
                    for m=1:1:user_number(for_user_number)
                        for k=1:1:3
                            C1(m,k)=C(m,j,k);
                        end
                    end
                    [max1,index]=max(max(C1'));
                    R2(t,index)=R2(t,index)+max1;
                end
            end    
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            %improved algorithm3
            occupy=zeros(1,subcarrier_number);
            C=zeros(user_number(for_user_number),subcarrier_number,3);
            C=C_all;
            C_max=zeros(user_number(for_user_number),subcarrier_number);
            for i=1:1:user_number(for_user_number)
                for j=1:1:subcarrier_number
                    C_max(i,j)=max(C(i,j,:));
                end
            end
            C_max2=C_max;
            occupy=zeros(1,subcarrier_number);
            for j=1:1:subcarrier_number
                [max1,index]=max(C_max(:,j));
                R3(t,index)=R3(t,index)+max1;
                occupy(1,j)=index;
            end
            for i=1:1:user_number(for_user_number)
                if R3(t,i)<R_least(1,i)
                    e=zeros(1,subcarrier_number);
                    for j=1:1:subcarrier_number
                        if occupy(1,j)~=i
                            e(1,j)=(C_max(occupy(1,j),j)-C_max(i,j))/C_max(i,j);
                        end
                    end
                    while R3(t,i)<R_least(1,i)
                        [e_min,index]=min(e);
                        if R3(t,occupy(1,index))-C_max(occupy(1,index),index)>=R_least
                            R3(t,occupy(1,index))=R3(t,occupy(1,index))-C_max(occupy(1,index),index);
                            R3(t,i)=R3(t,i)+C_max(i,index);
                        else
                            e(1,index)=100000;
                        end
                        if sum(e)==0
                            break;
                        end
                    end
                end
            end
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            %optimal-best
            occupy=zeros(1,subcarrier_number);
            C=zeros(user_number(for_user_number),subcarrier_number,3);
            C=C_all;
            C_max=zeros(user_number(for_user_number),subcarrier_number);
            for i=1:1:user_number(for_user_number)
                for j=1:1:subcarrier_number
                    C_max(i,j)=max(C(i,j,:));
                end
            end
            C_max2=C_max;
            occupy=zeros(1,subcarrier_number);
            for j=1:1:subcarrier_number
                [max1,index]=max(C_max(:,j));
                R4(t,index)=R4(t,index)+max1;
                occupy(1,j)=index;
            end
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            %rand algorithm
            C=zeros(user_number(for_user_number),subcarrier_number,3);
            C=C_all;
            C_max=zeros(user_number(for_user_number),subcarrier_number);
            for i=1:1:user_number(for_user_number)
                for j=1:1:subcarrier_number
                    select_index=rand;
                    if select_index<1/3
                        C_max(i,j)=C(i,j,1);
                    elseif select_index<2/3
                        C_max(i,j)=C(i,j,2);
                    else
                        C_max(i,j)=C(i,j,3);
                    end
                end
            end
            user_index=zeros(1,user_number(for_user_number));
            for i=1:1:user_number(for_user_number)
                user_index(i)=i;
            end
            for j=1:1:subcarrier_number
                while length(user_index)>=1
                    index=ceil(length(user_index)*rand); 
                    R5(t,user_index(1,index))=R5(t,user_index(1,index))+C_max(user_index(1,index),j);
                    if R5(t,user_index(1,index))>=R_least(1,user_index(1,index))
                        if length(user_index)>1
                            user_index(index)=[];
                        else
                            user_index=[];    
                        end
                    end
                end
                index=ceil(length(user_number(for_user_number))*rand);
                R5(t,index)=R5(t,index)+C_max(index,j);
            end     
        end
        R1_ave(cycle_number,for_user_number)=sum(sum(R1))/number;
        R2_ave(cycle_number,for_user_number)=sum(sum(R2))/number;
        R3_ave(cycle_number,for_user_number)=sum(sum(R3))/number;
        R4_ave(cycle_number,for_user_number)=sum(sum(R4))/number;
        R5_ave(cycle_number,for_user_number)=sum(sum(R5))/number;
    end
end
R1_user=zeros(1,length(user_number));
R2_user=zeros(1,length(user_number));
R3_user=zeros(1,length(user_number));
R4_user=zeros(1,length(user_number));
R5_user=zeros(1,length(user_number));
for i=1:1:length(user_number)
    R1_user(1,i)=sum(R1_ave(:,i))/(B*subcarrier_number*total_number);
    R2_user(1,i)=sum(R2_ave(:,i))/(B*subcarrier_number*total_number);
    R3_user(1,i)=sum(R3_ave(:,i))/(B*subcarrier_number*total_number);
    R4_user(1,i)=sum(R4_ave(:,i))/(B*subcarrier_number*total_number);
    R5_user(1,i)=sum(R5_ave(:,i))/(B*subcarrier_number*total_number);
end

figure
plot(user_number,R1_user,'r-*',user_number,R2_user,'r-+',user_number,R3_user,'b-*',user_number,R4_user,'b-+',user_number,R5_user,'b-v');
xlabel('Average SNR(dB)');
ylabel('Spectral Efficiency(bits/sec/Hz)');
grid on;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -