###前提・実現したいこと
Unityで遺伝的アルゴリズムで作成した配列に従ってオブジェクトを移動させたいのですが、適用のさせかたがわかりません。
以下のスクリプトでWhile文の中で作成されたGene[0][]からGene[3][]の四つの配列の内容に従って四つのオブジェクトがそれぞれ移動し、10秒後にオブジェクトの位置をリセットし、次のWhileループに移動してそこで生成された配列でまたオブジェクトを動かし…というのをやりたいのですが、どうすればそれが実現できるのか、手元には入門書程度のものしかなく見当がつきません。
今はとりあえずプレハブで10秒ごとに生成しているのでInvokeを使ってオブジェクトを10秒ごとに消去することでリセットしています。今のスクリプトではエラーは出ていませんがオブジェクトの動きはランダムで、遺伝的アルゴリズムのスクリプトが蛇足となってしまっています。
###該当のソースコード
C#
1 2using System; 3using System.Collections; 4using System.Collections.Generic; 5using UnityEngine; 6 7public class Runbamove : MonoBehaviour { 8 9 // Use this for initialization 10 11 float interval = 1.0f; 12 float timer = 0; 13 14 void Start () { 15 Invoke ("DestroyObject", 10f); 16 } 17 18 //OneMax問題の遺伝的アルゴリズム 19 public void GA() 20 { 21 int[][] Gene = new int[4][];//親の遺伝子 22 int sum = 0; 23 24 for (int i = 0; i < 4; i++)//初期遺伝子の作成 25 { 26 Gene[i] = new int[10]; 27 for (int j = 0; j < 10; j++) 28 { 29 Gene[i][j] = UnityEngine.Random.Range(0, 2); 30 } 31 } 32 33 //配列の中身が全て1になるまで繰り返し 34 while (sum < 10) 35 { 36 37 //評価(配列の中身の合計値が大きい順に並べ替え) 38 int[] keys = new int[Gene.Length]; 39 for (int i = 0; i < keys.Length; i++) 40 { 41 foreach (int e in Gene[i]) 42 { 43 keys[i] -= e; 44 } 45 } 46 Array.Sort(keys, Gene); 47 48 //交叉 49 int[][] NGene = new int[2][];//次世代の遺伝子 50 int p = UnityEngine.Random.Range(0, 10);//交叉する箇所をランダムに決定 51 52 NGene[0] = new int[10];//エリート生存戦略 53 NGene[1] = new int[10]; 54 55 for (int m = 0; m < p; m++)//交叉処理 56 { 57 NGene[0][m] = Gene[0][m]; 58 NGene[1][m] = Gene[1][m]; 59 } 60 for (int n = p; n < 10; n++)//交叉処理 61 { 62 NGene[0][n] = Gene[1][n]; 63 NGene[1][n] = Gene[0][n]; 64 } 65 for (int a = 0; a < 10; a++)//作成した遺伝子を親とする 66 { 67 Gene[2][a] = NGene[0][a]; 68 Gene[3][a] = NGene[1][a]; 69 } 70 71 //突然変異 72 if (Gene[3][p] == 0) 73 {//4番目の遺伝子のうち、p-1番目が0だったら1に変える 74 Gene[3][p] = 1; 75 } 76 77 sum = 0; 78 79 foreach (int s in Gene[0]) 80 { 81 sum = sum + s; 82 } 83 } 84 } 85 86 // Update is called once per frame 87 void Update () { 88 timer -= Time.deltaTime;//時間の取得 89 for(int i = 0; i < 10 ; i++){ 90 if (timer < 0) { 91 int[] Gene = new int [10]; 92 Gene [i] = UnityEngine.Random.Range(0,2); 93 int a = Gene [i];//曲がる方向を配列で決定 94 if (a == 1) { 95 a = -30; 96 } else { 97 a = 30; 98 } 99 Vector3 w = new Vector3 (0f, a, 0f);//回転 100 transform.Rotate (w); 101 timer = interval; 102 } 103 } 104 Vector3 v = new Vector3 (0.5f, 0f, 0f);//移動 105 transform.Translate (v); 106 } 107 108 void DestroyObject(){ 109 Destroy (gameObject); 110 } 111} 112
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/03 06:25
2017/12/03 15:31