Есть очень простая задача. Понять что такое Имитационное Моделирование.
Я тут на скорую руку создал простой проект на 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">0>
if y>WinControl.Height-d-0 then y:=WinControl.Height-d-0;
if y<0 nbsp="" then="" y:="0;</p">0>
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 равными вероятностяи) и навешивается на таймер для всех шариков.
Что это дает? Понимание как можно и нужно создавать имитационные модели.
Можно таким образом моделировать поведение людей в обществе, поведение пользователей работы с сервисом, поведение сотрудников на проекте и т.д. При этом у сотрудника может быть довольно много параметров, не только координаты и скорость.
Модели должны иметь регулярную обратную связь.
На модели можно и нужно влиять, допустим, увеличить скорость, добавить ограничения, изменить правила взаимодействия. Имитационные модели должны выдавать интересующие нас параметры, распределенные во времени, допустим.
Короче, такой подход вполне применим для Имитационных Моделей в ИТ, а также в смежных областях. Чем я и собираюсь заниматься.
Комментариев нет:
Отправить комментарий