Клеточные автоматы.

20 сентября 2018 - Администратор

  Компьютерное моделирование клеточных автоматов

В данной статье мы разберем пример имитационной компьютерной модели распространения загрязнений с помощью алгоритмов клеточных автоматов Клеточный автомат это набор клеток, образующий некоторую периодическую решетку с заданными правилами перехода, определяющими состояние клетки в следующий момент времени через состояние соседних клеток. Каждое изменение состояния решетки называется итерацией. Алгоритм определения состояния клетки в зависимости от соседних, называется правилом клеточного автомата.
Значение во всех клетках меняется одновременно, поэтому сохраняется решетка со старыми значениями и на ее основе формируется новая решетка.
При  планировании строительства новых предприятий необходимо иметь модель, способную оценить  возможное влияние данных  предприятий  на уровни загрязнений атмосферы. Особенно это актуально при непосредственной близости  жилых  районов. Также важно иметь модель загрязнений атмосферы   уже существующих предприятий при планировании строительства новых жилых районов. Поэтому очень актуально наличие компьютерной  модели, позволяющей моделировать устойчивую картину загрязнения атмосферы.
Существующие математические модели  достаточно сложны для реализации в больших масштабах. Задачу можно решить и другим простым способом имитационного моделирования с помощью клеточных автоматов. Преимущество данного подхода заключается в том , что  при его использовании производится непосредственное компьютерное моделирование   самих процессов распространения  и нет необходимости решать сложные уравнения распространения.  Данную модель можно применять только для уже устоявшейся  конфигурации предприятий и розы ветров для рассматриваемой местности. Т.е. модель покажет  устоявшуюся усредненную модель загрязнения. Для многих практических экологических задач планирования строительства  предприятий и жилых комплексов  применение данной методики будет актуально.
Перед началом работы необходимо задать массив розы ветров. ak - это массив из девяти элементов, содержащий вероятности ветров соответствующих восьми направлений и вероятность штиля.  В сумме все вероятности  должны давать единицу.
Карта местности  представляется в виде клеточного поля. На поле помечаются клетки, в которых находятся эпицентры распространения загрязнения. Затем концентрацию загрязнителя в каждой клетке поля можно рассчитать , используя значения из окружающих клеток:
Шаг за шагом для всех клеток поля вычисляется сумма произведений концентраций в соседних восьми ячейках на соответствующие вероятности ветров.         

клеточный автомат

К сумме прибавляется еще и произведение вероятности штиля на концентрацию загрязнителя в самой текущей клетке.  

 

 Само собой разумеется, что девять вероятностей ветров различных направлений, включая вероятность штиля, должны в сумме давать единицу.Шаг за шагом для всех клеток поля вычисляется сумма произведений концентраций в соседних восьми ячейках на соответствующие вероятности ветров. К сумме прибавляется еще и произведение вероятности штиля на концентрацию загрязнителя в самой текущей клеточке.
Для нормальной работы программы необходимо иметь две копии клеточного поля. В одной из копий следует хранить предыдущее поколение матрица b, а в другой – последующее матрица с. При смене поколений содержимое последующего поколения становится предыдущим. Из расчетов исключаются крайние ряды ячеек. Это делается для того, чтобы избежать "пограничных" проблем при применении формулы (1). Повторяя расчеты многократно, мы можем наблюдать динамику формирования эллипсоидов рассеивания во времени.
Для восприятия результатов моделирования важна раскраска клеток. В приведенном программном фрагменте использован алгоритм, переводящий значения концентраций загрязнителя в различные градации яркости цветов - от темно-красного до темно-зеленого

 

Задание. В функции определения цвета setcol(p) введите большее количество цветов в зависимости от параметра p. Для ввода градации цвета используется

Код программы на си для моделирования загрязнений с помощью клеточных автоматов. При реализации алгоритма на си задается и изменяется матрица загрязнения Подробно о работе с матрицами в си
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <graphics.h>
#include <dos.h>

// определяем цвет  точки в зависимости от уровня загрязнения это праметр p
int setcol(float p)
{
    int d;
    d=4;
    if( p>1 && p<2)  return 2;
    if( p>2 && p<3)  return 14;
    if( p>3)  return 4;
    if( p<1)  return 1;
   // return d;
};

int main(){
   int n,i,j,k,l,m,d,x,y;
   int rx,ry;// число квадратysклеток
   int r;// размер квадратика
   int g;// число итераций
   int color;// цвет ячейки
   float b[201][201];// старая сетка карты
   float c[201][201];
   float  a[9]={0.05,0.05,0.05,0.05,0.2,0.2,0.1,0.1,0.1};// роза ветров
   int start[10][3]; // массив с точками загрязнителями
   // ввод данных по загрязнителям
   printf("Введите количество загрязнителей ");
   scanf("%d",&n);
   printf("Всего загрязнителей %d ",n);
   // обнуление всей информации по зягрязнителям
   for(i=0;i<n;i++)
   {
    start[i][1]=0;
    start[i][2]=0; 
    start[i][3]=0;         
   };

  // ввод информации по загрязнителям координата x координата y и уровень загрязнения
   for(i=0;i<n;i++)
   {
     printf("Введите  x,  y  и урвень загрязнителя %d points: ",i+1);  
     scanf("%d%d%d",&start[i][1],&start[i][2],&start[i][3]);      
   };
   // вывод на ээкран розы ветров
   printf("Roza vetrov "); 
    for(i=0;i<9;i++)
   {
     printf("%d%f ",i,a[i]);                
   };  
   rx=100;//количество клетока на карте
   ry=100;//количество клетока на карте
   g=5000; // количество итераций повторений алгоритма
   r=3; // размер клетки
  // переходим в графический режим
  initwindow (400, 400);
  for (k=1; k<g;k++) // проходим очередную итерацию моделирования
  {
      // обновляем данные по загрязнителям
   for(i=0;i<n;i++)
   { x=start[i][1];
     y=start[i][2];
     b[x][y]=start[i][3];
   };
   // обновляем сетку
  for(i=2;i<rx-1;i++)
  {
    for(j=2;j<ry-1;j++)
   {
    c[i][j]=0;
    d=0;
    // обходим соседние клетки
    for (l=-1;l<=1;l++)
    {
    for (m=-1;m<=1;m++)
     {
        d=d+1;
        c[i][j]=c[i][j]+a[d]*b[i+l][j+m];
     }      
    }  
   }
  }
   // рисуем карту
   for (i=1;i<rx;i++)
   {
       for (j=1;j<ry;j++)
       {
           // определяем цвет , которым будем рисовать
           color=setcol(c[i][j]);
           // рисуем клетку с координатами i и j и размера r с цветом color
           setfillstyle ( 1, color);
           bar (i*r, j*r, (i+1)*r, (j+1)*r);
           b[i][j]=c[i][j]; 
       }
       // пауза
       delay(1);
   }
   };
   closegraph();
}    

Вернуться к содержанию

Комментарии (0)

Нет комментариев. Ваш будет первым!