Автор работы: Пользователь скрыл имя, 26 Февраля 2011 в 12:33, курсовая работа
Актуальность работы. В последние годы интенсивно разрабатывается научное направление с названием «Природные вычисления» (Natural Computing), объединяющее математические методы, в которых заложены принципы природных механизмов принятия решений. Эти механизмы обеспечивают эффективную адаптацию флоры и фауны к окружающей среде на протяжении нескольких миллионов лет.
Введение..................................................................................................................3
Глава 1. Муравьиные алгоритмы.
1. Биологические принципы поведения муравьиной колонии.................5
2. Истории создания муравьиных алгоритмов...........................................7
3. Концепция муравьиных алгоритмов.................................. …………....9
4. Обобщённый алгоритм............................................... ...........................11
5. Этапы решения задачи при помощи муравьиных алгоритмов...........13
6. Достоинства и недостатки муравьиных алгоритмов...........................14
6.1. Достоинства:.........................................................................................14
6.2. Недостатки:...........................................................................................14
Глава 2. Применение муравьиных алгоритмов при решении задач оптимизации.
1.1. Применение муравьиных алгоритмов для задачи
коммивояжёра..............................................................................................16
1.2. Муравьиный алгоритм для задачи коммивояжёра в псевдокоде..............................................................................................................25
2.1. Задача оптимального распределения файлов в компьютерной сети……………………………………………………………………….…...28
2.2 Муравьиный алгоритм для задачи распределения файлов
в компьютерной сети в псевдокоде…………………………..…………29
Заключение………………...................................................................................32
Список использованной литературы...................................................................33
Ресурсы в интернете
Приложения.
1.Листинг
программы решения
задачи коммивояжера
в среде Delphi.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ExtCtrls, Grids;
type
TForm1 = class(TForm)
UpDown1: TUpDown;
Edit1: TEdit;
Label1: TLabel;
Panel1: TPanel;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
Button1: TButton;
Memo1: TMemo;
procedure UpDown1Click(Sender: TObject; Button: TUDBtnType);
procedure FormShow(Sender: TObject);
procedure StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: String);
procedure StringGrid2SetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: String);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
procedure StringGrid2KeyPress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Init( nomer:integer);
procedure muravei(o:integer);
private
{ Private declarations }
public
{ Public declarations }
end;
const
max_count = 100; //максимальное колличество вершин
t_max=100; // время жизни колонии
var
Form1 : TForm1;
count : integer;
tau,p : array[1..max_count, 1..max_count] of double;
// матрица , указывает какие точки еще не прошел муравей
q : array[1..max_count, 1..max_count] of boolean;
// матрица указывает , последовательность прохождения точек
t,l : array[1..max_count, 1..max_count] of integer;
tm,dt : array[1..max_count] of integer;
dtm : integer; //
implementation
{$R *.dfm}
procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);
var
i:integer;
begin
//количество вершин
count := form1.UpDown1.Position;
form1.StringGrid1.ColCount := count + 1;
form1.StringGrid1.RowCount := count + 1;
form1.StringGrid2.ColCount := count + 1;
form1.StringGrid2.RowCount := count + 1;
for i:=1 to count do
begin
form1.StringGrid1.Cells[i,0] := IntToStr(i);
form1.StringGrid1.Cells[0,i] := IntToStr(i);
form1.StringGrid1.Cells[i,i]:=
form1.StringGrid2.Cells[i,0] := IntToStr(i);
form1.StringGrid2.Cells[0,i] := IntToStr(i);
form1.StringGrid2.Cells[i,i]:=
end;
end;
procedure TForm1.FormShow(Sender: TObject);
var
i:integer;
begin
form1.UpDown1.Max := max_count;
form1.UpDown1.min := 2;
count := form1.UpDown1.Position;
form1.Edit1.Text:=IntToStr(
form1.StringGrid1.ColCount:=
form1.StringGrid1.RowCount:=
form1.StringGrid2.ColCount:=
form1.StringGrid2.RowCount:=
for i:=1 to count do
begin
form1.StringGrid1.Cells[i,0] := IntToStr(i);
form1.StringGrid1.Cells[0,i] := IntToStr(i);
form1.StringGrid1.Cells[i,i]:=
form1.StringGrid2.Cells[i,0] := IntToStr(i);
form1.StringGrid2.Cells[0,i] := IntToStr(i);
form1.StringGrid2.Cells[i,i]:=
end;
end;
procedure TForm1.StringGrid1SetEditText(
ARow: Integer; const Value: String);
begin
if acol=arow then
form1.StringGrid1.Cells[acol,
form1.StringGrid1.Cells[arow,
end;
procedure TForm1.StringGrid2SetEditText(
ARow: Integer; const Value: String);
begin
if acol=arow then
form1.StringGrid2.Cells[acol,
form1.StringGrid2.Cells[arow,
end;
procedure TForm1.StringGrid1KeyPress(
begin
if not (key in [chr(8),'0','1','2','3','4','
end;
procedure TForm1.StringGrid2KeyPress(
begin
if not (key in [chr(8),',','0','1','2','3','
end;
procedure TForm1.Init(nomer:integer);
var
i:integer;
begin
// какие точки ему еще осталость пройти
for i:=1 to count do
q[nomer,i]:=true;
q[nomer,nomer]:=false;
//от куда муравей идет
for i:=1 to count do
t[nomer,i]:=0;
t[nomer,1]:=nomer;
end;
procedure TForm1.muravei(o:integer);
var
i,h,k :integer;
z,cheslo :double;
begin
init(o);
for h:=1 to count -1 do
begin
// знаминатель из P
z:=0;
for i:=1 to count do
if q[o,i] then
z := z + tau[o,i]/l[o,i];
// формула Р
for i:=1 to count do
if q[o,i] then
p[o,i] :=100* tau[o,i]/l[o,i] / z;
cheslo:=0;
for i:=1 to count do
if q[o,i] then
begin
cheslo := cheslo + p[o,i];
p[o,i] := cheslo;
end;
z:= random(10000)/100;
k:=0;
for i:=1 to count do
if q[o,i] then
if z< p[o,i] then
begin
k:=i;
break;
end;
// k - то точка куда муравей перемещается
q[o,k]:=false;
i:=1;
while t[o,i]<>0 do
inc(i);
// записываем номер
t[o,i]:=k;
end;
//вычесляем путь
k:= 0;
for i:=1 to count-1 do
k:=k+l[t[o,i],t[o,i+1]];
k:=k+l[t[o,1],t[o,count]];
//запомнили значение
dt[o]:=k;
// for i:=1 to count do
// form1.Memo1.Lines.Add(
// form1.Memo1.Lines.Add('длина ровна'+FloatToStr(k));
end;
procedure TForm1.Button1Click(Sender: TObject);
var datetime1,datetime2:TDateTime;
st1: string;
i,j,k :integer;
begin
dateTime1:=Time;
randomize;
for i:=1 to count do
for j:=1 to count do
if i<>j then l[i,j]:=StrToINt(form1.
else l[i,j]:=0;
for i:=1 to count do
for j:=1 to count do
if i<>j then tau[i,j]:=StrToFloat(form1.
else tau[i,j]:=0;
//запускаем первого муравья
muravei(1);
//записваем его результаты
for i:=1 to count do
tm[i]:=t[1,i];
dtm:=dt[1];
for k:=1 to t_max do
begin
for i:=1 to count do
init (i);
for i:=1 to count do
muravei(i);
// если нашли лучшей результат , то записаваем его
for i:=1 to count do
if dtm > dt [i] then
begin
for j:=1 to count do
tm[j]:=t[i,j];
dtm:=dt[i];
// timer1.Interval:=timer1.
end;
for i:=1 to count-1 do
begin
tau[tm[i],tm[i+1]]:=tau[tm[i],
tau[tm[i+1],tm[i]]:=tau[tm[i],
//timer1.Interval:=timer1.
end;
tau[tm[1],tm[count]]:=tau[tm[
tau[tm[count],tm[1]]:=tau[tm[
for i:=1 to count do
for j:=1 to count do
form1.StringGrid2.Cells[i,j]:=
end;
form1.Memo1.Clear;
for i:=1 to count do
form1.Memo1.Lines.Add(
form1.Memo1.Lines.Add('длина равна '+FloatToStr(dtm));
dateTime2:=Time;
str(8640000*(DateTime2-
caption:=st1+'ms';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.UpDown1.Position:=5;
form1.StringGrid1.Cells[1,2]:=
form1.StringGrid1.Cells[1,3]:=
form1.StringGrid1.Cells[1,4]:=
form1.StringGrid1.Cells[1,5]:=
form1.StringGrid1.Cells[2,1]:=
form1.StringGrid1.Cells[2,3]:=
form1.StringGrid1.Cells[2,4]:=
form1.StringGrid1.Cells[2,5]:=
form1.StringGrid1.Cells[3,1]:=
form1.StringGrid1.Cells[3,2]:=
Информация о работе Применение муравьиных алгоритмов при решении задач оптимизации