% 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
评论1