пятница, 15 апреля 2016 г.

Simulation. Balls

Есть очень простая задача. Понять что такое Имитационное Моделирование.

Я тут на скорую руку создал простой проект на Delphi7, который мне дал некоторое представление что же такое Simulation Modeling, то есть Имитационное Моделирование.

Вот так выглядит реализация проекта


Создан тип TBall

type TBall = class
  private
  public
    shape: TShape;
    WinControl: Twincontrol;
    balls: TList;
    id: string;
    x, y, d, vx, vy, ax, ay: integer;
    l: TLabel;
    constructor Create(balls0: TList; WC0: TWinControl; x0, y0, d0: integer; color0: TColor);
    procedure Move(dx, dy: integer);
    procedure Edge();
    procedure Intersection(x0, y0: integer);
  end;

implementation

constructor TBall.Create(balls0: TList; WC0: TWinControl; x0, y0, d0: integer; color0: TColor);
begin
  balls:=balls0;
  shape:=TShape.Create(WC0);
  WinControl:=WC0;
  shape.Left:=x0;
  shape.Top:=y0;
  shape.Shape:=stCircle;
//  shape.Shape:=stRectangle;
  shape.Height:=d0;
  shape.Width:=d0;
  shape.Brush.Color:=color0;
  shape.Parent:=WC0;
  x:=x0;
  y:=y0;
  d:=d0;
  l:=TLabel.Create(WC0);
  l.Parent:=WC0;
end;

procedure TBall.Edge();
begin
  if x>Wincontrol.Width-d-0 then x:=Wincontrol.Width-d-0;
  if x<0 nbsp="" then="" x:="0;</p">
  if y>WinControl.Height-d-0 then y:=WinControl.Height-d-0;
  if y<0 nbsp="" then="" y:="0;</p">
end;

procedure TBall.Intersection(x0,y0: integer);
var i: integer;
begin
  for i:=0 to balls.Count-1 do begin
    if balls[i]<>self then begin
      if (x
         (x+d>TBall(balls[i]).x)and(y+d>TBall(balls[i]).y) then begin
        x:=x0;
        y:=y0;
      end;
    end;
  end;
end;

procedure TBall.Move(dx, dy: integer);
begin
  x:=x+dx;
  y:=y+dy;
  Edge;
  Intersection(x-dx, y-dy);
  shape.Left:=x;
  shape.Top:=y;
  if l<>nil then begin
    l.Caption:=' '+id+' ';//IntToStr(x)+' '+IntToStr(y);
    l.Left:=x+Trunc(d/2)-Trunc(l.Width/2);
    l.Top:=y+Trunc(d/2)-Trunc(l.Height/2);
  end;
end;

Форма TForm называется Main. Содержит панель Panel1 на весь экран, и таймер TTimer1.
Вот код:

procedure TMain.FormCreate(Sender: TObject);
var b: TBall;
begin
  Width:=266;
  Height:=238;
//  Caption:=IntTostr(Panel1.Width)+' '+IntTostr(Panel1.Height);
  balls:=TList.Create;
  b:=TBall.Create(balls, Panel1, 0, 0, 40, clGreen);
  b.id:='1';
  balls.Add(b);
  b:=TBall.Create(balls, Panel1, 50, 50, 40, clGray);
  b.id:='2';
  balls.Add(b);
  b:=TBall.Create(balls, Panel1, 100, 100, 40, clFuchsia);
  b.id:='3';
  balls.Add(b);
  b:=TBall.Create(balls, Panel1, 150, 150, 40, clYellow);
  b.id:='4';
  balls.Add(b);
  b:=TBall.Create(balls, Panel1, 200, 200, 40, clRed);
  b.id:='5';
  balls.Add(b);
  b:=TBall.Create(balls, Panel1, 0, 300, 40, clBlue);
  b.id:='6';
  balls.Add(b);
end;

procedure TMain.Timer1Timer(Sender: TObject);
var i: integer;
    dx, dy: integer;
begin
  for i:=0 to balls.Count-1 do begin
    dx:=(Random(3)-1)*5;
    dy:=(Random(3)-1)*5;
    TBall(balls[i]).Move(dx, dy);
  end;
end;

Разберем тип TBall. Он должен содержать конструктор с начальными параметрами, такими как координаты, скорость и ускорение, если будем учитывать кинетическое движение шарика. Объект может быть вовсе не шарик, а, допустим, квадратик. Шарик просто красивее.
Шарики в данном случае создаются при создании формы. Шарики могут создаваться не только при создании формы, но и при каком-то условии, например, при ударении шарика верхней границы. Шарики двигаются в рамках каких-то условий, например, границ прямоугольника. За это отвечает процедура Edge.Также шарики должны знать друг о друге. За это отвечает переменная balls списка TList. Для чего нужно знать про другие шарики? Чтобы они не наезжали друг на друга. За это отвечает процедура Intersection. Также процедура Move отвечает за движение в рамках этих ограничений влево и вправо. Движение влево и вправо генерируется случайно (-5, 0, 5 c равными вероятностяи) и навешивается на таймер для всех шариков.

Что это дает? Понимание как можно и нужно создавать имитационные модели.
Можно таким образом моделировать поведение людей в обществе, поведение пользователей работы с сервисом, поведение сотрудников на проекте и т.д. При этом у сотрудника может быть довольно много параметров, не только координаты и скорость.
Модели должны иметь регулярную обратную связь.
На модели можно и нужно влиять, допустим, увеличить скорость, добавить ограничения, изменить правила взаимодействия. Имитационные модели должны выдавать интересующие нас параметры, распределенные во времени, допустим.

Короче, такой подход вполне применим для Имитационных Моделей в ИТ, а также в смежных областях. Чем я и собираюсь заниматься.

Комментариев нет:

Отправить комментарий