私は現在、ナップザックの問題に似ていると考えられる問題を解決するために遺伝的アルゴリズムをコーディングしていますが、差別化要因は、アイテムを複数の「トラック」に保管していることであり、それらの値/重要性は 1 = 最も重要、 3 = 最も重要でない。
これを行う方法は、バイナリ整数の配列を使用することです。0 = トラックに搭載されていない、1 = トラックに搭載されています。
ほとんどの場合、プログラムは必要なことを実行しているように見えます。染色体を比較して、世代ごとに最適な 3 つの個別の染色体を見つける場合を除きます。個々の染色体には同じアイテムを含めることはできません。アイテムは一度に 1 台のトラックにしか搭載できないためです。
これは、染色体を比較するために使用している関数です。
private int[] getBestSolution(int count)
{
int[] Genes = new int[3];
int min1 = Global.p.population[0].fitness;
int min2 = Global.p.population[0].fitness;
int min3 = Global.p.population[0].fitness;
int ref1 = 0;
int ref2 = 0;
int ref3 = 0;
bool areSame = true;
//searches for the first "Fittest" chromosome and stores to ref1
for (int i = 0; i < Global.population; i++)
{
if (min1 > Global.p.population[i].fitness)
{
min1 = Global.p.population[i].fitness;
ref1 = i;
}
}
//searches for 2nd fittest, while also checking they are different
for (int i = 0; i < Global.population; i++)
{
areSame = arrayCompare(Global.p.population[ref1].chromosome, Global.p.population[i].chromosome);
if(areSame == true)
{
continue;
}
if (min2 > Global.p.population[i].fitness)
{
min2 = Global.p.population[i].fitness;
ref2 = i;
}
}
//Searches for 3rd fittest while checking that it is different from the first two
for (int i = 0; i < Global.population; i++)
{
areSame = arrayCompare(Global.p.population[ref1].chromosome, Global.p.population[i].chromosome);
if (areSame == true)
{
continue;
}
areSame = arrayCompare(Global.p.population[ref2].chromosome, Global.p.population[i].chromosome);
if(areSame == true)
{
continue;
}
if (min3 > Global.p.population[i].fitness)
{
min3 = Global.p.population[i].fitness;
ref3 = i;
}
}
//stores the reference of each chromosome and return
Genes[0] = ref1;
Genes[1] = ref2;
Genes[2] = ref3;
return Genes;
}
これは、染色体を以前に選択した染色体と比較して、同じ値が含まれていないことを確認するために使用している関数です。
public bool arrayCompare(int[] a, int[] b)
{
for (int i = 0; i < a.Length; i++)
{
if ((a[i] == 1) && b[i] == 1)
{
return true;
}
}
return false;
}
コードのさまざまなポイントでブレークポイントを使用し、値と予想される値をチェックすることで、問題を引き起こしているこれら 2 つの関数に絞り込みました。
最後に、問題自体に。getBestSolution() は、最初の「最適な」値を完全に生成します。2 番目と 3 番目の値は、「population[0].fitness」として初期化された値のままで、表示されます。
値の違う染色体がなければ初期化されたままになると思っていたので、育種の選択基準である育種構造を変えてみました。これと同じ理由で、より大きな集団を使用してテストしたこともあるため、それらは私のコードに問題があるに違いないと考えています。
どんな助けでも大歓迎です。