Ejemplo n.º 1
0
    /// <summary>
    /// 意思決定
    /// </summary>
    public int DecideIntention()
    {
        NumYArray xData = new NumYArray();

        xData.Add(situation);
        //ニューラルネットワークによる結果表示
        NumYArray            resultArray = new NumYArray(nn.Predict(xData));
        List <List <float> > resultList  = resultArray.Get();

        //ランダムによる意思決定
        float n      = Random.Range(0.0f, NumY.Sum(resultArray).Get()[0][0]);
        float offset = 0.0f;

        for (int i = 0; i < resultList[0].Count; i++)
        {
            offset += resultList[0][i];
            if (n <= offset)
            {
                intention = i;
                break;
            }
        }

        return(this.intention);
    }
Ejemplo n.º 2
0
 private void Button_Click_Export(object sender, RoutedEventArgs e)
 {//导出图表点击事件
  // ExportFunction();
     string[] sttime = new string[10];
     int[]    stnum  = new int[10];
     //sttime = Labels.ToArray();//将List<string> Labels存入string[] st 数组做流输出,存放横坐标的时间数据
     sttime = NumX.ToArray();
     stnum  = NumY.ToArray();
     //MessageBox.Show(st[9], "test");//测试消息框
     ExportFunction(sttime, stnum);
 }
Ejemplo n.º 3
0
 public void linestart(object sender, EventArgs e)
 {//折线图绘制函数
     Labels.Add(DateTime.Now.ToString("HH:mm:s"));
     Labels.RemoveAt(0);
     NumX.Add(DateTime.Now.ToString("HH:mm:s"));//同步存放需要导出的x轴数据
     NumX.RemoveAt(0);
     SeriesCollection[0].Values.Add(MainBusiness.numberPeople());
     SeriesCollection[0].Values.RemoveAt(0);
     NumY.Add(MainBusiness.numberPeople());//同步存放需要导出的y轴数据
     NumY.RemoveAt(0);
 }
Ejemplo n.º 4
0
    /// <summary>
    /// データを元に結果を予測する
    /// </summary>
    /// <param name="xData">予測する状況</param>
    /// <returns>予測結果</returns>
    public NumYArray Predict(NumYArray xData)
    {
        //順伝播・フォワードプロパゲーション
        NumYArray layerZ1 = new NumYArray(NumY.Dot(xData, this.w1) + this.b1);
        NumYArray layerA1 = new NumYArray(NumY.Sigmoid(layerZ1));
        NumYArray layerZ2 = new NumYArray(NumY.Dot(layerA1, this.w2) + this.b2);
        NumYArray layerA2 = new NumYArray(NumY.Sigmoid(layerZ2));

        NumYArray returnArray = new NumYArray(layerA2);

        return(returnArray);
    }
Ejemplo n.º 5
0
 private void Button_Click_Import(object sender, RoutedEventArgs e)
 {                               //导入图表点击事件
     OutputFunction(NumX, NumY); //调用流输入函数对动态图表的xy轴数据存储list进行重写
     int[]    numy = NumY.ToArray();
     string[] numx = NumX.ToArray();
     for (int i = 0; i < 10; i++)
     {
         Labels.Add(numx[i]);
         Labels.RemoveAt(0);
         MessageBox.Show(numx[i], "test");
         SeriesCollection[0].Values.Add(numy[i]);//因为没找到y轴数据对应的Ilist中存放数据的list,所以自己建立一个同步存放的list进行重写
         SeriesCollection[0].Values.RemoveAt(0);
     }
 }
Ejemplo n.º 6
0
 public NeuralNetwork(int inputUnits, int hiddenUnits, int outpuUnits, string folderName)
 {
     //学習値のデータがあるならそこから読み込む
     if (System.IO.File.Exists(@"Assets/Resources/AIData/" + folderName + "/LearningDataCSVw1.csv"))
     {
         w1 = NeuralReadCSV.readCSVData("AIData/" + folderName + "/LearningDataCSVw1");
         b1 = NeuralReadCSV.readCSVData("AIData/" + folderName + "/LearningDataCSVb1");
         w2 = NeuralReadCSV.readCSVData("AIData/" + folderName + "/LearningDataCSVw2");
         b2 = NeuralReadCSV.readCSVData("AIData/" + folderName + "/LearningDataCSVb2");
     }
     else
     {
         w1 = NumY.RandomArray(inputUnits, hiddenUnits, 1.0f, -1.0f);
         b1 = NumY.RandomArray(1, hiddenUnits, 1.0f, -1.0f);
         w2 = NumY.RandomArray(hiddenUnits, outpuUnits, 1.0f, -1.0f);
         b2 = NumY.RandomArray(1, outpuUnits, 1.0f, -1.0f);
     }
 }
Ejemplo n.º 7
0
    /// <summary>
    /// 入力されたデータを元にトレーニング
    /// </summary>
    /// <param name="epochs">トレーニング回数</param>
    /// <param name="learningRate">学習率</param>
    /// <returns></returns>
    public bool Train(int epochs, float learningRate, bool isTrainNow)
    {
        if (!isTrainNow)
        {
            NumYArray layerZ1 = new NumYArray();
            NumYArray layerA1 = new NumYArray();
            NumYArray layerZ2 = new NumYArray();
            NumYArray layerA2 = new NumYArray();

            NumYArray dlayerZ1 = new NumYArray();
            NumYArray dlayerZ2 = new NumYArray();
            NumYArray dw1      = new NumYArray();
            NumYArray db1      = new NumYArray();
            NumYArray dw2      = new NumYArray();
            NumYArray db2      = new NumYArray();

            totalTrainNum = 0;
            maxTrainNum   = Mathf.RoundToInt(100 / xData.Get().Count);
            if (maxTrainNum <= 0)
            {
                maxTrainNum = 1;
            }
            learnSpeed = 1;
        }

        nowTrainNum = 0;

        //規定回数学習させ、他処理のために途中で抜ける
        while (nowTrainNum < maxTrainNum * learnSpeed)
        {
            //許容値を超えているか判定する用出力結果
            //Array  a = Predict(xData);

            int m = xData.Get()[0].Count;

            //順伝播・フォワードプロパゲーション
            layerZ1 = NumY.Dot(xData, this.w1) + this.b1;
            layerA1 = NumY.Sigmoid(layerZ1);
            layerZ2 = NumY.Dot(layerA1, this.w2) + this.b2;
            layerA2 = NumY.Sigmoid(layerZ2);

            //誤差逆伝播法・バックプロパゲーション
            dlayerZ2 = (layerA2 - yData) / m;
            dw2      = NumY.Dot(layerA1.T, dlayerZ2);
            db2      = NumY.Sum(dlayerZ2, 0);

            dlayerZ1 = NumY.Dot(dlayerZ2, w2.T) * NumY.SigmoidDerivative(layerZ1);
            dw1      = NumY.Dot(xData.T, dlayerZ1);
            db1      = NumY.Sum(dlayerZ1, 0);

            //パラメータ更新
            w2 -= learningRate * dw2;
            b2 -= learningRate * db2;
            w1 -= learningRate * dw1;
            b1 -= learningRate * db1;

            nowTrainNum++;
            totalTrainNum++;

            if (totalTrainNum >= epochs)
            {
                this.xData    = new NumYArray();
                this.yData    = new NumYArray();
                totalTrainNum = 0;
                nowTrainNum   = 0;
                return(false);
            }
        }

        nowTrainNum = 0;
        return(true);
    }