2.4.Thủ tục thuật toán AntSystem

Một phần của tài liệu Tiểu luận môn LẬP TRÌNH SYMBOLIC VÀ ỨNG DỤNG Tìm hiểu Ant Colony Optimization (Trang 33)

Khi ta đã có thủ tục tìm một đường đi cho các thuật toán kiến thì đối với thuật toán này ta chỉ xây dựng thêm thủ tục cập nhật vệt mùi.

Mã giả thuật toán như sau:

numOfAnts:=10; (số lượng kiến cho mỗi bước xây dựng lời giải) numOfTurns:=5; (số lượng bước xây dựng lời giải)

pheromoneInit:=0.8 (để khởi tạo ma trận vệt mùi ban đầu cho các cạnh) evaporationRate:=0.9 (tỷ lệ bốc hơi sau của vệt mùi)

goodPaths:={} (các đường đi tốt)

proc AntSystem()

pheromoneMatrix:= Matrix(v,v, pheromoneInit); (v là số cạnh)

forfrom 1 to numOfTurns do forfrom 1 to numOfAnts do

path:=FindAPathOfTravelingSalesman(); addToGoodPaths(path); enddo enddo UpdatePheromones(pheromoneMatrix, evaporationRate); end proc

Ở thủ tục trên ta thấy rất đơn giản, tuy nhiên vấn đề nằm ở chỗ chọn tỷ lệ bốc hơi của vệt mùi, lượng mệt mùi khởi tạo và thủ tục ‘UpdatePheromones’.

Chọn các tham số này ảnh hưởng như thế nào đã được nói ở phần “Các chú ý khi áp dụng thuật toán tối ưu đàn kiến”.

2.5.Thủ tục thuật toán Max-MinAntSystem

Cài đặt thủ tục này khác với thủ tục thuật toán Ant System ở hai chỗ chính. Thứ nhất là việc cập nhật mùi ở đây là Best-so-far, có nghĩa là những đường đi tốt nhất mới được lưu lại vệt mùi. Thứ hai là sau một số bước xây dựng lời giải mà thấy đường đi không được cải thiện thì ta sẽ khởi tạo lại ma trận vệt mùi. Ngoài ra, còn có một số chi tiết khác được cài đặt như trong mô tả thuật toán là lượng vệt mùi bốc hơi chậm và ma trận vệt mùi ban đầu có nồng độ cao.

Mã giả thuật toán như sau:

numOfAnts:=10; (số lượng kiến cho mỗi bước xây dựng lời giải) numOfTurns:=5; (số lượng bước xây dựng lời giải)

pheromoneInit:=0.8 (để khởi tạo ma trận vệt mùi ban đầu cho các cạnh) evaporationRate:=0.9 (tỷ lệ bốc hơi sau của vệt mùi)

minPheromonesIntensity:=0.2 (nồng độ vệt mùi tối thiểu) maxPheromonesIntensity:=1 (nồng độ vệt mùi tối đa) numOfTurnsWithoutImprovement:=0

(số bước giải không cải thiện được đường đi)

goodPaths:={} (các đường đi tốt)

proc AntSystem()

forfrom 1 to numOfTurns do forfrom 1 to numOfAnts do

path:=FindAPathOfTravelingSalesman(); addToGoodPaths(path);

enddo

if pathWithoutImprovement then (nếu đường đi không cải thiện) numOfTurnsWithoutImprovement + 1;

endif enddo

UpdatePheromonesBestSoFar ();

if numOfTurnsWithoutImprovement = numOfTurns\2 then

pheromoneMatrix:=Matrix(v,v, pheromoneInit);

endif end proc

Ở trên, ta cho rằng nếu sau ½ số bước xây dựng lời giải mà đường đi không cải thiện thì ta khởi tạo lại ma trận vệt mùi. Như đã nói ở trên, các tham số liên quan đến vệt mùi, điều kiện để khởi tạo lại ma trận mùi tùy thuộc vào từng trường hợp cụ thể.

(adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu Tiểu luận môn LẬP TRÌNH SYMBOLIC VÀ ỨNG DỤNG Tìm hiểu Ant Colony Optimization (Trang 33)