public double TarinNetwork(float[][] inputs, float[][] outputs, int samplingCellsCount, int inputNeuronsCount,
                                   int outputNeuronsCount, int hiddenLayerNeuronsCount, double learningRate,
                                   int iterations, System.Windows.Forms.Label labelTrainTest, System.Windows.Forms.Label labelTrainningAccuracy,
                                   System.Windows.Forms.Label labelValidationAccuracy, ZedGraphControl zedGraphControl)
        {
            network = new ActivationNetwork(
                new SigmoidFunction(), inputNeuronsCount, hiddenLayerNeuronsCount, outputNeuronsCount);
            ParallelResilientBackpropagationLearning teacher = new ParallelResilientBackpropagationLearning(network);

            teacher.LearningRate = learningRate;

            double[][] trainInput  = GeneralOpertor.GetArray(inputs, 0.8, true, inputNeuronsCount);
            double[][] testInput   = GeneralOpertor.GetArray(inputs, 0.8, false, inputNeuronsCount);
            double[][] trainOutput = GeneralOpertor.GetArray(outputs, 0.8, true, outputNeuronsCount);
            double[][] testOutput  = GeneralOpertor.GetArray(outputs, 0.8, false, outputNeuronsCount);

            int    iteration = 0;
            double error     = 1;

            zedGraphControl.GraphPane.CurveList.Clear();
            PointPairList list = new PointPairList();

            while ((error > 0.01) && (iteration <= iterations))
            {
                error = teacher.RunEpoch(trainInput, trainOutput) * 2 / samplingCellsCount;
                if (iteration == 0)
                {
                    list.Add(iteration, error);
                    zedGraphControl.GraphPane.AddCurve("Error", list, System.Drawing.Color.FromArgb(255, 0, 0));
                    zedGraphControl.GraphPane.AxisChange();
                }
                else if ((iteration % 30 == 0) || (iteration == iterations))
                {
                    zedGraphControl.GraphPane.CurveList[0].AddPoint(iteration, error);
                    zedGraphControl.GraphPane.AxisChange();
                    labelTrainTest.Text = "Iteration:" + iteration + ", Error:" + error.ToString("0.00000");
                    Application.DoEvents();
                }
                zedGraphControl.Refresh();
                iteration++;
            }

            double accuracy = GetAccuracy(trainInput, trainOutput, network);

            labelTrainningAccuracy.Text = (accuracy * 100).ToString("0.000") + " %";
            accuracy = GetAccuracy(testInput, testOutput, network);
            labelValidationAccuracy.Text = (accuracy * 100).ToString("0.000") + " %";

            return(error);
        }
Пример #2
0
 private void buttonLoadLanduseConfig_Click(object sender, EventArgs e)
 {
     dataGridViewLandUse.Rows.Clear();
     using (OpenFileDialog ofd = new OpenFileDialog())
     {
         ofd.Filter = resourceManager.GetString("String52");
         ofd.Title  = resourceManager.GetString("String53");
         if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
         {
             System.IO.StreamReader streamReader = new System.IO.StreamReader(ofd.FileName);
             System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(LandUseClassificationInfo));
             landUseClassificationInfo = (LandUseClassificationInfo)xmlSerializer.Deserialize(streamReader);
             streamReader.Close();
             for (int i = 0; i < landUseClassificationInfo.AllTypesCount; i++)
             {
                 StructLanduseInfo strucLanduseInfo = landUseClassificationInfo.AllTypes[i];
                 dataGridViewLandUse.Rows.Add();
                 if (System.Globalization.CultureInfo.CurrentCulture.Parent.Name == "zh-CHS")
                 {
                     dataGridViewLandUse.Rows[i].Cells[1].Value = strucLanduseInfo.LanduseTypeChsName;
                 }
                 else if (System.Globalization.CultureInfo.CurrentCulture.Parent.Name == "zh-CHT")
                 {
                     dataGridViewLandUse.Rows[i].Cells[1].Value = strucLanduseInfo.LanduseTypeChtName;
                 }
                 else
                 {
                     dataGridViewLandUse.Rows[i].Cells[1].Value = strucLanduseInfo.LanduseTypeEnName;
                 }
                 dataGridViewLandUse.Rows[i].Cells[0].Value = strucLanduseInfo.LanduseTypeValue;
                 dataGridViewLandUse.Rows[i].Cells[3].Value =
                     GeneralOpertor.GetBitmap(15, 15, Color.FromArgb(strucLanduseInfo.LanduseTypeColorIntValue));
                 if (landUseClassificationInfo.UrbanValues.Contains(strucLanduseInfo))
                 {
                     dataGridViewLandUse.Rows[i].Cells[2].Value = resourceManager.GetString("String8");
                 }
                 else if (landUseClassificationInfo.ConvertValues.Contains(strucLanduseInfo))
                 {
                     dataGridViewLandUse.Rows[i].Cells[2].Value = resourceManager.GetString("String6");
                 }
                 else
                 {
                     dataGridViewLandUse.Rows[i].Cells[2].Value = resourceManager.GetString("String7");
                 }
             }
         }
     }
 }
