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

📄 calobjvalue.m

📁 遗传算法解决排课问题
💻 M
字号:
% 2.2.3 计算目标函数值
% calobjvalue.m函数的功能是实现目标函数的计算,其公式采用本文示例仿真,可根据不同优化问题予以修改。
%遗传算法子程序
%Name: calobjvalue.m
%实现目标函数的计算
function [objvalue]=calobjvalue(pop)
%首先设置罚值(由约束条件转化而来)淘汰不低质种群(消除不可行解),再求可行种群的目标函数值
%*********首先引入由问题一提供的数据表得到的老师和学生班的对应关系矩阵tc1***********************
[NUMERIC,TXT,RAW]=xlsread('yuanshuju');
tc1=NUMERIC;
[px1,py1]=size(pop);
newin1=1;
pop1=zeros(size(pop))
%*****************第一轮淘汰************约束条件一(教室容量要求转化)
for i=1:px1   
    for j=1:py1
        r=0;
        T=0;
        t=0;
        if pop(i,j)=='1'
           [r1,T1,t1]=bianma(j);  %i种群j基因解码(得出对应的教室r,教师T,课时t)
           [class1,studentnumber1,weeklesson1,droom1]=tc(T1,tc1'); %得出T教师对应的class1,studentnumber1,weeklesson1,droom1
           [rnumber1,rongliang1,dr1]=jiaoshixinxi(r1);       %rnumber教室编码
                                                         %rongliang教室容量
                                                         %dr教室功能指数
           if studentnumber1<=rongliang1  %教室容量约束,满足要求者进入下一代
               pop1(newin1,:)=pop(i,:);
               newin1=newin1+1;
           end
        end
    end
end


%***************第二轮淘汰***************特殊教室使用资源约束
[px2,py2]=size(pop1);
r2=zeros(px2,py2);
T2=zeros(px2,py2);
t2=zeros(px2,py2);
rnumber2=zeros(px2,py2);
rongliang2=zeros(px2,py2);
dr2=zeros(px2,py2);
for i=1:py2
    for j=1:px2
        if pop1(i,j)=='1'
        [r2(j,i),T2(j,i),t2(j,i)]=bianma(i);
        [rnumber2(j,i),rongliang2(j,i),dr2(j,i)]=jiaoshixinxi(r2(j,i));
        end
    end
end
%****对同一次课使用的多媒体教师进行约束
sumdr=zeros(161,40);     %将dr2分成161*40的矩阵,以便于求出
droomnumber2=[9,16,20,21,23,25];  %多媒体教室编号
for k=1:px2
    for i=1:length(droomnumber2)
    %提取编码
    j=droomnumber2(i)*6440;
    k2=1;
    while j<(droomnumber2(i)+1)*6440
           newdr21(i,k2)=dr2(k,j);
           k2=k2+1;
           j=j+1;
    end
    newdr2=newdr21(i,:);
    sumdr2=zeros(40);
    for ii=1:40
        for jj=1:161
            sumdr2(ii)=sumdr2+newdr2(ii+(jj-1)*40);
        end
    end
    iii=0;
    while ii>0
        if sumdr2(ii)<6    %得到的同一次课同时占用的多媒体教室不能超过总的多媒体资源(6)
           iii=iii+1;
        end
        ii=ii-1;
    end
    if iii==length(sumdr2)
        pop2(k,:)=pop1(k,:);
    end
    end
end

%***************第3轮淘汰***************任一课时使用的总教室数不超过学校拥有的总量
[px3,py3]=size(pop2);
r3=zeros(px3,py3);
T3=zeros(px3,py3);
t3=zeros(px3,py3);
tongjir3=zeros(px3,py3);
for i=1:py3
    for j=1:px3
        if pop2(i,j)=='1'
        [r3(j,i),T3(j,i),t3(j,i)]=bianma(i);
        %先将r3中的非0值转化为1,从而将r3转化为一个(0,1)矩阵,便于统计
        tongjir3(j,i)=1;
        end
    end
end
for k3=1:px3
    sumr3=0;
    for i=1:40
       for j=1:27*161
          sumr3=sumr3+tongjir3(k3,i+(j-1)*40);
       end
    end
    if sumr3<27
      pop3(k3,:)=pop2(k3,:);
    end
end


%*******************计算目标函数******************
[px4,py4]=size(pop3);
r4=zeros(px4,py4);
T4=zeros(px4,py4);
t4=zeros(px4,py4);
class4=zeros(px4,py4);
studentnumber4=zeros(px4,py4);
weeklesson4=zeros(px4,py4);
droom4=zeros(px4,py4);
rnumber4=zeros(px4,py4);
rongliang4=zeros(px4,py4);
dr4=zeros(px4,py4);
objvalue=zeros(px4);
for i=1:px4 
    mubiao1=0;
    mubiao2=0;
    mubiao3=0;
    mubiao5=0;
    for j=1:py4
        if pop3(i,j)=='1'
           [r4(i,j),T4(i,j),t4(i,j)]=bianma(j);  
           [class4(i,j),studentnumber4(i,j),weeklesson4(i,j),droom4(i,j)]=tc(T4(i,j),tc1'); 
           [rnumber4(i,j),rongliang4(i,j),dr4(i,j)]=jiaoshixinxi(r4(i,j));
           %目标函数一max
           %输出课程权值(教学效果)
           [y,y1]=lessonname(T4(i,j));%y课程名,y1课程权值
           mubiao1=mubiao1+shijianxishu(t4(i,j))*y1/15;%除以总权重“15”是将得到的时间系数化为(0,1)之间的数
           %目标函数二max(教学资源的充分利用)
           mubiao2=mubiao2+studentnumber4(i,j)/rongliang4(i,j);
           %目标函数五min(可见学生流动量最少)一天中相邻课时上课的学生就是相邻课时的学生流动量
           if t4(i,j)/8==1
               mubiao5=mubiao5+0;
           elseif t4(i,j)/8==2
               mubiao5=mubiao5+0;
           elseif t4(i,j)/8==3
               mubiao5=mubiao5+0;
           elseif t4(i,j)/8==4
               mubiao5=mubiao5+0;
           elseif t4(i,j)/8==5
               mubiao5=mubiao5+0;
           else
              mubiao5=mubiao5+(studentnumber4(i,j)+studentnumber4(i,j+1))/7112;%7112为统计的个班级的学生认输总和
           end
        end
    objvalue(i)=mubiao1+mubiao2-mubiao5;%计算目标函数值
    end
%目标函数三min(同一课时使用的教室最少,且未占用教室的容量越大越好)
                %******首先求出同一课时使用的教室(因为是求最小值,因此叠加到总目标函数时是减而不是加)
                    for iiii=1:40
                       for jjjj=1:27*161
                           mubiao3=mubiao3+rongliang4(i,iiii+(jjjj-1)*40)/1077;%1077各种容量教室的容量和
                       end
                    end
                    objvalue(i)=-mubiao3;
end

%目标函数四min(同一课程尽量只用一个教室)
%目标函数六min(相邻授课间隔尽量均匀):以相隔课时差的平方为目标
r41=zeros(px4,py4);
T41=zeros(px4,py4);
t41=zeros(px4,py4);
for i=1:px4
    for j=1:py4
        if pop3(i,j)=='1'
        [r41(i,j),T41(i,j),t41(i,j)]=bianma(j);
        end
    end
    mubiao6=0;
    for j=2:py4
        for jj=1:j
        if T41(i,j)==T41(i,jj)
            mubiao6=mubiao6+(jj-j)^2;
        end
        end
    end
    objvalue(i)=-mubiao6/1600;
end
for k4=1:px4
    mubiao4=0;
    for i=1:40
       for j=1:27*161
          if r41(k4,i+j*40)==r41(k4,i+(j-1)*40)
              mubiao4=mubiao4+1;
          end
       end
    end
    objvalue(i)=-mubiao4/27;%27是总的教室资源,用同一课程用的教室数量除以总的教室数量得到该门课程的占用率,取极小
end    











⌨️ 快捷键说明

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