diff --git a/evolute.m b/evolute.m new file mode 100644 index 0000000..286aefc --- /dev/null +++ b/evolute.m @@ -0,0 +1,9 @@ +function [ selectedIndex ] = evolute( selectedIndex,randSNCount ) +%修改领域 +changeN=1;%选择多少时段进行修改。 +changedIndex=1:96; +changedIndex=changedIndex( round(1+(96-1)*rand(changeN,1)) ); +selectedIndex(:,changedIndex)=round(1+(16-1)*rand(randSNCount,changeN));%这是改变后的值 +% [ selectedWind,selectedSolar,candidateP ] = generateCandidate( snWind,snSolar,snP,randSNCount,selectedIndex ); +end + diff --git a/fitnessFun.m b/fitnessFun.m new file mode 100644 index 0000000..6189a46 --- /dev/null +++ b/fitnessFun.m @@ -0,0 +1,12 @@ +function [ fitness ] = fitnessFun( selectedWind,selectedSolar,candidateP,randSNCount ) +%计算适度函数 +fitness=0; +for I=1:randSNCount + for J=1:randSNCount + fitness=fitness+candidateP(I)*( abs( sum(selectedWind(I,:)-selectedWind(J,:)) )+abs( sum(selectedSolar(I)-selectedSolar(J)) ) ); + end +end +fitness=fitness/randSNCount/randSNCount; + +end + diff --git a/generateCandidate.m b/generateCandidate.m new file mode 100644 index 0000000..46fd9ff --- /dev/null +++ b/generateCandidate.m @@ -0,0 +1,14 @@ +function [ selectedWind,selectedSolar,candidateP ] = generateCandidate( snWind,snSolar,snP,randSNCount,selectedIndex ) +selectedWind=zeros(randSNCount,96); +selectedSolar=zeros(randSNCount,96); +selectedP=zeros(randSNCount,96); +for I=1:randSNCount + onesIndex=sparse(selectedIndex(I,:),1:96,1,16,96); + selectedWind(I,:)=sum(snWind.*onesIndex); + selectedSolar(I,:)=sum(snSolar.*onesIndex); + selectedP(I,:)=sum(snP.*onesIndex); +end +candidateP=prod(selectedP,2); +candidateP=candidateP./sum(candidateP); +end + diff --git a/initGA.m b/initGA.m new file mode 100644 index 0000000..b412366 --- /dev/null +++ b/initGA.m @@ -0,0 +1,6 @@ +function [ selectedIndex] = initGA( randSNCount ) +% 随机生成一下初始场景序列 +selectedIndex=round(1+(16-1)*rand(randSNCount,96)); + +end + diff --git a/main.m b/main.m index ebb6d86..0e8063a 100644 --- a/main.m +++ b/main.m @@ -7,31 +7,40 @@ snWind=data(:,1:3:end); snSolar=data(:,2:3:end); snP=data(:,3:3:end); snP(snP==-100)=1; +randSNCount=100; %要小于16^288 。解的场景数量 +gaCount=100;%粒子数 %% 初始化 -% 随机生成一下初始场景序列 -randSNCount=100; %要小于16^288 -selectedIndex=round(1+(16-1)*rand(randSNCount,96)); -selectedWind=zeros(randSNCount,96); -selectedSolar=zeros(randSNCount,96); -selectedP=zeros(randSNCount,96); -for I=1:randSNCount - onesIndex=sparse(selectedIndex(I,:),1:96,1,16,96); - selectedWind(I,:)=sum(snWind.*onesIndex); - selectedSolar(I,:)=sum(snSolar.*onesIndex); - selectedP(I,:)=sum(snP.*onesIndex); +ga=repmat(struct(),gaCount,1); +for I=1:gaCount + [ selectedIndex] = initGA( randSNCount ); + % [ selectedIndex] = evolute(selectedIndex,randSNCount ); + ga(I).selectedIndex=selectedIndex; + [ selectedWind,selectedSolar,candidateP ] = generateCandidate( snWind,snSolar,snP,randSNCount,ga(I).selectedIndex ); + [ fitness ] = fitnessFun( selectedWind,selectedSolar,candidateP,randSNCount ); + ga(I).fitness=fitness; end -candidateP=prod(selectedP,2); -candidateP=candidateP./sum(candidateP); -%计算适度函数 -fitness=0; -for I=1:randSNCount - for J=1:randSNCount - fitness=fitness+candidateP(I)*( abs( sum(selectedWind(I,:)-selectedWind(J,:)) )+abs( sum(selectedSolar(I)-selectedSolar(J)) ) ); + +bestFitness=0; +bestIndex=0; +for LOOP=1:100 + fprintf('第%d次迭代\n',LOOP); + fprintf('最好适度函数%f\n',bestFitness); + for I=1:gaCount + fitness=ga(I).fitness; + if fitness>bestFitness + bestFitness=fitness; + bestIndex=ga(I).selectedIndex; + end + end + + for I=1:gaCount + [ selectedIndex] = evolute(selectedIndex,randSNCount ); + ga(I).selectedIndex=selectedIndex; + [ selectedWind,selectedSolar,candidateP ] = generateCandidate( snWind,snSolar,snP,randSNCount,ga(I).selectedIndex ); + [ fitness ] = fitnessFun( selectedWind,selectedSolar,candidateP,randSNCount ); + ga(I).selectedIndex=selectedIndex; + ga(I).fitness=fitness; end end -fitness=fitness/randSNCount/randSNCount; -%修改领域 -changeN=5;%选择多少时段进行修改。 -changedIndex=1:96; -changedIndex=changedIndex( round(1+(96-1)*rand(changeN,1)) ); -selectedIndex(:,changedIndex)=round(1+(16-1)*rand(randSNCount,changeN));%这是改变后的值 + +