?? calobjvalue.asv
字號:
% 2.2.3 計算目標函數值
% calobjvalue.m函數的功能是實現目標函數的計算,其公式采用本文示例仿真,可根據不同優化問題予以修改。
%遺傳算法子程序
%Name: calobjvalue.m
%實現目標函數的計算
function [objvalue]=calobjvalue(pop)
%首先設置罰值(由約束條件轉化而來)淘汰不低質種群(消除不可行解),再求可行種群的目標函數值
%*********首先引入由問題一提供的數據表得到的老師和學生班的對應關系矩陣tc1***********************
[tc1,TXT,RAW]=xlsread('yuanshuju');
[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 + -