0

GAツールボックスを使用せずに、遺伝的アルゴリズムを使用してmatlabで看護師名簿ツールを開発しています。
個人は週ごとのスケジュールであり、週ごとのスケジュールであるため、看護師の数に等しい行と 7 つの列を持つ 2 次元配列として表されます。
フィットネス関数は母集団全体を取得し、適応度値を含む母集団のサイズに等しいサイズの配列を返します。

最適なスケジュールが最も低いフィットネス値を持つスケジュールになるように、フィットネス関数を最小化する必要があります。私のフィットネス関数は次のとおりです。

function fitness_values =Fitness_Function( thePopulation)
%UNTITLED Summary of this function goes here
%   Detailed explanation goes here
[Ar1 Ar2 popsize num_nur]  = Return_Data( 0,0,0,0 );
[prev_sched OffArr]=Return_Data1(0,0);
constraints=cell(popsize,1);
fitness_values=zeros(popsize,1); 
size=[1 7];
c1=zeros(popsize,1);
c1values=cell(popsize,1);
W1=0.25; %hard
W2=0.25; %hard
W3=0.25; %hard
W4=0.125; %soft
W5=0.125; %soft

for i=1: popsize
c1values{i}=zeros(size);
end
% Checking Constraint c1 (the difference between night and day shifts in
% each day of the schedule 
for i=1:popsize
for j=1:7
day_sum=0;
night_sum=0;
    for k=1:num_nur
      if thePopulation{i}(k,j)==1
          day_sum=day_sum+1;
      elseif thePopulation{i}(k,j)==2
          night_sum=night_sum+1;
      end
    end 
    abs_diff=abs(day_sum-night_sum);
    c1values{i}(1,j)=abs_diff.^2;
end
c1(i)=sum(c1values{i}(1,:));


%celldisp(c1values);
%defining the array that will hold the result of multiplying the number of
%violations with the correspondig weight,a cell array where each cell
%containts num_nur rows and 4 columns for c2, c3,c4 and c5.

nurse_fitness=zeros(num_nur,1);
for in=1:popsize
constraints{in}=zeros(num_nur,4);
end

for j=1:num_nur
      v2=0;
      v3=0;
      v4=0;
      %check violations with the previous schedule(the last day of the
      %previous schedule with the first day of the evaluated schedule
      % c2
      if prev_sched(j,7)==2 && thePopulation{i}(j,1)==1
          v2=v2+1;
      end
      % c3
      %check the last day of the previous schedule
       if prev_sched(j,7)==1 && thePopulation{i}(j,1)==1 && thePopulation{i}(j,2)~=3
              v3=v3+1;
       %check the last 2 days of the previous schedule       
       elseif prev_sched(j,6)==1 &&prev_sched(j,7)==1 && thePopulation{i}(j,2)~=3
              v3=v3+1;
       end
       %c4
       %check the last day of the previous schedule
       if prev_sched(j,7)==2 && thePopulation{i}(j,1)==3 &&thePopulation{i}(j,2)==1
              v4=v4+1;
       %check the last 2 days of the previous schedule       
       elseif prev_sched(j,6)==2 &&prev_sched(j,7)==3 && thePopulation{i}(j,2)==1
              v4=v4+1;
       end
       %check violations of constraints c2,c3 and c4 in the
       %evaluated schedule
       for k=1:6 
       %check violations of c2 N->N or N->O (hard)
       if thePopulation{i}(j,k)==2 &&  thePopulation{i}(j,k+1)==1 
          v2=v2+1;
       end
       end
       %check violations of c3 D->D->O     (hard)
      for k=1:5
          if thePopulation{i}(j,k)==1 && thePopulation{i}(j,k+1)==1 && thePopulation{i}(j,k+2)~=3
              v3=v3+1;
          end
       %check violations of c4 N->O->N or N->O->O (soft)
          if thePopulation{i}(j,k)==2 && thePopulation{i}(j,k+1)==3 && thePopulation{i}(j,k+2)==1
              v4=v4+1;
          end
      end
      constraints{i}(j,1)=v2*W2;
      constraints{i}(j,2)=v3*W3;
      constraints{i}(j,3)=v4*W4;
      %check violations of c5 (perefrences of each nurse)
      offdays=find(thePopulation{i}(j,:)==3);
      %disp(offdays);
      %disp(OffArr(j,:));
      %find intersection between the perefreces and the days off in the
      %schedule of each nurse
      inters=intersect(offdays,OffArr(j,:));
      num_inters=length(inters);
      if(length(offdays)==1)
      %for head nurse
      if num_inters==1
      constraints{i}(j,4)=0;
      else
      constraints{i}(j,4)=3*W5;
      end
      else
      penalty=3-num_inters;
      constraints{i}(j,4)=penalty*W5;
      end
      nurse_fitness(j)=sum(constraints{i}(j,:));
   end 
  %calculating the fitness value for the whole schedule 

  fitness_values(i)=W1*c1(i)+sum(nurse_fitness);
   end
  end

仕組みを要約します: セル配列 (母集団) が必要です。各セルには、行 = 看護師の数と 7 列 (週ごとのスケジュール) を持つマトリックスとして表されるスケジュールが含まれています。問題には 3 つのハード制約と 2 つのソフト制約があります。 、したがって、フィットネスは各スケジュールでこれらの制約の違反をチェックします。違反は、各看護師の違反の数に対応する制約の重みを掛けることによってペナルティが課されるため、最終的なフィットネス値は各看護師のペナルティ値の合計になります。 . 最後に、評価されたスケジュールのフィットネス値がフィットネス値の配列に保存されます (評価されたスケジュールが人口配列に格納されているのと同じインデックス)。

私の質問は、交差演算子と突然変異演算子の親を選択するのに適した選択演算子は何ですか?

4

1 に答える 1

1

あなたの質問に欠けている点:

  • 「個人」の配列の値の意味は何ですか?
  • 違反する可能性のある制約は何ですか?
  • 「個体」は、遺伝子型と表現型の両方を意味しますか?

これらを簡単な例で説明することもできると思います。他の人が最もよく理解できるように、GA用語を使用してください。

ここまでは一般的な回答しかできません。一般的には、違反していない個人を検索する方が良いと思います。私がすることは、複雑なフィッティング関数を使用しないことです。私はむしろ、(おそらく違反している) 遺伝子型から迅速に計算できる表現型を常に非違反の解決策にしたいと考えています。おそらく、遺伝子型は問題全体を把握するべきではなく、表現型を行う単純な割り当てアルゴリズムの出発点を与えるだけです.

違反していない染色体がある場合、突然変異は軽度の影響を与えるはずであり、同様の解決策につながります. あなたの染色体は潜在的にある種の順列であり、突然変異はこれらのいくつかの転位である可能性があります. クロスオーバーで生まれた子は、親のソリューションから離れ、その特性の一部を保持する必要があります。順列タイプの染色体については、標準の交差演算子を見つけることができます。

于 2012-12-02T16:28:15.667 に答える