ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュのGAのプログラミング

  • mixiチェック
  • このエントリーをはてなブックマークに追加
U = {1,2,...,50}としたとき|Σ√ai-Σ√bi|(Σの上下はi=1からNa(後のほうはNb)まで。Na + Nb = 50)を最小とするNa、Nbを求める。
■GAで使用する個体数は20
■交叉方法は多点交叉(4点)
■選択方法はエリート選択(適応度上位の一部の個体をそのまま子個体として残し、残りはトーナメント選択により選択する。)

のプログラムを教えてください。
メッセージでお願い致します。

コメント(2)

付けたしです。
以下のプログラムを変更してトピックの条件にしたいのですが..

どこを変更すればいいですか?

class GA3
{
public static void main (String argv[])
{
int GA_length = 30; //GAの個体の長さ
int GA_num = 50; //GAの個体数

int x[][] = new int[GA_length][GA_num]; //GAの個体
int x_new[][] = new int[GA_length][GA_num]; //新しいGAの個体用

int p1,p2; //トーナメント選択で選んだ番号を記憶

int xx[] = new int[GA_length]; //個体1つ分を保存

//個体の初期化
for (int i=0; i<GA_length; i++)
{
for (int j=0; j<GA_num; j++)
{
x[i][j] = (int)(Math.random() * 2.0); //ランダムに代入
}
}

//GAの計算開始
for(int i=0; i<1000; i++)
{
for (int j=0; j<GA_num; j++)
{
//トーナメント選択
p1 = tournamentSelect(x);
p2 = tournamentSelect(x);

//交叉
xx = crossOver(p1, p2, x);
//突然変異
xx = mutation(xx);

//作成した固体xxをj番目の新しい答えに代入
for (int k=0; k<GA_length; k++)
{
x_new[k][j] = xx[k];
}
}
}
//x_newをxにコピー

//x_newのj番目の固体をxにコピー
for(int j=0; j<GA_num; j++)
{ //固体を丸ごとコピー
for (int k=0; k<GA_length; k++)
{ //固体の要素を1つずつコピー
x[k][j] = x_new[k][j];
}
}
//最終的な値を
for(int i=0; i< GA_num; i++)
{
System.out.print("x["+i+"]=");
for (int j=0; j<GA_length;j++)
{
System.out.print(x[j][i]+",");
}
System.out.println("Adaptation="+calcAdaptation(i,x));

}

}

// 交叉
static int [] crossOver(int p1, int p2, int x[][])
{
int x_new[] = new int[x.length]; //新しい個体

for (int i=0; i<x.length/2; i++)
{
x_new[i] = x[i][p1]; //p1から前半部をコピー
}
for (int i=5; i<x.length; i++)
{
x_new[i] = x[i][p2]; //p2から後半部をコピー
}
x_new[10] = x[10][p2]; //10番目の要素だけは別途コピー

return x_new;
}


// 突然変異
static int [] mutation(int x[])
{

for (int i=0; i<x.length; i++)
{
if (Math.random() < 0.01)
{ //もし1%以下ならば
if (x[i] == 0) x[i] = 1; //0と1を反転
else x[i] = 0;
}
}

return x; //新しい個体
}


// 適応度を計算
static double calcAdaptation(int num, int x[][])
{
double A =0.0, B = 0.0; //A,Bグループの平方根の計算

for (int i=0; i<x.length; i++)
{
if (x[i][num] == 1)
{ //個体内の要素が1ならば、
A += Math.sqrt(i+1); //Aグループに振り分ける
}
else
{ //個体内の要素が0ならば、
B += Math.sqrt(i+1); //Bグループに振り分ける
}
}

return Math.abs(A-B); //適応度|A-B|
}



//適応度を計算(適応度が大きい個体ほど良い個体)
static double calcAdaptation2(int num, int x[][])
{
double A =0.0, B = 0.0; //A,Bグループの平方根の計算

for (int i=0; i<x.length; i++)
{
if (x[i][num] == 1)
{ //個体内の要素が1ならば、
A += Math.sqrt(i+1); //Aグループに振り分ける
}
else
{ //個体内の要素が0ならば、
B += Math.sqrt(i+1); //Bグループに振り分ける
}
}

return 1.0 / Math.abs(A-B); //適応度1/|A-B|
}


// トーナメント選択
static int tournamentSelect(int x[][])
{
double V[] = new double [3]; //適応度を記憶
int p[] = new int[3]; //選んだ個体番号を記憶

// 3つの個体をランダムに選んで適応度を計算
for (int i=0; i<3; i++)
{
p[i] = (int)(Math.random() * x[0].length); //適当に個体を1つ選ぶ
V[i] = calcAdaptation( p[i], x); //適応度を計算
}

// Vの最小値を探す
if (V[0] < V[1])
{
if (V[0] < V[2])
{
return p[0]; //最小値 V[0]
}
else
{
return p[2]; //最小値 V[2]
}
}
else
{ //V[1]のほうが小さかった場合
if (V[1] < V[2])
{
return p[1]; //最小値 V[1]
}
else
{
return p[2]; //最小値 V[2]
}
}

}
//ルーレット選択
//calcAdaptation2を使う
static int rouletteSelect(int x[][])
{
double V[] = new double[x[0].length];//適応度を計算
double p[] = new double[x[0].length];//適応確立を計算

//(1)各個体の適応度を計算
//繰り返しを使ってcalcAdaptation2により計算→V[]に代入
for (int i=0; i<x[0].length; i++){
V[i] = calcAdaptation2(i,x);
}

//(2)適応度に応じて選択確立を計算
double Vsum = 0.0;//Vの合計を記憶

//(2-1)Vの合計Vsumを求める
for (int i=0; i<V.length; i++)
{
Vsum += V[i];
}

//(2-2)p[i] = V[1]/Vsumにより確立を計算
for(int i=0; i<p.length;i++)
{
p[i] = V[i] / Vsum;
}

//(3)選択確立に応じて個体を選択
//(3-1)[0.1]の数値をランダムに選択→probに代入
double prob;

prob = Math.random();
//(3-2)probの大きさに応じてp[]を元に個体を選択
//do 〜 whileの繰り返し命令(繰り返し回数が決まっていない、条件を満たしてる間)
double prob_sum = 0.0;//どこまで確認したのか
int num=0 ;//選択個体の番号
do{
prob_sum +=p[num++];
}while(prob_sum > prob);
num--;

return num ;//選択個体
}


}
メッセージでなくて良いのでよろしくお願い致します。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング