public void GenerateMatrixes(IMatrixWriteStorage <int, EmptyData> matrixStorage)
            {
                Random rnd = new Random();

                for (int matrindex = 0; matrindex < count; matrindex++)
                {
                    DenseMatrix <int> matrix = new DenseMatrix <int>(m, n);
                    int mountainsCount       = mountainsMin + rnd.Next(mountainsMax - mountainsMin);

                    for (int mountain = 0; mountain < mountainsCount; mountain++)
                    {
                        double x = rnd.NextDouble() * m;
                        double y = rnd.NextDouble() * n;

                        double a = min_h + rnd.NextDouble() * (max_h - min_h);
                        double b = 1 / (min_w + rnd.NextDouble() * (max_w - min_w));

                        foreach (var index in MatrixEnumerator.Indexes(matrix))
                        {
                            double rx = index[0] - x;
                            double ry = index[1] - y;
                            double r  = b * Math.Sqrt(rx * rx + ry * ry);
                            matrix[index] += (int)(a * Math.Exp(-r * r));
                        }
                    }

                    foreach (var index in MatrixEnumerator.Indexes(matrix))
                    {
                        matrix[index] += 1;
                    }

                    matrixStorage.SaveMatrix("Exponent", matrix, null);
                }
            }
Пример #2
0
            public void GenerateMatrixes(IMatrixWriteStorage <int, EmptyData> matrixStorage)
            {
                Random rnd = new Random();

                for (int i = 0; i < count; i++)
                {
                    DenseMatrix <int> matrix = new DenseMatrix <int>(countRows, countColumns);

                    foreach (IIndex index in MatrixEnumerator.Indexes(matrix))
                    {
                        matrix[index] = rnd.Next(max - min + 1) + min;
                    }

                    matrixStorage.SaveMatrix("uniform", matrix, null);
                }
            }
            public void GenerateMatrixes(IMatrixWriteStorage <int, EmptyData> matrixStorage)
            {
                Random rnd = new Random();

                var indexIJ = new Index2D();

                for (int matrindex = 0; matrindex < count; matrindex++)
                {
                    DenseMatrix <int> matrix = new DenseMatrix <int>(m, n);
                    int rectsCount           = rectsMin + rnd.Next(rectsMax - rectsMin);

                    for (int rect = 0; rect < rectsCount; rect++)
                    {
                        int x1 = rnd.Next(m);
                        int y1 = rnd.Next(n);

                        int x2 = x1 + rnd.Next(m - x1);
                        int y2 = y1 + rnd.Next(n - y1);

                        int A = min_h + rnd.Next(max_h - min_h);

                        for (indexIJ.I = x1; indexIJ.I <= x2; indexIJ.I++)
                        {
                            for (indexIJ.J = y1; indexIJ.J <= y2; indexIJ.J++)
                            {
                                matrix[indexIJ] += A;
                            }
                        }
                    }

                    foreach (var index in MatrixEnumerator.Indexes(matrix))
                    {
                        matrix[index] += 1;
                    }

                    matrixStorage.SaveMatrix("Rectangles", matrix, null);
                }
            }
            public void GenerateMatrixes(IMatrixWriteStorage <int, EmptyData> matrixStorage)
            {
                Random rnd = new Random();

                for (int matrindex = 0; matrindex < count; matrindex++)
                {
                    #region // задаём разбиения по каждому измерению
                    // формируем массив номеров строк, по которым идёт разбиение
                    List <int> num_row = CreatePartition(M1, n);

                    // формируем массив номеров столбцов, по которым идёт разбиение
                    List <int> num_col = CreatePartition(M2, m);


                    #endregion

                    #region  // заполнение матрицы

                    int[,] matrix = new int[n, m];
                    int size_row, size_col, size_block;
                    int sum_control;                           // переменная для контороля того, что в каждом блоке // загрузка равна заданной загрузке w_block
                    int Max = 0;                               // максимальная суммарная загрузка

                    int    w_block;
                    double h, f;
                    int    expectation_1, expectation_2;
                    double D1, D2;

                    for (int i = 0; i < M1 + 1; i++)
                    // суммарная загрузка каждого блока принимает значение в отрезке: [w - epsilon, w + epsilon],
                    // но в зависимости от размера каждого блока этот отрезок может стать меньше
                    {
                        size_row      = num_row[i + 1] - num_row[i];
                        expectation_1 = num_row[i + 1] - (num_row[i + 1] - num_row[i]) / 2;
                        for (int j = 0; j < M2 + 1; j++)
                        {
                            size_col = num_col[j + 1] - num_col[j];

                            // размерность текущего блока (i, j)
                            size_block = size_row * size_col;
                            h          = rnd.NextDouble() * (max_h - min_h) + min_h;
                            w_block    = rnd.Next(Math.Max(size_block, min_w), max_w + 1);

                            if (w_block > Max)
                            {
                                Max = w_block;
                            }
                            // заполнение ячеек текущего блока целочисленными значениями по распределению Гаусса
                            sum_control = 0;
                            // генерируем центр распределения: это есть (M1, M2) - локальные координаты
                            expectation_2 = num_col[j + 1] - (num_col[j + 1] - num_col[j]) / 2;
                            // пусть D1 = D2
                            D1 = D2 = Math.Sqrt(1 / (2 * h * Math.PI));

                            for (int k = num_row[i] + 1; k <= num_row[i + 1]; k++)
                            {
                                for (int l = num_col[j] + 1; l <= num_col[j + 1]; l++)
                                {
                                    // нужно использовать локальные координаты
                                    f            = w_block * (1.0 / (2.0 * Math.PI * D1 * D2)) * Math.Exp(-0.5 * ((((k - expectation_1) * (k - expectation_1)) / (D1 * D1)) + (((l - expectation_2) * (l - expectation_2)) / (D2 * D2))));
                                    matrix[k, l] = (int)Math.Ceiling(f);
                                    sum_control += matrix[k, l];
                                }
                            }
                            if (w_block < sum_control)
                            {
                                // перебор по суммарной загрузке блока
                                while ((w_block < sum_control) && (w_block >= sum_control - size_block))
                                {
                                    sum_control -= size_block;
                                    for (int k = num_row[i] + 1; k <= num_row[i + 1]; k++)
                                    {
                                        for (int l = num_col[j] + 1; l <= num_col[j + 1]; l++)
                                        {
                                            matrix[k, l] = Math.Max(1, matrix[k, l]--);
                                        }
                                    }
                                }
                            }
                            else
                            {
                                // недобор по суммарной загрузке блока
                                while (w_block > sum_control)
                                {
                                    sum_control += size_block;
                                    for (int k = num_row[i] + 1; k <= num_row[i + 1]; k++)
                                    {
                                        for (int l = num_col[j] + 1; l <= num_col[j + 1]; l++)
                                        {
                                            matrix[k, l]++;
                                        }
                                    }
                                }
                            }
                        }
                    }

                    #endregion

                    #region // полученное решение
                    // 1. матрица matrix
                    // 2. разбиение по осям
                    CreateSolution(num_row, num_col);
                    // максимальная загрузка при полученном разбиении
                    // 3. Max
                    #endregion

                    #region // вывод для проверки
                    for (int i = 0; i < n; i++)
                    {
                        Console.WriteLine();
                        for (int j = 0; j < m; j++)
                        {
                            int ost = matrix[i, j] / 10;
                            if (ost == 0)
                            {
                                Console.Write(" ");
                            }
                            Console.Write(matrix[i, j] + "   ");
                        }
                    }
                    #endregion

                    DenseMatrix <int> Matrix = new DenseMatrix <int>(n, m);

                    foreach (var index in MatrixEnumerator.Indexes(Matrix))
                    {
                        Matrix[index] = matrix[index[0], index[1]];
                    }

                    matrixStorage.SaveMatrix("Gauss", Matrix, null);
                }
            }