Пример #3
0
        public void DoSimulation()
        {
            try
            {
                //0准备开始模拟
                ResourceManager resourceManager = VariableMaintainer.CurrentResourceManager;
                FormANNCAWizard formANNCAWizard = VariableMaintainer.CurrentFormANNCAWizard;
                Random          random          = new Random();
                Stopwatch       stopWatch       = new Stopwatch();
                stopWatch.Start();
                //0.1获得数据
                int rowCount    = formANNCAWizard.CurrentStructRasterMetaData.RowCount;
                int columnCount = formANNCAWizard.CurrentStructRasterMetaData.ColumnCount;
                float[,] simulationStartImage = formANNCAWizard.SimulationStartImage;
                float[,] simulationEndImage   = formANNCAWizard.SimulationEndImage;
                float[,] simulationImage      = formANNCAWizard.SimulationImage;

                //0.2计算初始每种土地利用类型的单元数量
                List <StructLanduseInfoAndCount> listLanduseInfoAndCount;   //记录每种土地利用类型的单元数
                listLanduseInfoAndCount = new List <StructLanduseInfoAndCount>();
                StructLanduseInfoAndCount landuseInfoAndCount;
                foreach (StructLanduseInfo structLanduseInfo in formANNCAWizard.LandUseClassificationInfo.AllTypes)
                {
                    landuseInfoAndCount = new StructLanduseInfoAndCount();
                    landuseInfoAndCount.structLanduseInfo = structLanduseInfo;
                    landuseInfoAndCount.LanduseTypeCount  = 0;
                    listLanduseInfoAndCount.Add(landuseInfoAndCount);
                }
                for (int i = 0; i < rowCount; i++)
                {
                    for (int j = 0; j < columnCount; j++)
                    {
                        CommonLibrary.GeneralOpertor.ChangeLandUseCount(simulationStartImage[i, j], -10000, listLanduseInfoAndCount);
                    }
                }

                //0.3显示输出结果窗体和图表窗体
                dockableWindowGraphy.GraphTitle = resourceManager.GetString("String40");
                dockableWindowGraphy.XAxisTitle = resourceManager.GetString("String41");
                dockableWindowGraphy.YAxisTitle = resourceManager.GetString("String42");
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String43"));
                Application.DoEvents();
                //0.4绘制初始的图表
                List <string> listPointPairListName = new List <string>();
                List <string> notToDrawList         = new List <string>();
                notToDrawList.Add(resourceManager.GetString("String44"));
                dockableWindowGraphy.CreateGraph(listLanduseInfoAndCount, notToDrawList, out listPointPairListName);
                dockableWindowGraphy.RefreshGraph();

                int          convertedCellCount = 0;                                                                 //模拟中总共转换的元胞数量
                int          randomRow, randomColumn;                                                                //Monte Carlo方法选取的随机行和随机列
                int          convertCountInOneIteration = formANNCAWizard.ConvertCount / formANNCAWizard.Iterations; //每次迭代应转换的数量
                int          convertCountOnce = 0;                                                                   //每次迭代已经转换的数量
                float        oldValue, newValue;                                                                     //每次转换前土地利用类型的新值和旧值
                int          iteration = 0;                                                                          //迭代的次数
                List <float> listLanduseValues = new List <float>();                                                 //记录土地利用类型值的List
                for (int j = 0; j < formANNCAWizard.LandUseClassificationInfo.AllTypesCount; j++)
                {
                    listLanduseValues.Add(formANNCAWizard.LandUseClassificationInfo.AllTypes[j].LanduseTypeValue);
                }
                int neiWindowSize      = formANNCAWizard.NeighbourWindowSize;
                int inputNeuronsCount  = formANNCAWizard.InputNeuronsCount;
                int outputNeuronsCount = formANNCAWizard.OutputNeuronsCount;
                //2.开始进行转换
                while (convertedCellCount < formANNCAWizard.ConvertCount)
                {
                    convertCountOnce = 0;

                    //2.3选择元胞与随机比较进行转换
                    //完成一次迭代
                    while (convertCountOnce < convertCountInOneIteration)
                    {
                        //随机选择一个栅格进行计算
                        randomRow    = random.Next(0, rowCount);
                        randomColumn = random.Next(0, columnCount);

                        //计算逻辑为:
                        //这里需要首先获取当前元胞的输入值
                        //然后通过神经网络计算每种土地利用类型的概率,乘以随机量
                        //然后选出最高的概率
                        //再查看是否是同样的土地利用类型,如果不是则转变
                        //如果不是并且概率大于一个值,则进行转变(目前先不用)

                        //如果是空值,则不进行计算
                        if (simulationImage[randomRow, randomColumn] == -9999f)
                        {
                            continue;
                        }

                        double[] tempInputsArray  = new double[inputNeuronsCount];
                        double[] tempOutputsArray = new double[outputNeuronsCount];
                        //获取该栅格的空间变量值
                        for (int i = 0; i < formANNCAWizard.ListVaribaleImages.Count; i++)
                        {
                            tempInputsArray[i] = formANNCAWizard.ListVaribaleImages[i][randomRow, randomColumn];
                        }
                        //获取该栅格的邻域值
                        NeighbourOperator neighbourOperator = new NeighbourOperator();
                        float[]           counts            = neighbourOperator.GetNeighbourCount(simulationImage, randomRow, randomColumn, neiWindowSize,
                                                                                                  rowCount, columnCount, formANNCAWizard.LandUseClassificationInfo.AllTypesCount, listLanduseValues);
                        for (int z = 0; z < counts.Length; z++)
                        {
                            tempInputsArray[formANNCAWizard.ListVaribaleImages.Count + z] = counts[z] / (neiWindowSize * neiWindowSize - 1);
                        }
                        //获取该栅格的土地利用类型
                        tempInputsArray[inputNeuronsCount - 1] = simulationImage[randomRow, randomColumn];

                        //计算神经网络输出的概率值
                        double[] output    = formANNCAWizard.ANN.ANNActivationNetwork.Compute(tempInputsArray);
                        double   maxOutput = 0;
                        int      maxIndex  = -1;
                        Random   r         = new Random(1);
                        double   gamma;
                        double   disturbance;
                        double   probability;
                        double[] probabilityArray = new double[output.Length];
                        for (int k = 0; k < output.Length; k++)
                        {
                            gamma               = random.NextDouble();
                            disturbance         = 1 + Math.Pow((-Math.Log(gamma)), formANNCAWizard.Delta);
                            probabilityArray[k] = disturbance * output[k];
                            if (maxOutput < probabilityArray[k])
                            {
                                maxOutput = probabilityArray[k];
                                maxIndex  = k;
                            }
                        }
                        probability = maxOutput;  //计算最高值的最终概率

                        //未使用邻域因素模拟较为散,所以加入邻域因素。但可能导致难以达到需要的转换数量,模拟时间过长。
                        double neiValue = 0f;
                        for (int t = 0; t < listLanduseValues.Count; t++)
                        {
                            if (listLanduseValues[t] == formANNCAWizard.LandUseClassificationInfo.UrbanValues[0].LanduseTypeValue)
                            {
                                neiValue = Convert.ToDouble(counts[t]) / (neiWindowSize * neiWindowSize - 1);
                                break;
                            }
                        }
                        probability = probability * neiValue;

                        //得到应转变为的土地利用类型值,以及当前土地利用类型值
                        newValue = formANNCAWizard.LandUseClassificationInfo.AllTypes[maxIndex].LanduseTypeValue;
                        oldValue = simulationImage[randomRow, randomColumn];
                        //oldValue有时取到0值等不正确的值
                        bool isOldValueCorrect = false;
                        for (int w = 0; w < formANNCAWizard.LandUseClassificationInfo.AllTypes.Count; w++)
                        {
                            if (oldValue == formANNCAWizard.LandUseClassificationInfo.AllTypes[w].LanduseTypeValue)
                            {
                                isOldValueCorrect = true;
                            }
                        }
                        if (!isOldValueCorrect)
                        {
                            continue;
                        }
                        //根据转换矩阵进行判断是否可以转换
                        DataTable dtMatrix      = formANNCAWizard.DTMatrix;
                        int       oldValueIndex = -1;
                        for (int k = 0; k < formANNCAWizard.LandUseClassificationInfo.AllTypesCount; k++)
                        {
                            if (formANNCAWizard.LandUseClassificationInfo.AllTypes[k].LanduseTypeValue == oldValue)
                            {
                                oldValueIndex = k;
                                break;
                            }
                        }
                        string canConvert = dtMatrix.Rows[oldValueIndex][maxIndex].ToString();
                        if (canConvert == "0")
                        {
                            continue;
                        }

                        //与设定的阈值进行比较
                        double convertThreshold = formANNCAWizard.ConvertThreshold;
                        if ((oldValue != newValue) && (probability >= convertThreshold))
                        {
                            simulationImage[randomRow, randomColumn] = newValue;
                            CommonLibrary.GeneralOpertor.ChangeLandUseCount(newValue, oldValue, listLanduseInfoAndCount);
                            //以城市用地的转变量为总转变量的标准
                            for (int w = 0; w < formANNCAWizard.LandUseClassificationInfo.UrbanValues.Count; w++)
                            {
                                if (newValue == formANNCAWizard.LandUseClassificationInfo.UrbanValues[w].LanduseTypeValue)
                                {
                                    convertCountOnce++;
                                    convertedCellCount++;
                                }
                            }
                            //System.Diagnostics.Debug.WriteLine(convertedCellCount + " - Old: " + oldValue + " New: " + newValue);
                        }
                    }
                    iteration++;
                    System.Diagnostics.Debug.WriteLine("iteration: " + iteration);

                    //2.4.刷新外部界面并输出中间结果数据
                    if (convertedCellCount == 1 || (iteration % formANNCAWizard.RefreshInterval == 0 && convertedCellCount != 0))
                    {
                        //刷新图像
                        formANNCAWizard.SimulationImage  = simulationImage;
                        VariableMaintainer.IsNeedRefresh = true;

                        //刷新图表窗体
                        string landuseTypeName = "";
                        for (int k = 0; k < listLanduseInfoAndCount.Count; k++)
                        {
                            for (int l = 0; l < listPointPairListName.Count; l++)
                            {
                                if (System.Globalization.CultureInfo.CurrentCulture.Parent.Name == "zh-CHS")
                                {
                                    landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeChsName;
                                }
                                else if (System.Globalization.CultureInfo.CurrentCulture.Parent.Name == "zh-CHT")
                                {
                                    landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeChtName;
                                }
                                else
                                {
                                    landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeEnName;
                                }
                                if (landuseTypeName == listPointPairListName[l])
                                {
                                    dockableWindowGraphy.UpdateData(iteration, listLanduseInfoAndCount[k].LanduseTypeCount, l);
                                }
                            }
                        }
                        dockableWindowGraphy.RefreshGraph();

                        //刷新输出结果窗体
                        dockableWindowOutput.AppendText("\n");
                        dockableWindowOutput.AppendText(resourceManager.GetString("String45") + iteration.ToString()
                                                        + resourceManager.GetString("String46"));
                        dockableWindowOutput.AppendText("\n");
                        dockableWindowOutput.AppendText(resourceManager.GetString("String47") + convertedCellCount.ToString());
                        dockableWindowOutput.AppendText("\n");
                        dockableWindowOutput.ScrollTextbox();
                        Application.DoEvents();
                    }
                    //输出中间结果
                    if (formANNCAWizard.IsOutput && (iteration % formANNCAWizard.OutputImageInterval == 0))
                    {
                        GeneralOpertor.WriteDataFloat(formANNCAWizard.OutputFolder + @"\" + GeneralOpertor.GetNowString()
                                                      + "_ann_iterate_" + iteration.ToString() + @".txt", simulationImage, rowCount, columnCount);
                    }
                }

                //3.完成模拟,输出结果。
                stopWatch.Stop();
                VariableMaintainer.IsSimulationFinished = true;
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String48"));
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String49") +
                                                GeneralOpertor.GetElapsedTimeString(stopWatch.Elapsed));
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText("\n");

                //修改结果栅格的属性表
                IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();
                IRasterWorkspace  rasterWorkspace  = workspaceFactory.OpenFromFile(
                    VariableMaintainer.CurrentFormANNCAWizard.OutputFolder, 0) as IRasterWorkspace;
                IRasterDataset      rasterDataset      = rasterWorkspace.OpenRasterDataset(VariableMaintainer.CurrentFoucsMap.get_Layer(0).Name);
                IRasterDatasetEdit3 rasterDatasetEdit3 = rasterDataset as IRasterDatasetEdit3;
                rasterDatasetEdit3.BuildAttributeTable();
                IRasterDataset3 rasterDataset3 = rasterDataset as IRasterDataset3;
                rasterDataset3.Refresh();

                if (formANNCAWizard.SimulationEndImageName != "")
                {
                    //GeneralOpertor.WriteDataFloat(formLogisticCAWizard.OutputFolder + @"\CA_ANN_Reslut" + GeneralOpertor.GetNowString() + ".txt",
                    //    simulationImage, rowCount,columnCount);

                    DataTable dtMatrixNumber = GeneralOpertor.GetMultiTypesMatrix(
                        simulationImage, simulationEndImage, rowCount, columnCount, formANNCAWizard.LandUseClassificationInfo);
                    double overallAccuracy = 0d;
                    double kappa           = 0d;
                    GeneralOpertor.GetMultiTypesAccuracy(dtMatrixNumber, ref overallAccuracy, ref kappa, formANNCAWizard.LandUseClassificationInfo);
                    FormConfusionMatrix formConfusionMatrix = new FormConfusionMatrix();
                    formConfusionMatrix.DataTableValues = dtMatrixNumber;
                    DataTable dtMatrixPercent = dtMatrixNumber.Clone();
                    GeneralOpertor.CopyDataTableValues(dtMatrixNumber, dtMatrixPercent);
                    formConfusionMatrix.DataTablePercents = dtMatrixPercent;
                    formConfusionMatrix.DataGridViewConfusionMatrix.DataSource = dtMatrixNumber;
                    formConfusionMatrix.LabelOverallAccuracy.Text = (overallAccuracy * 100).ToString("0.00") + " %";
                    formConfusionMatrix.LabelKappa.Text           = kappa.ToString("0.000");

                    float[] fomValues = GeneralOpertor.GetMultiFoMAccuracy(simulationStartImage, simulationEndImage, simulationImage, rowCount, columnCount);
                    formConfusionMatrix.LabelFoMValues.Text = "A: " + fomValues[0] + "\nB: " + fomValues[1] +
                                                              "\nC: " + fomValues[2] + "\nD: " + fomValues[3];
                    formConfusionMatrix.LabelFoM.Text = fomValues[4].ToString("0.000");
                    formConfusionMatrix.LabelPA.Text  = fomValues[5].ToString("0.000");
                    formConfusionMatrix.LabelUA.Text  = fomValues[6].ToString("0.000");

                    dockableWindowOutput.AppendText("\n");
                    dockableWindowOutput.AppendText(resourceManager.GetString("String84"));
                    dockableWindowOutput.AppendText("\n");
                    dockableWindowOutput.AppendText(GeneralOpertor.WriteCoufusionMatrix(dtMatrixPercent));
                    dockableWindowOutput.AppendText("\n");
                    dockableWindowOutput.AppendText(resourceManager.GetString("String83"));
                    dockableWindowOutput.AppendText("\n");
                    dockableWindowOutput.AppendText(resourceManager.GetString("String85") + (overallAccuracy * 100).ToString("0.00") + " %");
                    dockableWindowOutput.AppendText("\n");
                    dockableWindowOutput.AppendText(resourceManager.GetString("String86") + kappa.ToString("0.000"));
                    dockableWindowOutput.AppendText("\n");
                    dockableWindowOutput.AppendText(resourceManager.GetString("String87") + fomValues[4].ToString("0.000"));
                    dockableWindowOutput.AppendText("\n");
                    dockableWindowOutput.AppendText(resourceManager.GetString("String88") + fomValues[5].ToString("0.000"));
                    dockableWindowOutput.AppendText("\n");
                    dockableWindowOutput.AppendText(resourceManager.GetString("String89") + fomValues[6].ToString("0.000"));
                    dockableWindowOutput.AppendText("\n");
                    formConfusionMatrix.Text = resourceManager.GetString("String105") + " - " + formANNCAWizard.SimulationLayerName;
                    formConfusionMatrix.ShowDialog();
                }
                dockableWindowOutput.AppendText("-------------------------------------------");
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.ScrollTextbox();
                Application.DoEvents();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Пример #4
0
        public void DoSimulation()
        {
            //0准备开始模拟
            ResourceManager      resourceManager      = VariableMaintainer.CurrentResourceManager;
            FormLogisticCAWizard formLogisticCAWizard = VariableMaintainer.CurrentFormLogisticCAWizard;
            Random    random    = new Random();
            Stopwatch stopWatch = new Stopwatch();

            stopWatch.Start();
            //0.1获得数据
            int rowCount    = formLogisticCAWizard.CurrentStructRasterMetaData.RowCount;
            int columnCount = formLogisticCAWizard.CurrentStructRasterMetaData.ColumnCount;

            float[,] simulationStartImage = formLogisticCAWizard.SimulationStartImage;
            float[,] simulationEndImage   = formLogisticCAWizard.SimulationEndImage;
            float[,] simulationImage      = formLogisticCAWizard.SimulationImage;

            //0.2计算初始每种土地利用类型的单元数量
            List <StructLanduseInfoAndCount> listLanduseInfoAndCount;   //记录每种土地利用类型的单元数

            listLanduseInfoAndCount = new List <StructLanduseInfoAndCount>();
            StructLanduseInfoAndCount landuseInfoAndCount;

            foreach (StructLanduseInfo structLanduseInfo in formLogisticCAWizard.LandUseClassificationInfo.AllTypes)
            {
                landuseInfoAndCount = new StructLanduseInfoAndCount();
                landuseInfoAndCount.structLanduseInfo = structLanduseInfo;
                landuseInfoAndCount.LanduseTypeCount  = 0;
                listLanduseInfoAndCount.Add(landuseInfoAndCount);
            }
            for (int i = 0; i < rowCount; i++)
            {
                for (int j = 0; j < columnCount; j++)
                {
                    CommonLibrary.GeneralOpertor.ChangeLandUseCount(simulationStartImage[i, j], -10000, listLanduseInfoAndCount);
                }
            }

            //0.3显示输出结果窗体和图表窗体
            dockableWindowGraphy.GraphTitle = resourceManager.GetString("String40");
            dockableWindowGraphy.XAxisTitle = resourceManager.GetString("String41");
            dockableWindowGraphy.YAxisTitle = resourceManager.GetString("String42");
            dockableWindowOutput.AppendText("\n");
            dockableWindowOutput.AppendText(resourceManager.GetString("String43"));
            Application.DoEvents();
            //0.4绘制初始的图表
            List <string> listPointPairListName = new List <string>();
            List <string> notToDrawList         = new List <string>();

            notToDrawList.Add(resourceManager.GetString("String44"));
            dockableWindowGraphy.CreateGraph(listLanduseInfoAndCount, notToDrawList, out listPointPairListName);
            dockableWindowGraphy.RefreshGraph();

            //1.计算Pg
            float[,] pg = new float[rowCount, columnCount];
            for (int i = 0; i < rowCount; i++)
            {
                for (int j = 0; j < columnCount; j++)
                {
                    if (simulationStartImage[i, j] == formLogisticCAWizard.LandUseClassificationInfo.NullValue.LanduseTypeValue)
                    {
                        pg[i, j] = formLogisticCAWizard.LandUseClassificationInfo.NullValue.LanduseTypeValue;
                    }
                    else
                    {
                        pg[i, j] += Convert.ToSingle(formLogisticCAWizard.Coefficents[0]);
                        for (int k = 0; k < formLogisticCAWizard.ListVariableLayersName.Count; k++)
                        {
                            pg[i, j] += Convert.ToSingle(formLogisticCAWizard.Coefficents[k + 1]) *
                                        formLogisticCAWizard.VaribaleImages[k][i, j];
                        }
                    }
                    pg[i, j] = 1 / (1 + Convert.ToSingle(Math.Exp(-1 * pg[i, j])));
                }
            }
            //GeneralOpertor.WriteDataFloat(formLogisticCAWizard.OutputFolder + @"\pg.txt", pg, rowCount, columnCount);

            int          convertedCellCount = 0; //模拟中总共转换的元胞数量
            List <float> neighbours;             //Moore领域的元胞
            float        omega;                  //扩散系数
            float        conSuitable;            //适应度函数
            float        maxPct;                 //每次迭代时最大的Pct值

            float[,] pct;
            float[,] pst;
            float sumPtt = 0;                                                                                       //Ptt的总和
            int   randomRow, randomColumn;                                                                          //Monte Carlo方法选取的随机行和随机列
            int   convertCountInOneIteration = formLogisticCAWizard.ConvertCount / formLogisticCAWizard.Iterations; //每次迭代应转换的数量
            int   convertCountOnce = 0;                                                                             //每次迭代已经转换的数量
            float oldValue, newValue;                                                                               //每次转换前土地利用类型的新值和旧值

            int[,] changeCells = new int[rowCount, columnCount];                                                    //记录每次转换为城市的单元。
            int iteration = 0;                                                                                      //迭代的次数

            //2.开始进行转换
            while (convertedCellCount < formLogisticCAWizard.ConvertCount)
            {
                if (convertedCellCount % formLogisticCAWizard.OutputImageInterval == 0 && convertedCellCount != 0)
                {
                    changeCells = new int[rowCount, columnCount];
                }
                convertCountOnce = 0;

                //2.1每次迭代先得到Pct和MaxPct
                maxPct = float.MinValue;
                pct    = new float[rowCount, columnCount];
                for (int i = 0; i < rowCount; i++)
                {
                    for (int j = 0; j < columnCount; j++)
                    {
                        neighbours = CommonLibrary.GeneralOpertor.GetMooreNeighbors(i, j, simulationImage, rowCount, columnCount);
                        omega      = Convert.ToSingle(CommonLibrary.GeneralOpertor.GetUrbanCount(neighbours, formLogisticCAWizard.LandUseClassificationInfo.UrbanValues[0].LanduseTypeValue)) / (neighbours.Count - 1);
                        if (formLogisticCAWizard.LandUseClassificationInfo.IsExistInConvertValue(simulationImage[i, j]))
                        {
                            conSuitable = 1f;
                        }
                        else
                        {
                            conSuitable = 0f;
                        }
                        pct[i, j] = pg[i, j] * conSuitable * omega;
                        if (pct[i, j] > maxPct)
                        {
                            maxPct = pct[i, j];
                        }
                    }
                }
                //CommonOperator.WriteData(Application.StartupPath + @"\\OutputData\pct.txt", pct, structAsciiImageFileMetaData);

                //2.2再得到Pst
                pst    = new float[rowCount, columnCount];
                sumPtt = 0;
                //2.2.1先得到ptt和Ptt的总和
                for (int i = 0; i < rowCount; i++)
                {
                    for (int j = 0; j < columnCount; j++)
                    {
                        pst[i, j] = pct[i, j] * Convert.ToSingle(Math.Exp(-1f * formLogisticCAWizard.Delta * (1f - pct[i, j] / maxPct)));
                        sumPtt   += pst[i, j];
                    }
                }
                for (int i = 0; i < rowCount; i++)
                {
                    for (int j = 0; j < columnCount; j++)
                    {
                        pst[i, j] = convertCountInOneIteration * pst[i, j] / sumPtt;
                    }
                }
                //CommonOperator.WriteData(Application.StartupPath + @"\\OutputData\pst.txt", pst, structAsciiImageFileMetaData);

                //2.3选择元胞与随机比较进行转换
                //完成一次迭代
                while (convertCountOnce < convertCountInOneIteration)
                {
                    randomRow    = random.Next(0, rowCount);
                    randomColumn = random.Next(0, columnCount);
                    if (pst[randomRow, randomColumn] > Convert.ToSingle(random.NextDouble()))
                    {
                        oldValue = simulationImage[randomRow, randomColumn];
                        newValue = formLogisticCAWizard.LandUseClassificationInfo.UrbanValues[0].LanduseTypeValue;
                        simulationImage[randomRow, randomColumn] = newValue;
                        CommonLibrary.GeneralOpertor.ChangeLandUseCount(newValue, oldValue, listLanduseInfoAndCount);
                        convertCountOnce++;
                        convertedCellCount++;
                        changeCells[randomRow, randomColumn] = 1;
                    }
                }
                iteration++;

                //2.4.刷新外部界面并输出中间结果数据
                if (convertedCellCount == 1 || (iteration % formLogisticCAWizard.RefreshInterval == 0 && convertedCellCount != 0))
                {
                    //刷新图像
                    formLogisticCAWizard.SimulationImage = simulationImage;
                    VariableMaintainer.IsNeedRefresh     = true;

                    //刷新图表窗体
                    string landuseTypeName = "";
                    for (int k = 0; k < listLanduseInfoAndCount.Count; k++)
                    {
                        for (int l = 0; l < listPointPairListName.Count; l++)
                        {
                            if (System.Globalization.CultureInfo.CurrentCulture.Parent.Name == "zh-CHS")
                            {
                                landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeChsName;
                            }
                            else if (System.Globalization.CultureInfo.CurrentCulture.Parent.Name == "zh-CHT")
                            {
                                landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeChtName;
                            }
                            else
                            {
                                landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeEnName;
                            }
                            if (landuseTypeName == listPointPairListName[l])
                            {
                                dockableWindowGraphy.UpdateData(iteration, listLanduseInfoAndCount[k].LanduseTypeCount, l);
                            }
                        }
                    }
                    dockableWindowGraphy.RefreshGraph();

                    //刷新输出结果窗体
                    dockableWindowOutput.AppendText("\n");
                    dockableWindowOutput.AppendText(resourceManager.GetString("String45") + iteration.ToString()
                                                    + resourceManager.GetString("String46"));
                    dockableWindowOutput.AppendText("\n");
                    dockableWindowOutput.AppendText(resourceManager.GetString("String47") + convertedCellCount.ToString());
                    dockableWindowOutput.AppendText("\n");
                    dockableWindowOutput.ScrollTextbox();
                    Application.DoEvents();
                }
                //输出中间结果
                if (formLogisticCAWizard.IsOutput && (iteration % formLogisticCAWizard.OutputImageInterval == 0))
                {
                    GeneralOpertor.WriteDataFloat(formLogisticCAWizard.OutputFolder + @"\" + GeneralOpertor.GetNowString()
                                                  + "_lr_iterate_" + iteration.ToString() + @".txt", simulationImage, rowCount, columnCount);
                }
            }

            //3.完成模拟,输出结果。
            stopWatch.Stop();
            VariableMaintainer.IsSimulationFinished = true;
            dockableWindowOutput.AppendText("\n");
            dockableWindowOutput.AppendText("\n");
            dockableWindowOutput.AppendText(resourceManager.GetString("String48"));
            dockableWindowOutput.AppendText("\n");
            dockableWindowOutput.AppendText(resourceManager.GetString("String49") +
                                            GeneralOpertor.GetElapsedTimeString(stopWatch.Elapsed));
            dockableWindowOutput.AppendText("\n");
            dockableWindowOutput.AppendText("\n");

            //修改结果栅格的属性表
            IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();
            IRasterWorkspace  rasterWorkspace  = workspaceFactory.OpenFromFile(
                VariableMaintainer.CurrentFormLogisticCAWizard.OutputFolder, 0) as IRasterWorkspace;
            IRasterDataset      rasterDataset      = rasterWorkspace.OpenRasterDataset(VariableMaintainer.CurrentFoucsMap.get_Layer(0).Name);
            IRasterDatasetEdit3 rasterDatasetEdit3 = rasterDataset as IRasterDatasetEdit3;

            rasterDatasetEdit3.BuildAttributeTable();
            IRasterDataset3 rasterDataset3 = rasterDataset as IRasterDataset3;

            rasterDataset3.Refresh();

            if (formLogisticCAWizard.SimulationEndImageName != "")
            {
                //GeneralOpertor.WriteDataFloat(formLogisticCAWizard.OutputFolder + @"\CA_LR_Reslut" + GeneralOpertor.GetNowString() + ".txt",
                //    simulationImage, rowCount, columnCount);

                StructBinaryConfusionMatrix structConfusionMatrix = GeneralOpertor.GetBinaryAccuracy(
                    simulationImage, simulationEndImage, rowCount, columnCount, formLogisticCAWizard.LandUseClassificationInfo);
                string accuracyString = GeneralOpertor.GetBinaryAccuracyReportString(structConfusionMatrix, convertedCellCount);
                dockableWindowOutput.AppendText(accuracyString);

                DataTable dtMatrixNumber = GeneralOpertor.GetMultiTypesMatrix(
                    simulationImage, simulationEndImage, rowCount, columnCount, formLogisticCAWizard.LandUseClassificationInfo);
                double overallAccuracy = 0d;
                double kappa           = 0d;
                GeneralOpertor.GetMultiTypesAccuracy(dtMatrixNumber, ref overallAccuracy, ref kappa, formLogisticCAWizard.LandUseClassificationInfo);
                FormConfusionMatrix formConfusionMatrix = new FormConfusionMatrix();
                formConfusionMatrix.DataTableValues = dtMatrixNumber;
                DataTable dtMatrixPercent = dtMatrixNumber.Clone();
                GeneralOpertor.CopyDataTableValues(dtMatrixNumber, dtMatrixPercent);
                formConfusionMatrix.DataTablePercents = dtMatrixPercent;
                formConfusionMatrix.DataGridViewConfusionMatrix.DataSource = dtMatrixNumber;
                formConfusionMatrix.LabelOverallAccuracy.Text = (overallAccuracy * 100).ToString("0.00") + " %";
                formConfusionMatrix.LabelKappa.Text           = kappa.ToString("0.000");

                float[] fomValues = GeneralOpertor.GetBinaryFoMAccuracy(simulationStartImage, simulationEndImage, simulationImage,
                                                                        rowCount, columnCount, formLogisticCAWizard.LandUseClassificationInfo.UrbanValues[0].LanduseTypeValue);
                formConfusionMatrix.LabelFoMValues.Text = "A: " + fomValues[0] + "\nB: " + fomValues[1] +
                                                          "\nC: " + fomValues[2] + "\nD: " + fomValues[3];
                formConfusionMatrix.LabelFoM.Text = fomValues[4].ToString("0.000");
                formConfusionMatrix.LabelPA.Text  = fomValues[5].ToString("0.000");
                formConfusionMatrix.LabelUA.Text  = fomValues[6].ToString("0.000");

                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String84"));
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(GeneralOpertor.WriteCoufusionMatrix(dtMatrixPercent));
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String83"));
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String85") + (overallAccuracy * 100).ToString("0.00") + " %");
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String86") + kappa.ToString("0.000"));
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String87") + fomValues[4].ToString("0.000"));
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String88") + fomValues[5].ToString("0.000"));
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String89") + fomValues[6].ToString("0.000"));
                dockableWindowOutput.AppendText("\n");
                formConfusionMatrix.Text = resourceManager.GetString("String105") + " - " + formLogisticCAWizard.SimulationLayerName;
                formConfusionMatrix.ShowDialog();

                dockableWindowOutput.ScrollTextbox();
                Application.DoEvents();
            }
            dockableWindowOutput.AppendText("-------------------------------------------");
            dockableWindowOutput.AppendText("\n");
            dockableWindowOutput.AppendText("\n");
            dockableWindowOutput.ScrollTextbox();
            Application.DoEvents();
        }
Пример #5
0
        public void DoSimulation()
        {
            //0准备开始模拟
            ResourceManager resourceManager = VariableMaintainer.CurrentResourceManager;
            FormDTCAWizard  formDTCAWizard  = VariableMaintainer.CurrentFormDTCAWizard;
            Random          random          = new Random();
            Stopwatch       stopWatch       = new Stopwatch();

            stopWatch.Start();
            //0.1获得数据
            int rowCount    = formDTCAWizard.CurrentStructRasterMetaData.RowCount;
            int columnCount = formDTCAWizard.CurrentStructRasterMetaData.ColumnCount;

            float[,] simulationStartImage = formDTCAWizard.SimulationStartImage;
            float[,] simulationEndImage   = formDTCAWizard.SimulationEndImage;
            float[,] simulationImage      = formDTCAWizard.SimulationImage;

            //0.2计算初始每种土地利用类型的单元数量
            List <StructLanduseInfoAndCount> listLanduseInfoAndCount;   //记录每种土地利用类型的单元数

            listLanduseInfoAndCount = new List <StructLanduseInfoAndCount>();
            StructLanduseInfoAndCount landuseInfoAndCount;

            foreach (StructLanduseInfo structLanduseInfo in formDTCAWizard.LandUseClassificationInfo.AllTypes)
            {
                landuseInfoAndCount = new StructLanduseInfoAndCount();
                landuseInfoAndCount.structLanduseInfo = structLanduseInfo;
                landuseInfoAndCount.LanduseTypeCount  = 0;
                listLanduseInfoAndCount.Add(landuseInfoAndCount);
            }
            for (int i = 0; i < rowCount; i++)
            {
                for (int j = 0; j < columnCount; j++)
                {
                    CommonLibrary.GeneralOpertor.ChangeLandUseCount(simulationStartImage[i, j], -10000, listLanduseInfoAndCount);
                }
            }

            //0.3显示输出结果窗体和图表窗体
            dockableWindowGraphy.GraphTitle = resourceManager.GetString("String40");
            dockableWindowGraphy.XAxisTitle = resourceManager.GetString("String41");
            dockableWindowGraphy.YAxisTitle = resourceManager.GetString("String42");
            dockableWindowOutput.AppendText("\n");
            dockableWindowOutput.AppendText(resourceManager.GetString("String43"));
            Application.DoEvents();
            //0.4绘制初始的图表
            List <string> listPointPairListName = new List <string>();
            List <string> notToDrawList         = new List <string>();

            notToDrawList.Add(resourceManager.GetString("String44"));
            dockableWindowGraphy.CreateGraph(listLanduseInfoAndCount, notToDrawList, out listPointPairListName);
            dockableWindowGraphy.RefreshGraph();

            int   convertedCellCount = 0;                                                               //模拟中总共转换的元胞数量
            int   randomRow, randomColumn;                                                              //Monte Carlo方法选取的随机行和随机列
            int   convertCountInOneIteration = formDTCAWizard.ConvertCount / formDTCAWizard.Iterations; //每次迭代应转换的数量
            int   convertCountOnce = 0;                                                                 //每次迭代已经转换的数量
            float oldValue, newValue;                                                                   //每次转换前土地利用类型的新值和旧值
            int   iteration = 0;                                                                        //迭代的次数

            //float gamma = 1f / formDTCAWizard.Iterations;
            //float gamma = 0.4f;
            DecisionTree decisionTree    = formDTCAWizard.CurrentDecisionTree;
            List <float> listUrbanValues = new List <float>();

            for (int j = 0; j < formDTCAWizard.LandUseClassificationInfo.UrbanValues.Count; j++)
            {
                listUrbanValues.Add(formDTCAWizard.LandUseClassificationInfo.UrbanValues[j].LanduseTypeValue);
            }
            int neiWindowSize = formDTCAWizard.NeighbourWindowSize;

            try
            {
                //2.开始进行转换
                while (convertedCellCount < formDTCAWizard.ConvertCount)
                {
                    convertCountOnce = 0;

                    while (convertCountOnce < convertCountInOneIteration)
                    {
                        //随机选择一个栅格进行计算
                        randomRow    = random.Next(0, rowCount);
                        randomColumn = random.Next(0, columnCount);

                        //计算逻辑为:
                        //这里需要首先获取当前元胞的输入值
                        //然后通过决策树计算是否发生转变
                        //然后看随机数是否小于等于预定值,则进行转变

                        //如果是空值,则不进行计算
                        if (simulationImage[randomRow, randomColumn] == -9999f)
                        {
                            continue;
                        }
                        //如果模拟影像该栅格是空值,也不进行计算
                        if (formDTCAWizard.ListVaribaleImages[formDTCAWizard.ListVaribaleImages.Count - 1][randomRow, randomColumn] == -9999f)
                        {
                            continue;
                        }
                        //如果已经是城市用地,则不计算
                        if (simulationImage[randomRow, randomColumn] == formDTCAWizard.LandUseClassificationInfo.UrbanValues[0].LanduseTypeValue)
                        {
                            continue;
                        }

                        double[] tempInputsArray = new double[formDTCAWizard.ListVaribaleImages.Count];
                        //获取该栅格的各空间变量值和其他输入变量
                        for (int i = 0; i < formDTCAWizard.ListVaribaleImages.Count; i++)
                        {
                            tempInputsArray[i] = formDTCAWizard.ListVaribaleImages[i][randomRow, randomColumn];
                        }
                        //获取该栅格的邻域中城市用地数量
                        tempInputsArray[formDTCAWizard.ListVaribaleImages.Count - 2] =
                            CommonLibrary.GeneralOpertor.GetNeighbors(randomRow, randomColumn, simulationImage,
                                                                      rowCount, columnCount, neiWindowSize, listUrbanValues);
                        //获取该栅格当前的土地利用类型值
                        tempInputsArray[formDTCAWizard.ListVaribaleImages.Count - 1] = simulationImage[randomRow, randomColumn];

                        //计算决策树输出的转换值
                        int output = formDTCAWizard.CurrentDecisionTree.Compute(tempInputsArray);
                        //如果计算为不转换,则不进行转换
                        if (output == 0)
                        {
                            continue;
                        }
                        //如果可以转换为城市用地
                        if (!formDTCAWizard.LandUseClassificationInfo.IsExistInConvertValue(simulationImage[randomRow, randomColumn]))
                        {
                            continue;
                        }

                        Random r = new Random(1);
                        double convertThreshold = random.NextDouble();
                        //得到应转变为的土地利用类型值,以及当前土地利用类型值
                        newValue = formDTCAWizard.LandUseClassificationInfo.UrbanValues[0].LanduseTypeValue;
                        oldValue = simulationImage[randomRow, randomColumn];
                        //未使用邻域因素模拟较为散,所以加入邻域因素
                        double neighbourValue = tempInputsArray[formDTCAWizard.ListVaribaleImages.Count - 2] / (neiWindowSize * neiWindowSize - 1);
                        //double probability = convertThreshold * neighbourValue;

                        //if ((oldValue != newValue) && (convertThreshold <= gamma))
                        //if ((oldValue != newValue) && (probability >= gamma))
                        //20170619添加限制层数据
                        // if ((VariableMaintainer.RestrictImage[randomRow, randomColumn] == 2) || (VariableMaintainer.RestrictImage[randomRow, randomColumn] == 1))
                        //if (VariableMaintainer.RestrictImage[randomRow, randomColumn] == 1)
                        //    continue;

                        //引入随机因素,如果邻域因素大于随机数
                        if ((oldValue != newValue) && (neighbourValue > convertThreshold))
                        {
                            simulationImage[randomRow, randomColumn] = newValue;
                            CommonLibrary.GeneralOpertor.ChangeLandUseCount(newValue, oldValue, listLanduseInfoAndCount);
                            convertCountOnce++;
                            convertedCellCount++;
                            //System.Diagnostics.Debug.WriteLine(convertedCellCount + " - Old: " + oldValue + " New: " + newValue);
                        }
                    }
                    iteration++;

                    //2.4.刷新外部界面并输出中间结果数据
                    if (convertedCellCount == 1 || (iteration % formDTCAWizard.RefreshInterval == 0 && convertedCellCount != 0))
                    {
                        //刷新图像
                        formDTCAWizard.SimulationImage   = simulationImage;
                        VariableMaintainer.IsNeedRefresh = true;

                        //刷新图表窗体
                        string landuseTypeName = "";
                        for (int k = 0; k < listLanduseInfoAndCount.Count; k++)
                        {
                            for (int l = 0; l < listPointPairListName.Count; l++)
                            {
                                if (System.Globalization.CultureInfo.CurrentCulture.Parent.Name == "zh-CHS")
                                {
                                    landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeChsName;
                                }
                                else if (System.Globalization.CultureInfo.CurrentCulture.Parent.Name == "zh-CHT")
                                {
                                    landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeChtName;
                                }
                                else
                                {
                                    landuseTypeName = listLanduseInfoAndCount[k].structLanduseInfo.LanduseTypeEnName;
                                }
                                if (landuseTypeName == listPointPairListName[l])
                                {
                                    dockableWindowGraphy.UpdateData(iteration, listLanduseInfoAndCount[k].LanduseTypeCount, l);
                                }
                            }
                        }
                        dockableWindowGraphy.RefreshGraph();

                        //刷新输出结果窗体
                        dockableWindowOutput.AppendText("\n");
                        dockableWindowOutput.AppendText(resourceManager.GetString("String45") + iteration.ToString()
                                                        + resourceManager.GetString("String46"));
                        dockableWindowOutput.AppendText("\n");
                        dockableWindowOutput.AppendText(resourceManager.GetString("String47") + convertedCellCount.ToString());
                        dockableWindowOutput.AppendText("\n");
                        dockableWindowOutput.ScrollTextbox();
                        Application.DoEvents();
                    }
                    //输出中间结果
                    if (formDTCAWizard.IsOutput && (iteration % formDTCAWizard.OutputImageInterval == 0))
                    {
                        GeneralOpertor.WriteDataFloat(formDTCAWizard.OutputFolder + @"\" + GeneralOpertor.GetNowString()
                                                      + "_ann_iterate_" + iteration.ToString() + @".txt", simulationImage, rowCount, columnCount);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("DTCA: " + ex.Message);
            }

            //3.完成模拟,输出结果。
            stopWatch.Stop();
            //isFinished = true;
            VariableMaintainer.IsSimulationFinished = true;
            dockableWindowOutput.AppendText("\n");
            dockableWindowOutput.AppendText("\n");
            dockableWindowOutput.AppendText(resourceManager.GetString("String48"));
            dockableWindowOutput.AppendText("\n");
            dockableWindowOutput.AppendText(resourceManager.GetString("String49") +
                                            GeneralOpertor.GetElapsedTimeString(stopWatch.Elapsed));
            dockableWindowOutput.AppendText("\n");
            dockableWindowOutput.AppendText("\n");

            //修改结果栅格的属性表
            IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();
            IRasterWorkspace  rasterWorkspace  = workspaceFactory.OpenFromFile(
                VariableMaintainer.CurrentFormDTCAWizard.OutputFolder, 0) as IRasterWorkspace;
            IRasterDataset      rasterDataset      = rasterWorkspace.OpenRasterDataset(VariableMaintainer.CurrentFoucsMap.get_Layer(0).Name);
            IRasterDatasetEdit3 rasterDatasetEdit3 = rasterDataset as IRasterDatasetEdit3;

            rasterDatasetEdit3.BuildAttributeTable();
            IRasterDataset3 rasterDataset3 = rasterDataset as IRasterDataset3;

            rasterDataset3.Refresh();

            if (formDTCAWizard.SimulationEndImageName != "")
            {
                //GeneralOpertor.WriteDataFloat(formLogisticCAWizard.OutputFolder + @"\CA_ANN_Reslut" + GeneralOpertor.GetNowString() + ".txt",
                //    simulationImage, rowCount,columnCount);
                StructBinaryConfusionMatrix structConfusionMatrix = GeneralOpertor.GetBinaryAccuracy(
                    simulationImage, simulationEndImage, rowCount, columnCount, formDTCAWizard.LandUseClassificationInfo);
                string accuracyString = GeneralOpertor.GetBinaryAccuracyReportString(structConfusionMatrix, convertedCellCount);
                dockableWindowOutput.AppendText(accuracyString);

                DataTable dtMatrixNumber = GeneralOpertor.GetMultiTypesMatrix(
                    simulationImage, simulationEndImage, rowCount, columnCount, formDTCAWizard.LandUseClassificationInfo);
                double overallAccuracy = 0d;
                double kappa           = 0d;
                GeneralOpertor.GetMultiTypesAccuracy(dtMatrixNumber, ref overallAccuracy, ref kappa, formDTCAWizard.LandUseClassificationInfo);
                FormConfusionMatrix formConfusionMatrix = new FormConfusionMatrix();
                formConfusionMatrix.DataTableValues = dtMatrixNumber;
                DataTable dtMatrixPercent = dtMatrixNumber.Clone();
                GeneralOpertor.CopyDataTableValues(dtMatrixNumber, dtMatrixPercent);
                formConfusionMatrix.DataTablePercents = dtMatrixPercent;
                formConfusionMatrix.DataGridViewConfusionMatrix.DataSource = dtMatrixNumber;
                formConfusionMatrix.LabelOverallAccuracy.Text = (overallAccuracy * 100).ToString("0.00") + " %";
                formConfusionMatrix.LabelKappa.Text           = kappa.ToString("0.000");

                float[] fomValues = GeneralOpertor.GetBinaryFoMAccuracy(simulationStartImage, simulationEndImage, simulationImage,
                                                                        rowCount, columnCount, formDTCAWizard.LandUseClassificationInfo.UrbanValues[0].LanduseTypeValue);
                formConfusionMatrix.LabelFoMValues.Text = "A: " + fomValues[0] + "\nB: " + fomValues[1] +
                                                          "\nC: " + fomValues[2] + "\nD: " + fomValues[3];
                formConfusionMatrix.LabelFoM.Text = fomValues[4].ToString("0.000");
                formConfusionMatrix.LabelPA.Text  = fomValues[5].ToString("0.000");
                formConfusionMatrix.LabelUA.Text  = fomValues[6].ToString("0.000");

                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String84"));
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(GeneralOpertor.WriteCoufusionMatrix(dtMatrixPercent));
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String83"));
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String85") + (overallAccuracy * 100).ToString("0.00") + " %");
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String86") + kappa.ToString("0.000"));
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String87") + fomValues[4].ToString("0.000"));
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String88") + fomValues[5].ToString("0.000"));
                dockableWindowOutput.AppendText("\n");
                dockableWindowOutput.AppendText(resourceManager.GetString("String89") + fomValues[6].ToString("0.000"));
                dockableWindowOutput.AppendText("\n");
                formConfusionMatrix.Text = resourceManager.GetString("String105") + " - " + formDTCAWizard.SimulationLayerName;
                formConfusionMatrix.ShowDialog();
            }
            dockableWindowOutput.AppendText("-------------------------------------------");
            dockableWindowOutput.AppendText("\n");
            dockableWindowOutput.AppendText("\n");
            dockableWindowOutput.ScrollTextbox();
            Application.DoEvents();
        }
Пример #6
0
        protected override void OnClick()
        {
            try
            {
                ResourceManager resourceManager = VariableMaintainer.CurrentResourceManager;
                if (VariableMaintainer.CurrentModel == EnumCurrentModel.Null)
                {
                    MessageBox.Show(resourceManager.GetString("String168"), resourceManager.GetString("String2"),
                                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }

                Thread thread = VariableMaintainer.SimulationThread;
                if (thread != null)
                {
                    if (thread.ThreadState != ThreadState.Stopped)
                    {
                        MessageBox.Show(resourceManager.GetString("String39"), resourceManager.GetString("String2"),
                                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return;
                    }
                }

                StructRasterMetaData structRasterMetaData = new StructRasterMetaData();
                string model = "";
                if (VariableMaintainer.CurrentModel == EnumCurrentModel.Simulation_CA_LogisticRegression)
                {
                    model = resourceManager.GetString("String104");
                }
                else if (VariableMaintainer.CurrentModel == EnumCurrentModel.Simulation_CA_ANN)
                {
                    model = resourceManager.GetString("String102");
                }
                else if (VariableMaintainer.CurrentModel == EnumCurrentModel.Simulation_CA_DT)
                {
                    model = resourceManager.GetString("String103");
                }
                else if (VariableMaintainer.CurrentModel == EnumCurrentModel.Optimization_Area)
                {
                    model = resourceManager.GetString("String167");
                }
                VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String82")
                                                                          + model + resourceManager.GetString("String101") + DateTime.Now.ToShortTimeString());
                VariableMaintainer.CurrentDockableWindowOutput.AppendText("\n");
                VariableMaintainer.CurrentDockableWindowOutput.AppendText("\n");
                ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String58"));
                VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String58"));
                VariableMaintainer.CurrentDockableWindowOutput.AppendText("\n");

                if (VariableMaintainer.CurrentModel == EnumCurrentModel.Simulation_CA_LogisticRegression)
                {
                    //ArcGIS操作在另一线程中执行效率降低很多,因此把数据读取及刷新操作在线程外执行
                    //首先读取模拟起始时刻和/或终止时刻影像
                    ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String12"));
                    VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String12") +
                                                                              VariableMaintainer.CurrentFormLogisticCAWizard.SimulationStartImageName + ".....\n");
                    VariableMaintainer.CurrentFormLogisticCAWizard.SimulationStartImage =
                        ArcGISOperator.ReadRasterAndGetMetaData(ArcGISOperator.GetRasterLayerByName(
                                                                    VariableMaintainer.CurrentFormLogisticCAWizard.SimulationStartImageName), out structRasterMetaData);
                    if (VariableMaintainer.CurrentFormLogisticCAWizard.SimulationEndImageName != "")
                    {
                        ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String13"));
                        VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String13") +
                                                                                  VariableMaintainer.CurrentFormLogisticCAWizard.SimulationEndImageName + ".....\n");
                        VariableMaintainer.CurrentFormLogisticCAWizard.SimulationEndImage = ArcGISOperator.ReadRaster(ArcGISOperator.GetRasterLayerByName(
                                                                                                                          VariableMaintainer.CurrentFormLogisticCAWizard.SimulationEndImageName), -9999f);
                    }
                    //然后读取各变量影像
                    if (VariableMaintainer.CurrentFormLogisticCAWizard.IsUsingDefault)
                    {
                        foreach (string layerName in VariableMaintainer.CurrentFormLogisticCAWizard.ListVariableLayersName)
                        {
                            ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String14") + layerName + ".....");
                            VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String14") + layerName + ".....\n");
                            VariableMaintainer.CurrentFormLogisticCAWizard.VaribaleImages.Add(
                                ArcGISOperator.ReadRaster(ArcGISOperator.GetRasterLayerByName(layerName), -9999f));
                        }
                        //获取最小空间范围
                        IRasterLayer rasterLayerStartImage = ArcGISOperator.GetRasterLayerByName(VariableMaintainer.CurrentFormLogisticCAWizard.SimulationStartImageName);
                        IRasterLayer rasterLayerEndImage   = ArcGISOperator.GetRasterLayerByName(VariableMaintainer.CurrentFormLogisticCAWizard.SimulationEndImageName);

                        List <IRasterLayer> listVariablesLayers = new List <IRasterLayer>();
                        for (int i = 0; i < VariableMaintainer.CurrentFormLogisticCAWizard.ListVariableLayersName.Count; i++)
                        {
                            listVariablesLayers.Add(ArcGISOperator.GetRasterLayerByName(VariableMaintainer.CurrentFormLogisticCAWizard.ListVariableLayersName[i]));
                        }
                        ArcGISOperator.GetSmallestBound(rasterLayerStartImage, rasterLayerEndImage, listVariablesLayers, ref structRasterMetaData);
                        VariableMaintainer.CurrentFormLogisticCAWizard.CurrentStructRasterMetaData = structRasterMetaData;
                    }
                    //最后用模拟起始时刻影像创建模拟影像
                    string dateTime   = GeneralOpertor.GetDataTimeFullString(DateTime.Now);
                    string rasterName = "sim" + dateTime + ".img";
                    ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String37"));
                    VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String37") + rasterName + ".....\n");

                    IRasterLayer simulationStartImageLayer = ArcGISOperator.GetRasterLayerByName(
                        VariableMaintainer.CurrentFormLogisticCAWizard.SimulationStartImageName);
                    IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();
                    IWorkspace        workspace        = workspaceFactory.OpenFromFile(VariableMaintainer.CurrentFormLogisticCAWizard.OutputFolder, 0);
                    ISaveAs2          saveAs2          = (ISaveAs2)simulationStartImageLayer.Raster;
                    saveAs2.SaveAs(rasterName, workspace, "IMAGINE Image");
                    IRasterLayer simulationImageLayer = new RasterLayerClass();
                    simulationImageLayer.CreateFromFilePath(VariableMaintainer.CurrentFormLogisticCAWizard.OutputFolder + @"\" + rasterName);
                    simulationImageLayer.Renderer = simulationStartImageLayer.Renderer;
                    ArcGISOperator.FoucsMap.AddLayer((ILayer)simulationImageLayer);
                    VariableMaintainer.CurrentFormLogisticCAWizard.SimulationImage     = ArcGISOperator.ReadRaster(simulationImageLayer, -9999f);
                    VariableMaintainer.CurrentFormLogisticCAWizard.SimulationLayerName = rasterName;

                    LogisticRegreesionCA lrCA = new LogisticRegreesionCA();
                    lrCA.DockableWindowGraphy = VariableMaintainer.CurrentDockableWindowGraphy;
                    lrCA.DockableWindowOutput = VariableMaintainer.CurrentDockableWindowOutput;

                    thread = new Thread(new ThreadStart(lrCA.DoSimulation));
                }
                else if (VariableMaintainer.CurrentModel == EnumCurrentModel.Simulation_CA_ANN)
                {
                    //今后应使用父类和接口进行重构
                    //首先读取模拟起始时刻和/或终止时刻影像
                    ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String12"));
                    VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String12") +
                                                                              VariableMaintainer.CurrentFormANNCAWizard.SimulationStartImageName + ".....\n");
                    VariableMaintainer.CurrentFormANNCAWizard.SimulationStartImage =
                        ArcGISOperator.ReadRasterAndGetMetaData(ArcGISOperator.GetRasterLayerByName(
                                                                    VariableMaintainer.CurrentFormANNCAWizard.SimulationStartImageName), out structRasterMetaData);
                    //VariableMaintainer.CurrentANNCAWizard.CurrentStructRasterMetaData = structRasterMetaData;
                    if (VariableMaintainer.CurrentFormANNCAWizard.SimulationEndImageName != "")
                    {
                        ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String13"));
                        VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String13") +
                                                                                  VariableMaintainer.CurrentFormLogisticCAWizard.SimulationEndImageName + ".....\n");
                        VariableMaintainer.CurrentFormANNCAWizard.SimulationEndImage = ArcGISOperator.ReadRaster(ArcGISOperator.GetRasterLayerByName(
                                                                                                                     VariableMaintainer.CurrentFormANNCAWizard.SimulationEndImageName), -9999f);
                    }
                    //最后用模拟起始时刻影像创建模拟影像
                    string dateTime   = GeneralOpertor.GetDataTimeFullString(DateTime.Now);
                    string rasterName = "sim" + dateTime + ".img";
                    ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String37"));
                    VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String37") + rasterName + ".....\n");

                    IRasterLayer simulationStartImageLayer = ArcGISOperator.GetRasterLayerByName(
                        VariableMaintainer.CurrentFormANNCAWizard.SimulationStartImageName);
                    IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();
                    IWorkspace        workspace        = workspaceFactory.OpenFromFile(VariableMaintainer.CurrentFormANNCAWizard.OutputFolder, 0);
                    ISaveAs2          saveAs2          = (ISaveAs2)simulationStartImageLayer.Raster;
                    saveAs2.SaveAs(rasterName, workspace, "IMAGINE Image");
                    IRasterLayer simulationImageLayer = new RasterLayerClass();
                    simulationImageLayer.CreateFromFilePath(VariableMaintainer.CurrentFormANNCAWizard.OutputFolder + @"\" + rasterName);
                    simulationImageLayer.Renderer = simulationStartImageLayer.Renderer;
                    ArcGISOperator.FoucsMap.AddLayer((ILayer)simulationImageLayer);
                    VariableMaintainer.CurrentFormANNCAWizard.SimulationImage     = ArcGISOperator.ReadRaster(simulationImageLayer, -9999f);
                    VariableMaintainer.CurrentFormANNCAWizard.SimulationLayerName = rasterName;

                    ANNCA annCA = new ANNCA();
                    annCA.DockableWindowGraphy = VariableMaintainer.CurrentDockableWindowGraphy;
                    annCA.DockableWindowOutput = VariableMaintainer.CurrentDockableWindowOutput;

                    thread = new Thread(new ThreadStart(annCA.DoSimulation));
                }
                else if (VariableMaintainer.CurrentModel == EnumCurrentModel.Simulation_CA_DT)
                {
                    //今后应使用父类和接口进行重构
                    //首先读取模拟起始时刻和/或终止时刻影像
                    ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String12"));
                    VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String12") +
                                                                              VariableMaintainer.CurrentFormDTCAWizard.SimulationStartImageName + ".....\n");
                    VariableMaintainer.CurrentFormDTCAWizard.SimulationStartImage =
                        ArcGISOperator.ReadRasterAndGetMetaData(ArcGISOperator.GetRasterLayerByName(
                                                                    VariableMaintainer.CurrentFormDTCAWizard.SimulationStartImageName), out structRasterMetaData);
                    //VariableMaintainer.CurrentDTCAWizard.CurrentStructRasterMetaData = structRasterMetaData;
                    if (VariableMaintainer.CurrentFormDTCAWizard.SimulationEndImageName != "")
                    {
                        ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String13"));
                        VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String13") +
                                                                                  VariableMaintainer.CurrentFormLogisticCAWizard.SimulationEndImageName + ".....\n");
                        VariableMaintainer.CurrentFormDTCAWizard.SimulationEndImage = ArcGISOperator.ReadRaster(ArcGISOperator.GetRasterLayerByName(
                                                                                                                    VariableMaintainer.CurrentFormDTCAWizard.SimulationEndImageName), -9999f);
                    }
                    //20170619添加限制层数据
                    //VariableMaintainer.CurrentDockableWindowOutput.AppendText("Add Restriction Layer " +
                    //        "ACOres" + ".....\n");
                    //VariableMaintainer.RestrictImage = ArcGISOperator.ReadRaster(ArcGISOperator.GetRasterLayerByName(
                    //        "ACOres"), -9999f);

                    //最后用模拟起始时刻影像创建模拟影像
                    string dateTime   = GeneralOpertor.GetDataTimeFullString(DateTime.Now);
                    string rasterName = "sim" + dateTime + ".img";
                    ArcMap.Application.StatusBar.set_Message(0, resourceManager.GetString("String37"));
                    VariableMaintainer.CurrentDockableWindowOutput.AppendText(resourceManager.GetString("String37") + rasterName + ".....\n");

                    IRasterLayer simulationStartImageLayer = ArcGISOperator.GetRasterLayerByName(
                        VariableMaintainer.CurrentFormDTCAWizard.SimulationStartImageName);
                    IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();
                    IWorkspace        workspace        = workspaceFactory.OpenFromFile(VariableMaintainer.CurrentFormDTCAWizard.OutputFolder, 0);
                    ISaveAs2          saveAs2          = (ISaveAs2)simulationStartImageLayer.Raster;
                    saveAs2.SaveAs(rasterName, workspace, "IMAGINE Image");
                    IRasterLayer simulationImageLayer = new RasterLayerClass();
                    simulationImageLayer.CreateFromFilePath(VariableMaintainer.CurrentFormDTCAWizard.OutputFolder + @"\" + rasterName);
                    simulationImageLayer.Renderer = simulationStartImageLayer.Renderer;
                    ArcGISOperator.FoucsMap.AddLayer((ILayer)simulationImageLayer);
                    VariableMaintainer.CurrentFormDTCAWizard.SimulationImage     = ArcGISOperator.ReadRaster(simulationImageLayer, -9999f);
                    VariableMaintainer.CurrentFormDTCAWizard.SimulationLayerName = rasterName;

                    DecisionTreeCA dtCA = new DecisionTreeCA();
                    dtCA.DockableWindowGraphy = VariableMaintainer.CurrentDockableWindowGraphy;
                    dtCA.DockableWindowOutput = VariableMaintainer.CurrentDockableWindowOutput;

                    thread = new Thread(new ThreadStart(dtCA.DoSimulation));
                }
                else if (VariableMaintainer.CurrentModel == EnumCurrentModel.Optimization_Area)
                {
                    if (!VariableMaintainer.IsACOUtilitySet || !VariableMaintainer.IsACOParametersSet)
                    {
                        MessageBox.Show(resourceManager.GetString("String166"), resourceManager.GetString("String2"),
                                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return;
                    }
                    AreaOptimizationACO areaOptimizationACO = new AreaOptimizationACO();
                    areaOptimizationACO.Initialize(VariableMaintainer.CurrentStructACOParameters, 1, false,
                                                   VariableMaintainer.CurrentDockableWindowOutput, VariableMaintainer.CurrentDockableWindowGraphy, true);

                    thread = new Thread(new ThreadStart(areaOptimizationACO.Run));
                }
                else
                {
                    MessageBox.Show(resourceManager.GetString("String168"), resourceManager.GetString("String2"),
                                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }

                VariableMaintainer.SimulationThread = thread;
                thread.SetApartmentState(ApartmentState.STA);
                thread.Start();

                VariableMaintainer.CurrentTimer.Interval = 500;
                VariableMaintainer.CurrentTimer.Tick    += new EventHandler(t_Tick);
                VariableMaintainer.CurrentTimer.Enabled  = true;
                VariableMaintainer.CurrentTimer.Start();

                ArcMap.Application.CurrentTool = null;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Пример #7
0
        //--------------------------------------------------------------------------------------------------------------

        //------------------------------------------------方法----------------------------------------------------------

        /// <summary>
        /// 方法
        /// </summary>
        #region 方法

        /// <summary>
        /// 初始化方法
        /// </summary>
        #region ----------------初始化方法------------------------

        public void Initialize(StructACOParameters structACOParameters, int microSearchIterationCountValue,
                               Boolean isNeedSaveValue, DockableWindowOutput currentDockableWindowOutput,
                               DockableWindowGraphy currentDockableWindowGraphy, Boolean isUseCompactnessValue)
        {
            q              = structACOParameters.Q;                         //信息素强度
            rho            = structACOParameters.Rho;                       //挥发因子
            alpha          = structACOParameters.Alpha;                     //信息素权重
            beta           = structACOParameters.Beta;                      //启发函数权重
            weightSutiable = structACOParameters.WeightSuitable;            //阻抗性权重
            weightCompact  = structACOParameters.WeightCompact;             //紧凑性权重

            totalItearationCount     = structACOParameters.InterationCount; //总迭代次数
            currentIteration         = 0;                                   //当前迭代次数
            currentRefreshIteration  = 0;                                   //更新次数
            needFinishIterationCount = 0;

            microSearchIterationCount          = microSearchIterationCountValue;            //小搜索次数
            goalUtilityAntsStatusInMicroSearch = new Ant[structACOParameters.AntCount];     //小搜索内最优状态
            currentIterationInMicroSearch      = 0;
            goalUtilityInMicroSearch           = 0;

            isNeedSave          = isNeedSaveValue;          //判断是否需要保存结果
            isNeedUpdate        = false;                    //初始化判断是否需要更新最优状态
            isInitialStatusSave = false;                    //判断是否已经保存初始状态数据

            //rows = rrows;                       //网格行数
            //cols = ccols;                       //网格列数
            //xllcorner = xxllcorner;             //输出文件左上角横坐标
            //yllcorner = yyllcorner;             //输出文件左上角纵坐标
            //cellsize = ccellsize;               //栅格大小
            //noDataValue = nnodata_value;       //无数据值

            outputPath     = structACOParameters.OutputFolder; //结果输出路径
            outInitName    = "_Init.txt";                      //结果输出初始状态文件名
            outFileName    = "";                               //结果输出文件名
            outPreFileName = "g";                              //结果输出文件名前面部分
            outGoalName    = "GoalFunction.txt";               //结果输出目标函数名

            antsCount = structACOParameters.AntCount;          //智能体个数
            //cellSize = bbianChang;                        //网格边长
            //cellArea = cellSize * cellSize * antsCount;    //智能体面积


            goalUtilityInAllIterations = 0;
            randomBound = 1;

            goalUtilityArray = new string[totalItearationCount + 2];   //保存目标函数值数据

            suitabilityData = GetSuitabilityData(VariableMaintainer.OptimizationExpression);
            InitializeOccupiedAndGoalUtilityAntsStatusInAllIterations(); //初始化挖空
            InitializeAnts();                                            //初始化智能体
            InitializePheromone();                                       //初始化信息素
            InitializeHeuristicFunction();                               //初始化启发函数

            string         simulationLayerName  = VariableMaintainer.CurrentFoucsMap.get_Layer(0).Name;
            IRasterLayer   simulationImageLayer = ArcGISOperator.GetRasterLayerByName(simulationLayerName);
            string         dateTime             = GeneralOpertor.GetDataTimeFullString(DateTime.Now);
            string         rasterName           = "ACOArea" + dateTime + ".img";
            IRasterDataset rst = ArcGISOperator.CreateRasterDataset(VariableMaintainer.DefaultOutputFolder,
                                                                    rasterName, simulationImageLayer, structRasterMetaData, occupiedStatus, 0);
            IRasterLayer n = new RasterLayerClass();

            n.CreateFromDataset(rst);
            IColorRamp colorRamp = new RandomColorRampClass();

            ArcGISOperator.UniqueValueRenderer(colorRamp, n, "Value");
            ArcGISOperator.FoucsMap.AddLayer((ILayer)n);

            double pixelWidth  = ((IRasterDefaultProps)n.Raster).DefaultPixelWidth;
            double pixelHeight = ((IRasterDefaultProps)n.Raster).DefaultPixelHeight;

            cellArea = pixelWidth * pixelHeight * antsCount;
            cellSize = pixelWidth;
            random   = new Random();

            dockableWindowOutput = currentDockableWindowOutput;
            dockableWindowGraphy = currentDockableWindowGraphy;
            stringBuilderMessage = new StringBuilder();
            isUseCompactness     = isUseCompactnessValue;

            dockableWindowGraphy.GraphTitle = "Goal Utility";
            dockableWindowGraphy.XAxisTitle = "Iteration";
            dockableWindowGraphy.YAxisTitle = "Goal Utility Value";
        }
Пример #8
0
        public float[,] GetSuitabilityData(string expression)
        {
            string[] splitedExpressionArray;
            bool     isSplited = SplitExpression(expression, out splitedExpressionArray);

            if (isSplited == false)
            {
                MessageBox.Show("Suitibility Function Express Error", VariableMaintainer.CurrentResourceManager.GetString("String2"),
                                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return(null);
            }
            //根据获取的文件名字符串去读取相应的栅格文件
            List <float[, ]> listLayers = new List <float[, ]>();

            structRasterMetaData = new StructRasterMetaData();
            for (int i = 0; i < splitedExpressionArray.Length; i++)
            {
                if (i > 0 && i % 2 > 0)
                {
                    string layerName = splitedExpressionArray[i];
                    if (i == 1)
                    {
                        listLayers.Add(ArcGISOperator.ReadRasterAndGetMetaData(
                                           ArcGISOperator.GetRasterLayerByName(layerName), out structRasterMetaData));
                    }
                    else
                    {
                        listLayers.Add(ArcGISOperator.ReadRaster(ArcGISOperator.GetRasterLayerByName(layerName),
                                                                 structRasterMetaData.NoDataValue));
                    }
                }
            }
            if (listLayers.Count == 0)
            {
                MessageBox.Show("Please select layers for calculation!", VariableMaintainer.CurrentResourceManager.GetString("String2"),
                                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return(null);
            }
            //读取全部文件后进行计算,生成适宜性图层数据,并进行归一化
            float[,] suitabilityData = new float[structRasterMetaData.RowCount, structRasterMetaData.ColumnCount];
            float      min = 1, max = 0;
            Expression ex = new Expression("1+1");

            //MathParser mathParser = new MathParser();
            for (int i = 0; i < structRasterMetaData.RowCount; i++)
            {
                for (int j = 0; j < structRasterMetaData.ColumnCount; j++)
                {
                    bool isNullData = false;
                    for (int k = 0; k < listLayers.Count; k++)
                    {
                        if (listLayers[k][i, j] == structRasterMetaData.NoDataValue)
                        {
                            isNullData = true;
                            break;
                        }
                    }
                    if (isNullData)
                    {
                        suitabilityData[i, j] = structRasterMetaData.NoDataValue;
                    }
                    else
                    {
                        string calculateExpression = "";
                        for (int w = 0; w < splitedExpressionArray.Length; w++)
                        {
                            if (w > 0 && w % 2 == 1)
                            {
                                calculateExpression += listLayers[w / 2][i, j];
                            }
                            else
                            {
                                calculateExpression += splitedExpressionArray[w];
                            }
                        }
                        ex = new Expression(calculateExpression);
                        suitabilityData[i, j] = Convert.ToSingle(ex.Evaluate());
                        //suitabilityData[i, j] = Convert.ToSingle(mathParser.Parse(calculateExpression, false));
                        if (suitabilityData[i, j] < min)
                        {
                            min = suitabilityData[i, j];
                        }
                        if (suitabilityData[i, j] > max)
                        {
                            max = suitabilityData[i, j];
                        }
                    }
                }
            }
            float[,] suitabilityData2 = new float[structRasterMetaData.RowCount, structRasterMetaData.ColumnCount];
            for (int i = 0; i < structRasterMetaData.RowCount; i++)
            {
                for (int j = 0; j < structRasterMetaData.ColumnCount; j++)
                {
                    if (suitabilityData[i, j] == structRasterMetaData.NoDataValue)
                    {
                        suitabilityData2[i, j] = structRasterMetaData.NoDataValue;
                    }
                    else
                    {
                        suitabilityData2[i, j] = (suitabilityData[i, j] - min) / (max - min);
                    }
                }
            }

            //将其他图层关闭,以免影响蚁群优化的刷新效果
            for (int i = 0; i < VariableMaintainer.CurrentFoucsMap.LayerCount; i++)
            {
                if (VariableMaintainer.CurrentFoucsMap.get_Layer(i).Visible)
                {
                    VariableMaintainer.CurrentFoucsMap.get_Layer(i).Visible = false;
                }
            }
            //显示适宜性图层
            string dateTime   = GeneralOpertor.GetDataTimeFullString(DateTime.Now);
            string rasterName = "suitability" + dateTime + ".img";

            ArcMap.Application.StatusBar.set_Message(0, VariableMaintainer.CurrentResourceManager.GetString("String169"));
            VariableMaintainer.CurrentDockableWindowOutput.AppendText(VariableMaintainer.CurrentResourceManager.GetString("String169") + rasterName + ".....\n");
            VariableMaintainer.CurrentDockableWindowOutput.AppendText("\n");

            IRasterLayer templateImageLayer = ArcGISOperator.GetRasterLayerByName(
                splitedExpressionArray[1].ToString());
            IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();
            IWorkspace        workspace        = workspaceFactory.OpenFromFile(VariableMaintainer.DefaultOutputFolder, 0);
            ISaveAs2          saveAs2          = (ISaveAs2)templateImageLayer.Raster;

            saveAs2.SaveAs(rasterName, workspace, "IMAGINE Image");
            IRasterLayer sutiabilityImageLayer = new RasterLayerClass();

            sutiabilityImageLayer.CreateFromFilePath(VariableMaintainer.DefaultOutputFolder + @"\" + rasterName);
            //sutiabilityImageLayer.Renderer = templateImageLayer.Renderer;
            ArcGISOperator.FoucsMap.AddLayer((ILayer)sutiabilityImageLayer);

            IRasterLayer simulationImageLayer = new RasterLayerClass();

            simulationImageLayer.CreateFromFilePath(VariableMaintainer.DefaultOutputFolder + @"\" + rasterName);
            ArcGISOperator.WriteRaster(simulationImageLayer, suitabilityData2);
            IRasterLayer l       = ArcGISOperator.GetRasterLayerByName(rasterName);
            IRaster2     raster  = simulationImageLayer.Raster as IRaster2;
            IPnt         fromPnt = new PntClass();

            fromPnt.SetCoords(0, 0);
            IPnt blockSize = new PntClass();

            blockSize.SetCoords(simulationImageLayer.ColumnCount, simulationImageLayer.RowCount);
            IPixelBlock pixelBlock = ((IRaster)raster).CreatePixelBlock(blockSize);

            l.Raster.Read(fromPnt, pixelBlock);
            ((IRasterEdit)l.Raster).Refresh();

            IActiveView activeView = VariableMaintainer.CurrentFoucsMap as IActiveView;

            activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
            return(suitabilityData2);
        }
Пример #9
0
        /// <summary>
        /// 当向导页的新一页出现前可以做的该页初始化工作。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void wizardLogistcCA_AfterSwitchPages(object sender, CristiPotlog.Controls.Wizard.AfterSwitchPagesEventArgs e)
        {
            //切换至逻辑回归计算页时,应首先读取地图图层信息,填写部分控件
            if (e.OldIndex == 1 && e.NewIndex == 2)
            {
                //如果不是第一次打开窗体,则再次读取地图数据
                application             = ArcMap.Application;
                document                = application.Document as IMxDocument;
                map                     = document.FocusMap;
                ArcGISOperator.FoucsMap = document.FocusMap;
                //如果图层选择框为空
                if (comboBoxTrainingStartImage.Items.Count == 0)
                {
                    for (int i = 0; i < map.LayerCount; i++)
                    {
                        string layerName = map.get_Layer(i).Name;
                        comboBoxTrainingStartImage.Items.Add(layerName);
                        comboBoxTrainingEndImage.Items.Add(layerName);
                        comboBoxSimStartImage.Items.Add(layerName);
                        comboBoxSimEndImage.Items.Add(layerName);
                    }
                }
            }
            //切换到土地利用类型设置页时首先获取图层信息,然后填充土地利用类型
            else if (e.OldIndex == 2 && e.NewIndex == 3)
            {
                listVariableLayersName.Clear();
                trainingStartImageName = comboBoxTrainingStartImage.SelectedItem.ToString();
                trainingEndImageName   = comboBoxTrainingEndImage.SelectedItem.ToString();
                for (int i = 0; i < dataGridViewVariableDatas.Rows.Count; i++)
                {
                    listVariableLayersName.Add(dataGridViewVariableDatas.Rows[i].Cells[0].Value.ToString());
                }

                //如果已经完成了回归,则不再进行
                if (isRegressed)
                {
                    return;
                }

                dataGridViewLandUse.Rows.Clear();
                IRasterLayer rasterLayer = ArcGISOperator.GetRasterLayerByName(trainingStartImageName);
                IRasterUniqueValueRenderer  rasterUniqueValueRenderer  = (IRasterUniqueValueRenderer)rasterLayer.Renderer;
                IRasterRendererUniqueValues rasterRendererUniqueValues = (IRasterRendererUniqueValues)rasterUniqueValueRenderer;
                IUniqueValues uniqueValues     = rasterRendererUniqueValues.UniqueValues;
                List <object> listUniqueValues = new List <object>();
                for (int i = 0; i < uniqueValues.Count; i++)
                {
                    listUniqueValues.Add(uniqueValues.get_UniqueValue(i));
                }
                int classCount = rasterUniqueValueRenderer.get_ClassCount(0);
                for (int i = 0; i < classCount; i++)
                {
                    dataGridViewLandUse.Rows.Add();
                    dataGridViewLandUse.Rows[i].Cells[0].Value = listUniqueValues[i];
                    dataGridViewLandUse.Rows[i].Cells[1].Value = rasterUniqueValueRenderer.get_Label(0, i);

                    ISymbol     symbol     = rasterUniqueValueRenderer.get_Symbol(0, i);
                    IFillSymbol fillSymbol = symbol as IFillSymbol;
                    //ISimpleFillSymbol simpleFillSymbol = (ISimpleFillSymbol)symbol;
                    //IColor esriColor = simpleFillSymbol.Color;
                    IColor    esriColor = fillSymbol.Color;
                    IRgbColor rgbColor  = new RgbColorClass();
                    rgbColor.CMYK = esriColor.CMYK;
                    Color color = Color.FromArgb(rgbColor.Red, rgbColor.Green, rgbColor.Blue);
                    dataGridViewLandUse.Rows[i].Cells[3].Value =
                        GeneralOpertor.GetBitmap(15, 15, color);
                }
                ColumnLUCharacter.Items.Clear();
                ColumnLUCharacter.Items.Add(resourceManager.GetString("String6"));
                ColumnLUCharacter.Items.Add(resourceManager.GetString("String7"));
                ColumnLUCharacter.Items.Add(resourceManager.GetString("String8"));
            }
            //切换到逻辑回归计算页面时进行计算
            if (e.OldIndex == 3 && e.NewIndex == 4)
            {
                if (isRegressed)
                {
                    return;
                }

                dataGridViewLogisticRegressionCoeff.Rows.Clear();
                labelCalculte.Text           = resourceManager.GetString("String9");
                labelCalculte.Visible        = true;
                progressBarCalculate.Visible = true;
                Application.DoEvents();

                //1.读取起始图像、终止图像、各变量图像为数组
                IRasterLayer   rasterLayerStartImage = ArcGISOperator.GetRasterLayerByName(comboBoxTrainingStartImage.SelectedItem.ToString());
                IRasterLayer   rasterLayerEndImage   = ArcGISOperator.GetRasterLayerByName(comboBoxTrainingEndImage.SelectedItem.ToString());
                RasterSampling rasterSampling        = new RasterSampling();
                labelCalculte.Text = resourceManager.GetString("String12");
                Application.DoEvents();
                List <int> notNullRows;
                List <int> notNullColumns;
                trainingStartImage = ArcGISOperator.ReadRasterAndGetNotNullRowColumn(rasterLayerStartImage, out structRasterMetaData,
                                                                                     out notNullRows, out notNullColumns);
                //获取最小空间范围
                List <IRasterLayer> listVariablesLayers = new List <IRasterLayer>();
                for (int i = 0; i < listVariableLayersName.Count; i++)
                {
                    listVariablesLayers.Add(ArcGISOperator.GetRasterLayerByName(listVariableLayersName[i]));
                }
                ArcGISOperator.GetSmallestBound(rasterLayerStartImage, rasterLayerEndImage, listVariablesLayers, ref structRasterMetaData);

                labelCalculte.Text = resourceManager.GetString("String13");
                Application.DoEvents();
                trainingEndImage     = ArcGISOperator.ReadRaster(rasterLayerEndImage, structRasterMetaData.NoDataValue);
                float[,] changeImage = GeneralOpertor.GetBinaryImageByTwoImages(trainingStartImage, trainingEndImage, structRasterMetaData.RowCount,
                                                                                structRasterMetaData.ColumnCount, structRasterMetaData.NoDataValue);
                //GeneralOpertor.WriteDataFloat(GetOutputFolder() + @"\lr_change.txt", changeImage, structRasterMetaData.RowCount, structRasterMetaData.ColumnCount);

                foreach (string layerName in listVariableLayersName)
                {
                    labelCalculte.Text = resourceManager.GetString("String14") + layerName + ".....";
                    Application.DoEvents();
                    varibaleImages.Add(ArcGISOperator.ReadRaster(ArcGISOperator.GetRasterLayerByName(layerName), structRasterMetaData.NoDataValue));
                }
                //2.按设置的比例进行随机抽样,得到抽样结果,然后计算
                //1.进行抽样
                labelCalculte.Text = resourceManager.GetString("String11");
                Application.DoEvents();
                int samplingCellsCount = (int)(structRasterMetaData.RowCount * structRasterMetaData.ColumnCount * numericUpDownSamplingPrecent.Value / 100);
                float[,] datas = new float[samplingCellsCount, listVariableLayersName.Count + 1];
                //抽取真值的比例默认设置为一半
                datas = rasterSampling.SamplingData(varibaleImages, changeImage, (double)numericUpDownSamplingPrecent.Value,
                                                    50, structRasterMetaData, notNullRows, notNullColumns);
                //2.进行计算
                labelCalculte.Text = resourceManager.GetString("String9");
                Application.DoEvents();
                //输出抽样结果数据
                //GeneralOpertor.WriteDataFloat(GetOutputFolder() + @"\lrSamplingData.txt", datas,
                //    rasterSampling.SamplingCellsCount, listVariableLayersName.Count + 1);

                //3.使用Accord.NET进行逻辑回归计算
                labelCalculte.Text = resourceManager.GetString("String9");
                Application.DoEvents();
                LogisticRegression lr = new LogisticRegression();
                double[]           odds;
                double[]           stde;
                double[]           min;
                double[]           max;
                lr.LogisticRegresssionAanlysis(datas, rasterSampling.SamplingCellsCount, listVariableLayersName.Count + 1,
                                               out coef, out odds, out stde, out min, out max);

                for (int i = 0; i < listVariableLayersName.Count + 1; i++)
                {
                    dataGridViewLogisticRegressionCoeff.Rows.Add();
                    if (i == 0)
                    {
                        dataGridViewLogisticRegressionCoeff.Rows[i].Cells[0].Value = resourceManager.GetString("String15");
                    }
                    else
                    {
                        dataGridViewLogisticRegressionCoeff.Rows[i].Cells[0].Value = listVariableLayersName[i - 1];
                    }
                    dataGridViewLogisticRegressionCoeff.Rows[i].Cells[1].Value = coef[i];
                    dataGridViewLogisticRegressionCoeff.Rows[i].Cells[2].Value = odds[i];
                    dataGridViewLogisticRegressionCoeff.Rows[i].Cells[3].Value = stde[i];
                    dataGridViewLogisticRegressionCoeff.Rows[i].Cells[4].Value = max[i];
                    dataGridViewLogisticRegressionCoeff.Rows[i].Cells[5].Value = min[i];
                }

                labelCalculte.Visible        = false;
                progressBarCalculate.Visible = false;
                Application.DoEvents();
                isRegressed = true;
            }
            //切换到模拟参数设置页时给定控件初始值,同时保存模拟数据信息
            else if (e.OldIndex == 4 && e.NewIndex == 5)
            {
                if (comboBoxSimEndImage.SelectedIndex == -1)
                {
                    buttonCalConvertCells.Enabled = false;
                }
                else
                {
                    buttonCalConvertCells.Enabled = true;
                }
            }
            //切换到模拟过程参数设置页时给定控件初始值,同时保存模拟参数信息
            else if (e.OldIndex == 5 && e.NewIndex == 6)
            {
                simulationStartImageName = comboBoxSimStartImage.SelectedItem.ToString();
                if (comboBoxSimEndImage.SelectedIndex != -1)
                {
                    simulationEndImageName = comboBoxSimEndImage.SelectedItem.ToString();
                }

                convertCount         = Convert.ToInt32(numericUpDownConvertCount.Value);
                simulationIterations = Convert.ToInt32(numericUpDownIterations.Value);
                delta = Convert.ToInt32(numericUpDownDelta.Value);

                numericUpDownRefresh.Value     = 10;
                numericUpDownOutputImage.Value = 10;
                outputFolder             = GetOutputFolder();
                textBoxOutputFolder.Text = outputFolder;
            }
            //切换到完成页时填充摘要,同时保存模拟过程输出参数的信息
            else if (e.OldIndex == 6 && e.NewIndex == 7)
            {
                refreshInterval     = Convert.ToInt32(numericUpDownRefresh.Value);
                outputImageInterval = Convert.ToInt32(numericUpDownOutputImage.Value);
                if (radioButtonOutput.Checked)
                {
                    isOutput = true;
                }
                else
                {
                    isOutput = false;
                }
                outputFolder = textBoxOutputFolder.Text;

                textBoxSummay.Text = WriteSummay();
            }
        }
Пример #10
0
        /// <summary>
        /// 输出摘要信息。
        /// </summary>
        public string WriteSummay()
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine(resourceManager.GetString("String100"));
            sb.AppendLine();

            sb.AppendLine(resourceManager.GetString("String73"));
            foreach (string variableName in listVariableLayersName)
            {
                sb.AppendLine(variableName);
            }

            sb.AppendLine();
            sb.AppendLine(resourceManager.GetString("String74"));
            sb.AppendLine(resourceManager.GetString("String27"));
            foreach (StructLanduseInfo structLanduseInfo in landUseClassificationInfo.UrbanValues)
            {
                sb.AppendLine(structLanduseInfo.LanduseTypeChsName + resourceManager.GetString("String28") + structLanduseInfo.LanduseTypeValue.ToString());
            }
            sb.AppendLine();
            sb.AppendLine(resourceManager.GetString("String29"));
            foreach (StructLanduseInfo structLanduseInfo in landUseClassificationInfo.ConvertValues)
            {
                sb.AppendLine(structLanduseInfo.LanduseTypeChsName + resourceManager.GetString("String28") + structLanduseInfo.LanduseTypeValue.ToString());
            }
            sb.AppendLine();
            sb.AppendLine(resourceManager.GetString("String30"));
            foreach (StructLanduseInfo structLanduseInfo in landUseClassificationInfo.NotToConvertValues)
            {
                sb.AppendLine(structLanduseInfo.LanduseTypeChsName + resourceManager.GetString("String28") + structLanduseInfo.LanduseTypeValue.ToString());
            }
            sb.AppendLine();

            sb.AppendLine(resourceManager.GetString("String19"));
            for (int i = 0; i < coef.Length; i++)
            {
                if (i == 0)
                {
                    sb.AppendLine(resourceManager.GetString("String20") + resourceManager.GetString("String21") + GeneralOpertor.FormatDouble(coef[0], "#.###"));
                }
                else
                {
                    sb.AppendLine(listVariableLayersName[i - 1] + resourceManager.GetString("String21") + GeneralOpertor.FormatDouble(coef[i], "#.###"));
                }
            }
            sb.AppendLine();

            sb.AppendLine(resourceManager.GetString("String76") + simulationStartImageName);
            sb.AppendLine(resourceManager.GetString("String77") + simulationEndImageName);
            sb.AppendLine();

            sb.AppendLine(resourceManager.GetString("String22") + numericUpDownConvertCount.Value.ToString() + resourceManager.GetString("String23"));
            sb.AppendLine(resourceManager.GetString("String31") + numericUpDownIterations.Value.ToString() + resourceManager.GetString("String24"));
            sb.AppendLine(resourceManager.GetString("String25") + Convert.ToInt32(numericUpDownConvertCount.Value / numericUpDownIterations.Value).ToString() + resourceManager.GetString("String23"));
            sb.AppendLine();
            sb.AppendLine(resourceManager.GetString("String26") + numericUpDownDelta.Value.ToString());
            sb.AppendLine();
            sb.AppendLine();

            sb.AppendLine(resourceManager.GetString("String32"));
            sb.AppendLine(resourceManager.GetString("String33") + numericUpDownRefresh.Value + resourceManager.GetString("String34"));
            if (isOutput)
            {
                sb.AppendLine(resourceManager.GetString("String33") + numericUpDownOutputImage.Value + resourceManager.GetString("String35"));
                sb.AppendLine(resourceManager.GetString("String36") + textBoxOutputFolder.Text);
            }
            sb.AppendLine();
            sb.AppendLine();

            return(sb.ToString());
        }