Colony bee mô phỏng
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Colony bee mô phỏng

on

  • 806 views

 

Statistics

Views

Total Views
806
Views on SlideShare
806
Embed Views
0

Actions

Likes
0
Downloads
10
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft Word

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Colony bee mô phỏng Document Transcript

  • 1. Colony Bee mô phỏng (SBC) các thuật toán mô hình hành vi của ong mật và có thể được sửdụng để tìm giải pháp cho vấn đề khó khăn hoặc không thể tổ hợp. Trong bài viết này tôi sẽ giảithích chính xác những gì SBC thuật toán được, mô tả các loại vấn đề có thể được giải quyết bằngcách sử dụng SBC thuật toán, và trình bày một ví dụ cuối đến đầu cuối hoàn thành có sử dụngmột thuật toán SBC để giải quyết vấn đề bán hàng du lịch.Một cách tốt cho bạn để có được một cảm giác về các thuật toán SBC và xem nơi tôi đang đứngđầu trong bài viết này là để kiểm tra các chương trình đang chạy demo thấy trong hình 1.Chương trình demo sử dụng một thuật toán SBC để phân tích một tập hợp của 20 thành phố (cótên từ A đến T) và tìm đường đi ngắn nhất mà thăm mỗi thành phố đúng một lần. Các dữ liệunhân tạo được xây dựng thành phố để các con đường tốt nhất bắt đầu tại thành phố A và tiếp tụcthông qua T thành phố, theo thứ tự, và con đường tốt nhất có chiều dài 19,0 đơn vị.Đằng sau những cảnh các thuật toán SBC instantiates một tổ ong của 100 mô phỏng, mỗi trong số đócó một giải pháp tiềm năng ngẫu nhiên. Ban đầu, tốt nhất trong những giải pháp ngẫu nhiên có chiềudài 95,0 con đường của đơn vị. Các thuật toán SBC đi vào một vòng lặp xử lý, chỉ báo bằng thanh tiếntrình dựa trên văn bản, mà mô phỏng những hành vi của ong mật thông thường kiếm ăn cho thựcphẩm. Khi kết thúc vòng lặp xử lý SBC, giải pháp tốt nhất được tìm thấy có 16 vị trí chính xác trongthành phố 20, và có chiều dài con đường của giải pháp 26,5-gần, nhưng không hoàn toàn, tối ưu.SBC thuật toán thường được gọi là meta-heuristics bởi vì họ cung cấp một khuôn khổ chung và thiếtlập các hướng dẫn để tạo ra một giải pháp vấn đề hơn là giải pháp cung cấp một toa thuốc có nhiềuchi tiết. Bài viết này trình bày một ví dụ về cách sử dụng một SBC để giải quyết một vấn đề cụ thể. Mộtkhi bạn hiểu như thế nào một SBC có thể được sử dụng để giải quyết một vấn đề, bạn có thể thích ứngvới các thuật toán SBC trình bày ở đây để giải quyết vấn đề của riêng bạn. Khi bài viết này sẽ chứngminh, các thuật toán SBC là thích hợp nhất để giải quyết vấn đề phức tạp tổ hợp không có tính quyếtđịnh các giải pháp thực tế.Bài viết này giả sử bạn có kỹ năng lập trình trung cấp. Ví dụ trong bài viết này là mã hóa bằng cách sửdụng C #, nhưng tất cả các mã đã được viết để nó có thể dễ dàng tái cấu trúc các ngôn ngữ lập trìnhkhác. Tôi nghĩ rằng bạn sẽ tìm thấy bài viết này khá thú vị và khả năng sử dụng các thuật toán SBC mộtbổ sung hữu ích cho các kỹ năng cá nhân của bạn.Thông tin về các Beesong mật thông thường như Apis mellifera giả định vai trò khác nhau trong thuộc địa của mìnhtheo thời gian. Một tổ ong thông thường có thể có 5.000 đến 20.000 con ong cá nhân. ong trưởngthành (20 đến 40 ngày tuổi) thường trở thành ong. Tìm kiếm thức ăn ong thường chiếm mộttrong ba vai trò: ong đang hoạt động, ong trinh sát và ong không hoạt động.Active ong kiếm ăn đi du lịch đến một nguồn thực phẩm, kiểm tra nguồn thực phẩm hàng xóm,thu thập lương thực và trở về tổ.Hướng đạo ong điều tra khu vực xung quanh các tổ ong, thường là một khu vực lên tới 50 dặmvuông, tìm kiếm nguồn thức ăn hấp dẫn mới. Khoảng 10 phần trăm tìm kiếm thức ăn trong mộttổ ong được sử dụng như là trinh sát.Tại bất kỳ thời gian nhất định một số các con ong kiếm ăn không hoạt động. Các hoạt động kiếmăn đợi gần lối vào tổ. Khi ong trinh sát hoạt động và trở về tổ ong, tùy thuộc vào chất lượng củanguồn thực phẩm mà họ đã chỉ cần truy cập, họ có thể thực hiện một điệu nhảy lúc lắc để chờ đợinhững con ong không hoạt động. Có bằng chứng rõ ràng rằng điều này nhảy lúc lắc truyền đạtthông tin cho những con ong không hoạt động về vị trí và chất lượng của nguồn thực phẩm.Không hoạt động kiếm ăn nhận được thông tin nguồn gốc thực phẩm từ các điệu nhảy lúc lắc vàcó thể trở thành hoạt động kiếm ăn.
  • 2. Nói chung, một con ong kiếm ăn hoạt động tiếp tục thu thập thực phẩm từ một nguồn thực phẩmđặc biệt cho đến khi mà nguồn thức ăn cạn kiệt, lúc đó con ong trở thành một forager không hoạtđộng.Vấn đề Người bán hàng đi du lịchCác du lịch người bán hàng (TSP) là một trong những vấn đề nghiên cứu rộng rãi nhất trongnghiên cứu khoa học máy tính. Có nhiều biến thể của TSP nhưng, chính thức, vấn đề là để tìmđường đi ngắn nhất mà thăm mỗi thành phố trong một tập hợp của các thành phố đúng một lần.Nếu bạn nhìn vào hình 1 bạn có thể xem các chương trình demo SBC sử dụng một bộ 20 thànhphố được tự ý dán nhãn A đến T. Một đường dẫn hợp lệ bao gồm một lệnh đặt của các nhãnthành phố 20, nơi mỗi thành phố xảy ra đúng một lần. Vì vậy có tổng cộng 20! =2.432.902.008.176.640.000 có thể có đường dẫn.Đằng sau những cảnh có giá trị khoảng cách kết hợp với mỗi cặp của thành phố. Để đơn giản,nếu thành phố c1 <thành phố c2 khoảng cách giữa c1 và c2 chỉ là 1,0 lần khoảng cách thứ tựgiữa các nhãn thành phố. Nếu c1> c2 khoảng cách là 1,5 lần khoảng cách thứ tự giữa c1 và c2.Vì vậy, khoảng cách từ A đến B là 1,0 đơn vị tùy ý, khoảng cách từ B đến A là 1,5 đơn vị,khoảng cách từ A đến C là 2,0 đơn vị, vv. Vì vậy, con đường tốt nhất mà thăm mỗi thành phốđúng một lần là A -> B-> C -> ... - T> và tốt nhất (ngắn nhất) chiều dài đường dẫn là (20-1) * 1,0= 19,0.Trong hầu hết các kịch bản TSP, khoảng cách giữa các thành phố sẽ không giả tạo tính toán.Thay vào đó, các khoảng cách có thể sẽ được lưu trữ trong một số loại cấu trúc dữ liệu tra cứu.Một số biến thể của TSP giả định rằng mỗi thành phố được kết nối với mọi thành phố khác vàmột số vấn đề giả sử các thành phố không đầy đủ kết nối. Ngoài ra, một số biến thể TSP chorằng khoảng cách từ bất kỳ thành phố để thành phố c1 c2 là giống như khoảng cách từ thành phốc2 để c1, và một số biến thể vấn đề không làm cho giả định này hai chiều.Ngoại trừ trong những tình huống tầm thường, một cách tiếp cận sức mạnh vũ phu để tìm đườngđi ngắn nhất là không khả thi. Ví dụ, với 20 thành phố, thậm chí nếu bạn có thể đánh giá1.000.000 con đường / giây, kiểm tra tất cả 20! các đường dẫn có thể sẽ đòi hỏi nhiều hơn 77.000năm. Kiểu này đặc biệt khó khăn vấn đề tối ưu hóa tổ hợp là loại vấn đề mà các thuật toán SBCrất thích hợp để xử lý.Các vấn đề TSP giả được thực hiện trong một lớp có tên là CitiesData, thể hiện trong hình 2. Mãnguồn hoàn chỉnh cho các chương trình demo SBC có sẵn tạicode.msdn.microsoft.com/mag201104BeeColony.Hình 2 The Class CitiesData danh1. lớp CitiesData {2. công char [], thành phố;3.4. công CitiesData (numberCities int) {5. this.cities = new char [numberCities];6. this.cities [0] = A;7. for (int i = 1; i <this.cities.Length; + + i)8. this.cities [i] = (char) (this.cities [i - 1] + 1);
  • 3. 9. }10.11. Từ xa gấp đôi công cộng (char firstCity, char secondCity) {12. if (firstCity <secondCity)13. trả lại 1,0 * ((int) secondCity - (int) firstCity);14. khác15. trả lại 1,5 * ((int) firstCity - (int) secondCity);16. }17.18. tăng gấp đôi công ShortestPathLength () {19. trả lại 1,0 * (this.cities.Length - 1);20. }21.22. công dài NumberOfPossiblePaths () {23. dài n = this.cities.Length;24. dài câu trả lời = 1;25. for (int i = 1; i <= n; + + i)26. {kiểm tra câu trả lời *= i;}27. trở lại câu trả lời;28. }29.30. công ghi đè lên dây ToString () {31. string s = "";32. s + = "Thành phố";33. for (int i = 0; i <this.cities.Length; + + i)34. s + = this.cities [i] + "";35. trở về;36. }37. }Định nghĩa của một số lớp hoặc cấu trúc dữ liệu đại diện cho vấn đề cụ thể của bạn sẽ khác vớiđiều được hiển thị ở đây. Tuy nhiên, như một quy luật chung của ngón tay cái, vấn đề mà rất phùhợp cho các giải pháp sử dụng một thuật toán SBC thường có thể được thể hiện như là một mảngkhông số, không phải số một ma trận hoặc một mảng không phải số lởm chởm của mảng.Các nhà xây dựng CitiesData chấp nhận một giá trị cho số lượng các thành phố và phân công cácthành phố đầu tiên một nhãn của A, thành phố thứ hai của một nhãn của B và như vậy.Khoảng cách là phương pháp xác định một cách một chiều như tôi trước đây được mô tả và giảđịnh rằng thành phố nào có thể đạt được bởi bất kỳ thành phố khác.Phương pháp ShortestPathLength trả về độ dài đường đi tối ưu cho việc xác định khoảng cách.Trong hầu hết trường hợp SBC bạn sẽ không có các thông tin cần thiết để thực hiện một phươngthức trả về giải pháp tối ưu.Phương pháp tính chỉ NumberOfPossiblePaths n! trong đó n là số thành phố. Trong một số kịch
  • 4. bản TSP số đường đi có thể là n-1! (Nếu thành phố bắt đầu không quan trọng) và trong một sốkịch bản số đường đi có thể là n / 2! (Nếu theo hướng của con đường không quan trọng).Phương thức ToString sử dụng nối chuỗi thay vì lớp StringBuilder hiệu quả hơn để lắp ráp mộtchuỗi với các dữ liệu mô tả. nối String được sử dụng để tái cấu trúc đơn giản hóa các ngôn ngữlập trình khác.Trong bài viết này, để giữ cho các mã tương đối ngắn và sạch sẽ, tôi đi đường tắt bạn sẽ khôngsử dụng trong mã sản xuất, chẳng hạn như loại bỏ hầu hết các kiểm tra lỗi. Ví dụ, phương phápNumberOfPossiblePaths không đối phó với tràn số nếu kết quả là lớn hơn long.MaxValue.Cấu trúc chương trình SBCCác thuật toán SBC thể hiện trong hình 1 được thực hiện như là một C # giao diện điều khiển ứng dụng.Các cấu trúc tổng thể của chương trình là liệt kê trong hình 3. Chú ý rằng cấu trúc chương trình SBC làtương đối đơn giản và chỉ sử dụng tên miền không gian hệ thống cơ bản. Có ba lớp: lớp Chương trình,mà nhà ở một phương pháp duy nhất chính; các lớp Hive, mà nhà ở tất cả các thuật toán logic SBC vàlớp CitiesData trình bày trong phần trước của bài viết này. Lớp Hive là tên chung về Hive hơn là đặt mộtcái tên cụ thể như TravelingSalesmanHive, mặc dù SBC triển khai thực hiện thuật toán phụ thuộc rấtnhiều vào các vấn đề cụ thể chúng được thiết kế để giải quyết.Hình 3: Cấu trúc chương trình tổng thể1. sử dụng hệ thống;2. không gian tên {SimulatedBeeColony3. Chương trình lớp {4. static void Main (string [] args) {5. Console.WriteLine (" nBegin mô phỏng thuật toán Bee Colony demo n");6. . . .7. Console.WriteLine ("Cuối mô phỏng Bee Colony demo");8. }9. }10.11. lớp Hive {12. public class {Bee13. . . .14. }15.16. / / Hive trường dữ liệu ở đây17.18. công ghi đè lên dây ToString () {. . . }19.20. công Hive (totalNumberBees int, int numberInactive,21. numberActive int, int numberScout, maxNumberVisits int,22. int maxNumberCycles, CitiesData citiesData) {23. . . .24. }25.26. công char [] GenerateRandomMemoryMatrix () {. . . }27.28. công char [] GenerateNeighborMemoryMatrix (char [] memoryMatrix) {. . . }29.
  • 5. 30. tăng gấp đôi công MeasureOfQuality (] [char memoryMatrix) {. . . }31.32. Giải quyết công void () {. . . }33.34. private void ProcessActiveBee (int i) {. . . }35.36. private void ProcessScoutBee (int i) {. . . }37.38. private void ProcessInactiveBee (int i) {. . . }39.40. private void DoWaggleDance (int i) {. . . }41. }42.43. lớp CitiesData {44. . . .45. }46.47. } / / NsPhương pháp chính khá đơn giản. Sau khi hiển thị một thông báo bắt đầu các đối tượng CitiesDatađược khởi tạo:1. Console.WriteLine (2. "Nạp dữ liệu cho các thành phố du lịch SBC phân tích vấn đề bán hàng");3. CitiesData citiesData = mới CitiesData (20);4. Console.WriteLine (citiesData.ToString ());5. Console.WriteLine ("Số lượng các thành phố =" + citiesData.cities.Length);6. Console.WriteLine ("Số lượng các đường dẫn có thể =" +7. citiesData.NumberOfPossiblePaths (). ToString ("#,###"));8. Console.WriteLine ("giải pháp tốt nhất có thể (con đường ngắn nhất) chiều dài =" +9. citiesData.ShortestPathLength () ToString ("F4")).Trong nhiều kịch bản vấn đề SBC dữ liệu của bạn sẽ nằm trong lưu trữ bên ngoài như một tập tin vănbản hoặc một cơ sở dữ liệu SQL, và bạn sẽ tải dữ liệu thông qua một số vấn đề xây dựng tải hoặcphương thức tải dọc theo dòng myProblemData.Load (datafile).Tiếp theo, các nhà xây dựng Hive được chuẩn bị và được gọi là:1. int totalNumberBees = 100;2. numberInactive int = 20;3. numberActive int = 50;4. numberScout int = 30;5. int maxNumberVisits = 100;6. int maxNumberCycles = 3460;7.8. Hive tổ = mới TravelingSalesmanHive (totalNumberBees,9. numberInactive, numberActive, numberScout, maxNumberVisits,10. maxNumberCycles, citiesData);Như bạn sẽ thấy chi tiết hơn trong phần sau của bài viết này, một thuật toán SBC sử dụng ba loại ong:hoạt động, không hoạt động và trinh sát. Mặc dù số lượng của từng loại ong có thể được cứng mã hóa,trong hầu hết các kịch bản nó tốt hơn để vượt qua những tính trong khi các thông số cho các nhà xâydựng Hive để thuật toán có thể dễ dàng điều chỉnh để thực hiện.Giá trị của biến totalNumberBees có thể xuất phát từ ba biến số khác, nhưng biến thêm cải thiện khả
  • 6. năng đọc mã ở đây. Tổng số ong sẽ phụ thuộc vào vấn đề cụ thể của bạn. Ngày càng có nhiều ong tốthơn, nhưng chậm thực hiện chương trình. Về tỷ lệ, có một số nghiên cứu cho thấy tỷ lệ tốt nhất củahoạt động, ong không hoạt động và trinh sát thường khoảng 75 phần trăm, trăm phần trăm 10 và 15,tương ứng.Giá trị 100 được sử dụng cho biến maxNumberVisits sẽ được giải thích ngay, nhưng nó liên quan đến sốlượng các giải pháp hàng xóm có liên quan đến một giải pháp nhất định.Biến maxNumberCycles được sử dụng để kiểm soát số lần sẽ lặp đi lặp lại thường xuyên Giải quyết,điều này là cần thiết vì trong các kịch bản thuật toán SBC bạn thường không biết khi nào bạn đã đạtđến một giải pháp tối ưu, nếu bạn biết các giải pháp tối ưu cho bạn thực sự không có một vấn đề đểgiải quyết. Trong trường hợp này, giá trị của maxNumberCycles được giới hạn chỉ 3460 để các thuậttoán SBC đã không tạo ra một kết quả hoàn hảo. Vấn đề ở đây là mặc dù SBC thuật toán có thể tạo ramột kết quả tối ưu, bạn thường không có cách nào biết được điều này và vì vậy bạn phải sẵn sàngchấp nhận một "tốt" kết quả.Khi xây dựng thực thi nó tạo ra một bộ sưu tập của các con ong, mỗi trong số đó có một giải pháp ngẫunhiên. Các đối tượng Hive theo dõi con đường tốt nhất (ngắn nhất) tổng thể được tìm thấy bởi bất kỳcủa những con ong trong tổ ong và chiều dài đường dẫn liên kết của giải pháp tốt nhất.Sau khi kêu gọi các nhà xây dựng Hive, phương pháp chính kết thúc lên bằng cách sử dụng phương thứcToString để hiển thị, ban đầu được tạo ngẫu nhiên Hive giá trị, gọi phương thức Giải quyết với mộttham số chỉ ra rằng một thanh tiến trình dựa trên văn bản được in, và sau đó hiển thị tốt nhất đườngdẫn và chiều dài đường dẫn liên quan được tìm thấy:1. ...2. Console.WriteLine (" nInitial ngẫu nhiên tổ ong");3. Console.WriteLine (tổ ong);4.5. bool doProgressBar = true;6. hive.Solve (doProgressBar);7.8. Console.WriteLine (" nFinal tổ");9. Console.WriteLine (tổ ong);10. Console.WriteLine ("Cuối mô phỏng Bee Colony demo");11. }The Class BeeNhư được thể hiện trong hình 3, lớp Hive chứa một định nghĩa Bee lớp lồng nhau. Các chi tiết của địnhnghĩa Bee được liệt kê trong hình 4.Hình 4 Bee Class danh1. public class {Bee2. int công trạng;3. công char [] memoryMatrix;4. công đôi measureOfQuality;5. int công numberOfVisits;6.7. công Bee (int tình trạng,] [char memoryMatrix,8. đôi measureOfQuality, numberOfVisits int) {9. this.status = trạng thái;10. this.memoryMatrix = new char [memoryMatrix.Length];11. Array.Copy (memoryMatrix, this.memoryMatrix, memoryMatrix.Length);12. this.measureOfQuality = measureOfQuality;13. this.numberOfVisits = numberOfVisits;
  • 7. 14. }15.16. công ghi đè lên dây ToString () {17. string s = "";18. s + = "Trạng thái =" + this.status + " n";19. s + = "Memory =" + " n";20. for (int i = 0; i <this.memoryMatrix.Length-1; + + i)21. s + = this.memoryMatrix [i] + "->";22. s + = this.memoryMatrix [this.memoryMatrix.Length-1] + " n";23. s + = "Chất lượng =" + this.measureOfQuality.ToString ("F4");24. s + = "Số lần truy cập =" + this.numberOfVisits;25. trở về;26. }27. }Lớp Bee có ba trường dữ liệu chung cho tất cả triển khai SBC và một trường dữ liệu vấn đề cụ thể. Cáclĩnh vực cụ thể vấn đề được đặt tên memoryMatrix. Mỗi SBC thực hiện phải có một số cách để đạidiện cho một giải pháp. Trong trường hợp của TSP trong bài viết này, giải pháp có thể được đại diện bởimột mảng kiểu char. Hãy để tôi nhấn mạnh rằng các đối tượng đại diện cho một giải pháp là rất caophụ thuộc vào vấn đề và mọi vấn đề phải được phân tích một cách riêng biệt để tạo ra một đại diệngiải pháp có ý nghĩa.Các lĩnh vực tình trạng có tên là giữ một giá trị int cho biết loại đối tượng của Bee: 0 cho không hoạtđộng, 1 cho hoạt động và 2 cho các trinh sát. Nếu bạn mã hóa bằng một ngôn ngữ có hỗ trợ kiểu liệtkê, bạn có thể muốn cấu trúc lại lĩnh vực điều tra tư cách là một.Các trường measureOfQuality giữ một giá trị gấp đôi đại diện cho lòng tốt của đối tượng của BeememoryMatrix. Trong trường hợp của các TSP, một biện pháp tự nhiên của chất lượng giải pháp làchiều dài con đường biểu diễn bởi các đối tượng memoryMatrix. Chú ý rằng trong tình huống này, độdài đường đi ngắn hơn là tốt hơn so với độ dài đường dẫn dài hơn và giá trị rất nhỏ hơn của lĩnh vựcmeasureOfQuality đại diện các giải pháp tốt hơn so với giá trị lớn hơn. Mỗi SBC thực hiện phải có mộtsố cách tính toán một thước đo chất lượng giải quyết. Trong nhiều trường hợp biện pháp này là tốtnhất đại diện bởi một giá trị kiểu double.Các trường dữ liệu phổ biến thứ ba trong lớp Bee được đặt tên numberOfVisits. Trường này chứa mộtgiá trị int tượng trưng cho số lần các đối tượng Bee đã đến thăm một nguồn thực phẩm đặc biệt / vấnđề giải pháp, mà không tìm một giải pháp hàng xóm tốt hơn. Trường này được sử dụng để mô phỏngmột con ong truy cập vào một nguồn thức ăn cho đến khi có nguồn thực phẩm được sử dụng hết. Đốivới một con ong đang hoạt động, khi giá trị của lĩnh vực numberOfVisits vượt quá giá trị ngưỡng, conong sẽ mô phỏng hầu như cạn kiệt nguồn cung cấp thực phẩm và chuyển sang trạng thái không hoạtđộng (và một con ong không hoạt động sẽ chuyển sang trạng thái hoạt động).Các nhà xây dựng Bee chấp nhận giá trị của bốn trường dữ liệu, tình trạng, memoryMatrixmeasureOfQuality,, và numberOfVisits. Lưu ý rằng các nhà xây dựng Bee phải chấp nhận một giá trị chomeasureOfQuality vì một Bee không thể trực tiếp tính từ lĩnh vực này memoryMatrix của nó, xác địnhcác thước đo chất lượng phụ thuộc vào thông tin lưu trữ trong đối tượng CitiesData vấn đề cụ thể.Các định nghĩa lớp Bee có một phương thức ToString, mà lộ ra những giá trị của bốn trường dữ liệu.Phương pháp Bee.ToString không phải là hoàn toàn cần thiết nhưng có thể được khá hữu ích trong quátrình SBC phát triển để giúp phát hiện lỗi bằng cách sử dụng câu lệnh WriteLine.Các dữ liệu Fields HiveMã Hive lớp được trình bày trong Hình 5. Có 14 tổ ong dữ liệu các lĩnh vực và sự hiểu biết mục đích củatừng là chìa khóa để hiểu biết làm thế nào để thực hiện một thuật toán SBC cụ thể.Hình 5: 14 Hive Trường Dữ liệu
  • 8. 1. ngẫu nhiên tĩnh ngẫu nhiên = null;2.3. công CitiesData citiesData;4.5. int công totalNumberBees;6. int công numberInactive;7. int công numberActive;8. int công numberScout;9.10. int công maxNumberCycles;11. int công maxNumberVisits;12.13. tăng gấp đôi công probPersuasion = 0,90;14. tăng gấp đôi công probMistake = 0,01;15.16. công Bee [] ong;17. công char [] bestMemoryMatrix;18. công đôi bestMeasureOfQuality;19. công int [] indexesOfInactiveBees;Để đơn giản và gỡ rối dễ dàng hơn với báo cáo WriteLine, tất cả 14 trường dữ liệu được định nghĩa vớiphạm vi công cộng. Bạn có thể muốn hạn chế phạm vi các lĩnh vực tư nhân và tạo ra tài sản đối vớinhững lĩnh vực bạn cần truy cập bên ngoài định nghĩa lớp.Trường đầu tiên có tên ngẫu nhiên và là loại ngẫu nhiên. SBC thuật toán xác suất và các đối tượng ngẫunhiên được sử dụng để tạo ra các số giả ngẫu nhiên cho nhiều mục đích. Các đối tượng ngẫu nhiên sẽđược khởi tạo trong xây dựng tổ.Các trường dữ liệu thứ hai là một đối tượng của CitiesData loại. Việc thực hiện SBC cần biết chi tiết củavấn đề được giải quyết. Trong hầu hết trường hợp, chẳng hạn như một này, các dữ liệu vấn đề đượcđại diện là một đối tượng. Nhớ lại rằng CitiesData có một danh sách các nhãn thành phố và phươngthức trả về khoảng cách giữa hai thành phố.Các dữ liệu thông qua thứ sáu lĩnh vực thứ ba là các biến int mà giữ tổng số ong, số ong không hoạtđộng, số lượng các loài ong hoạt động và số lượng ong trinh sát. Như đã đề cập trước đó, bởi vì con ongtừng đại diện cho một giải pháp tiềm năng, những con ong khác trong tổ, thì tốt hơn. Tuy nhiên, con sốlớn hơn ong thực hiện chương trình phân hủy.Các trường dữ liệu thứ bảy, maxNumberCycles, là một giá trị ngưỡng được sử dụng để hạn chế bao lâuphương pháp Giải chạy. Một chu kỳ đại diện cho chế biến của mỗi con ong trong tổ.Các trường dữ liệu thứ tám, maxNumberVisits, là một giá trị ngưỡng được sử dụng để ngăn chặn mộtcon ong ở lại quá lâu ở một giải pháp cụ thể. Trong mỗi lần lặp của vòng lặp xử lý chính trong phươngpháp Giải quyết, nếu một con ong không tìm thấy một nguồn thức ăn hàng xóm với chất lượng tốthơn, của ong numberOfVisits truy cập được tăng lên. Nếu numberOfVisits truy cập vào một đối tượngBee vượt quá giá trị ngưỡng maxNumberVisits, các hiệu ứng chuyển ong đến một trạng thái khônghoạt động.Các trường dữ liệu thứ chín, probPersuasion, là một giá trị ngưỡng xác suất được sử dụng để xác địnhliệu một con ong không hoạt động những người quan sát những điệu nhảy lúc lắc của một con ong đãtrở về tổ ong với một giải pháp tốt hơn sẽ được thuyết phục để cập nhật bộ nhớ của nó với các giảipháp tốt hơn.Giá trị của probPersuasion là cứng mã hóa đến 0.90, có nghĩa là một con ong không hoạt động sẽ đượcthuyết phục để chấp nhận một giải pháp tốt hơn khoảng 90 phần trăm thời gian. Giá trị 0,90 choprobPersuasion dựa trên kết quả nghiên cứu, nhưng bạn có thể muốn thử nghiệm với các giá trị khác.
  • 9. Giá trị lớn hơn sẽ tạo ra một thuật toán SBC mà hội tụ đến một giải pháp nhanh chóng hơn, ít nguy cơnhiều khả năng hội tụ đến một giải pháp không tối ưu.Các trường dữ liệu thứ mười, probMistake, là một giá trị ngưỡng xác suất được sử dụng để xác địnhliệu một con ong đang hoạt động sẽ làm cho một sai lầm, đó là, không chính xác từ chối một giải pháphàng xóm đó là tốt hơn so với giải pháp hiện hành của ong, hoặc không chính xác chấp nhận một giảipháp hàng xóm đó là tồi tệ hơn ong giải pháp hiện hành. Giá trị của probMistake là hardcoded đến0,01, có nghĩa là một con ong đang hoạt động sẽ làm cho một sai lầm trong việc đánh giá một giải pháphàng xóm khoảng 1 phần trăm thời gian.Các trường dữ liệu thứ 11, ong, là một mảng của các đối tượng Bee. Hãy nhớ rằng các con ong đều cómột trạng thái (hoạt động, không hoạt động, trinh sát), một giải pháp (memoryMatrix), một thước đochất lượng của giải pháp (measureOfQuality), và một truy cập của số lần cụ thể ảo thực phẩm nguồnđã được viếng thăm mà không tìm thấy một nguồn thực phẩm tốt hơn người hàng xóm(numberOfVisits). Bởi vì một Bee được định nghĩa là một lớp, mỗi mục trong mảng ong là một thamchiếu đến một đối tượng Bee.Các trường dữ liệu 12, bestMemoryMatrix, là một mảng của char và đại diện các giải pháp tốt nhấttrong mảng con ong. Hãy nhớ rằng bởi vì mô phỏng các thuật toán đàn ong được triển khai thực hiệncụ thể của một meta-heuristic, các đại diện của một giải pháp vấn đề sẽ khác nhau từ vấn đề cho vấnđề. Một phương pháp thiết kế thay thế cho hardcoding một định nghĩa kiểu giải pháp là thông sốtrường dữ liệu này như là một loại chung. Khi tôi sử dụng một thuật toán SBC tôi thường cố gắng giảiquyết một vấn đề cụ thể, vì vậy tôi muốn mỗi recode thực hiện SBC mới từ đầu.Các trường dữ liệu 13, bestMeasureOfQuality, là thước đo chất lượng tương ứng với các giải phápbestMemoryMatrix.Các trường dữ liệu cuối cùng tổ, indexesOfInactiveBees, là một mảng int. mảng này chứa các chỉ số củacác con ong trong tổ ong hiện đang không hoạt động. Hãy nhớ rằng các hoạt động ong có thể chuyểnđổi sang một trạng thái không hoạt động và ong không hoạt động có thể chuyển tiếp đến một nhànước hoạt động. An thực hiện thuật toán SBC thường xuyên phải xác định những con ong đang khônghoạt động khi một con ong đang hoạt động thực hiện một điệu nhảy ảo lúc lắc, và lưu trữ các chỉ sốcủa con ong không hoạt động cải thiện hiệu năng so với các giải pháp thay thế của lặp lại thông quatoàn bộ mảng ong và kiểm tra tình trạng dữ liệu của từng lĩnh vực ong.Một đại diện hình ảnh của một đối tượng Hive có thể được trình bày trong hình 6. Các tổ ong cho thấycó 10 con ong: 5 hoạt động, trinh sát hai và không hoạt động ba. Những con ong đang không hoạt độngđược ở các chỉ số 2, 7 và 4 trong mảng ong. Các đối tượng CitiesData có năm thành phố. Giải pháp tốtnhất hiện nay là:A-> B-> E-> C-DGiải pháp này có chiều dài đường dẫn, trong các đơn vị khoảng cách, của:1,0 + (3 * 1,0) + (2 * 1,5) + 1,0 = 8,0Lưu ý rằng trường citiesData là một tham chiếu đến một CitiesData đối tượng định nghĩa bên ngoài củađối tượng tổ.Hình 6: Đại diện HiveCác Constructor HiveCác mã số cho các nhà xây dựng tổ được trình bày trong hình 7. Việc xây dựng tổ bảy chấp nhận tham sốđầu vào. Sáu trong số các tham số được vô hướng và một là một đối tượng (citiesData). Các tham sốtotalNumberBees là không cần thiết, theo nghĩa là nó có thể được xác định từ numberScoutnumberInactive, numberActive và, nhưng tôi cảm thấy sự cải thiện trong khả năng đọc được giá trị mãthêm.Hình 7 Hive Constructor1. công Hive (totalNumberBees int, int numberInactive,
  • 10. 2. numberActive int, int numberScout, maxNumberVisits int,3. int maxNumberCycles, CitiesData citiesData) {4.5. ngẫu nhiên = new Random (0);6.7. this.totalNumberBees = totalNumberBees;8. this.numberInactive = numberInactive;9. this.numberActive = numberActive;10. this.numberScout = numberScout;11. this.maxNumberVisits = maxNumberVisits;12. this.maxNumberCycles = maxNumberCycles;13.14. this.citiesData = citiesData;15.16. this.bees = mới Bee [totalNumberBees];17. this.bestMemoryMatrix = GenerateRandomMemoryMatrix ();18. this.bestMeasureOfQuality =19. MeasureOfQuality (this.bestMemoryMatrix);20.21. this.indexesOfInactiveBees = int mới [numberInactive];22.23. for (int i = 0; i <totalNumberBees; + + i) {24. int currStatus;25. if (i <numberInactive) {26. currStatus = 0; / / không hoạt động27. indexesOfInactiveBees [i] = i;28. }29. khác nếu (i <numberInactive + numberScout)30. currStatus = 2; / / trinh sát31. khác32. currStatus = 1; / / hoạt động33.34. [Char] randomMemoryMatrix = GenerateRandomMemoryMatrix ();35. đôi MQ = MeasureOfQuality (randomMemoryMatrix);36. int numberOfVisits = 0;37.38. ong [i] = new Bee (currStatus,39. randomMemoryMatrix, MQ, numberOfVisits);40.41. if ([i]. ong measureOfQuality <bestMeasureOfQuality) {42. Array.Copy (ong [i] memoryMatrix, this.bestMemoryMatrix,.43. ong [i] memoryMatrix.Length).44. this.bestMeasureOfQuality = ong [i] measureOfQuality.45. }46. }47. }Phạm vi lớp đối tượng được khởi tạo ngẫu nhiên với một giá trị giống của 0. Cung cấp một giá trị giốngcho phép bạn sao chép kết quả. Tiếp theo, sáu đầu vào giá trị tham số cho các trường dữ liệu vô hướng
  • 11. được sao chép dữ liệu các lĩnh vực tổ ong. Các đối tượng tổ ong có tổng cộng 14 trường dữ liệu;ngưỡng giá trị probPersuasion và probMistake là hardcoded.Các nhà xây dựng Hive có tham số đầu vào và gán citiesData lĩnh vực citiesData cho tham số tham khảo.Một thay thế cho phương pháp này bằng cách tham chiếu là để tạo một bản sao mới của dữ liệu vấnđề, như sau:1. int n = citiesData.cities.Length;2. this.citiesData = mới CitiesData (n);Phương pháp này sử dụng bộ nhớ nhiều hơn, nhưng tránh các tác dụng phụ tiềm năng lỗi. Phươngpháp thay thế có thể được sử dụng nếu bạn đang tái cấu trúc các mã trình bày ở đây để một ngôn ngữlập trình mà không hỗ trợ con trỏ hoặc tham chiếu.Tại thời điểm này trong các nhà xây dựng Hive tất cả các mục trong mảng con ong sẽ được null. Tiếptheo, tạo sự khởi tạo các giải pháp toàn cầu tốt nhất (có nghĩa là, các giải pháp tốt nhất trong số tất cảcác con ong trong tổ ong) và chất lượng giải pháp tương ứng:1. this.bestMemoryMatrix = GenerateRandomMemoryMatrix ();2. this.bestMeasureOfQuality =3. MeasureOfQuality (this.bestMemoryMatrix);Phương pháp trợ giúp GenerateRandomMemoryMatrix tạo ra một giải pháp ngẫu nhiên. Phương pháptrợ giúp MeasureOfQuality chấp nhận giải pháp ngẫu nhiên và tính chất của nó. Tôi sẽ thảo luận về cácmã của các phương pháp trợ giúp hai sau đó trong bài viết.Sau khi khởi tạo các giải pháp toàn cầu tốt nhất và chất lượng tương ứng của nó, các nhà xây dựng tổong giao các indexesOfInactiveBees mảng bằng cách sử dụng các giá trị trong lĩnh vực numberInactive.Vào lúc này, tất cả các giá trị trong mảng này chỉ số sẽ là 0.Các phần tiếp theo của mã xây dựng duyệt qua mỗi đối tượng Bee trong mảng ong và instantiates nóbằng cách sử dụng các hàm tạo Bee. Các logic trong vòng lặp này giả định rằng các tế bàonumberInactive đầu tiên trong mảng ong là ong không hoạt động, các tế bào numberScout tiếp theo lànhững con ong trinh sát và các ô còn lại là những con ong đang hoạt động.Ví dụ, nếu có năm con ong đang hoạt động, hai con ong không hoạt động và ba con ong trinh sát, xâydựng các con ong khởi tạo một mảng có kích thước 10, và instantiates tế bào 0 và 1 như con ong khônghoạt động, các tế bào 2-4 như con ong trinh sát và các tế bào 5-9 như con ong đang hoạt động. Ngoàira, các mảng indexesOfInactiveBees sẽ có kích thước 2 và bước đầu nắm giữ các giá trị 0 và 1.Sau khi tình trạng của các con ong hiện nay là xác định dựa trên các biến chỉ số vòng lặp, một giải phápngẫu nhiên được tạo ra và tương ứng với chất lượng của nó được tính toán, số lần truy cập truy cậpđược một cách rõ ràng thiết lập về 0, và các nhà xây dựng Bee được gọi là:1. [Char] randomMemoryMatrix = GenerateRandomMemoryMatrix ();2. đôi MQ = MeasureOfQuality (randomMemoryMatrix);3. int numberOfVisits = 0;4. ong [i] = new Bee (currStatus, randomMemoryMatrix,5. MQ, numberOfVisits);Sau khi ong mỗi giải pháp là khởi tạo, chất lượng của ong nhân tạo ngẫu nhiên được kiểm tra để xemnếu nó là tốt hơn so với các giải pháp toàn cầu tốt nhất. Nếu vậy, các con ong hiện hành của giải phápvà chất lượng tương ứng được sao chép vào các lĩnh vực bestMemoryMatrix và bestMeasureOfQuality.Lưu ý trong việc kiểm tra cho một giải pháp toàn cầu chất lượng tốt nhất, một giá trị nhỏ hơn là tốthơn so với một giá trị lớn hơn bởi vì chất lượng giá trị là độ dài đường dẫn và TSP mong muốn giảmthiểu chiều dài con đường.Thay vì sao chép một cách rõ ràng bộ nhớ của ong vào mảng bestMemoryMatrix, một phương phápthay thế là để gán theo tham chiếu. Phương pháp này cải thiện hiệu suất tại các chi phí của một giatăng phức tạp.
  • 12. Ba khái quát phương pháp SBCMỗi thuật toán thực hiện SBC phải có ba phương pháp vấn đề cụ thể: một phương pháp để tạo ra mộtgiải pháp ngẫu nhiên, một phương pháp để tạo ra một giải pháp tương đối so với hàng xóm là một giảipháp đưa ra, và một phương pháp tính toán chất lượng của một giải pháp nhất định. Trong ví dụ nàyTSP từng phương pháp được thực hiện theo một cách tùy chỉnh và hoàn toàn phụ thuộc vào vấn đề.Một giải pháp thay thế thiết kế là xác định các giao diện và thực hiện các giao diện này. Lập trình thôngqua giao diện có một số lợi thế và bất lợi so với các phương pháp tiếp cận phi giao diện sử dụng, nhưngchủ yếu là một vấn đề của sở thích cá nhân theo ý kiến của tôi. Phương pháp để tạo ra một giải phápngẫu nhiên, GenerateRandomMemoryMatrix, được thể hiện ở đây:1. công char [] GenerateRandomMemoryMatrix () {2. char [] Kết quả = new char [this.citiesData.cities.Length];3. Array.Copy (this.citiesData.cities, kết quả,4. this.citiesData.cities.Length);5. for (int i = 0; i <result.Length; i + +) {6. int r = random.Next (i, result.Length);7. char temp = kết quả [r];8. Kết quả [r] = kết quả [i];9. Kết quả [i] = temp;10. }11. trả lại kết quả;12. }Bởi vì một giải pháp cho vấn đề TSP là một mảng của char char mà mỗi đại diện cho một nhãn hiệuthành phố, các phương pháp GenerateRandomMemoryMatrix trả về một mảng char. Kết quả kíchthước mảng địa phương được phân bổ dựa trên đối tượng CitiesData của tổ, và thành phố các ID đượclưu trữ trong tài liệu tham khảo của tổ để các đối tượng CitiesData được sao chép vào mảng kết quả.Thứ tự của các giá trị trong mảng kết quả là sau đó ngẫu nhiên bằng cách sử dụng ngẫu nhiên phạm vilớp đối tượng và các thuật toán shuffle Fisher-Yates (đôi khi gọi là shuffle Knuth).Lúc đầu, nó có vẻ rằng phương pháp GenerateRandomMemoryMatrix khái niệm thuộc về một đốitượng Bee. Tuy nhiên, bởi vì tạo ra một giải pháp ngẫu nhiên phụ thuộc một phần vào vấn đề cụ thểCitiesData dữ liệu trong trường hợp này, đặt các phương pháp giải pháp ngẫu nhiên trong định nghĩa tổtổng thể là một thiết kế tốt hơn.Phương pháp để tạo ra một giải pháp hàng xóm, GenerateNeighborMemoryMatrix, được trình bàytrong hình 8.Hình 8: Tạo ra một giải pháp hàng xóm1. công char [] GenerateNeighborMemoryMatrix (] [char memoryMatrix) {2. char [] Kết quả = new char [memoryMatrix.Length];3. Array.Copy (memoryMatrix, kết quả, memoryMatrix.Length);4.5. int ranIndex = random.Next (0, result.Length);6. int adjIndex;7. if (ranIndex == result.Length - 1)8. adjIndex = 0;9. khác10. adjIndex = ranIndex + 1;11.12. char tmp = kết quả [ranIndex];13. Kết quả [ranIndex] = kết quả [adjIndex];14. Kết quả [adjIndex] = tmp; trả lại kết quả;
  • 13. 15. }Một khái niệm quan trọng trong thuật toán SBC là ý tưởng rằng mỗi nguồn thực phẩm ảo đại diện chomột giải pháp có một số loại hàng xóm. Nếu không có khái niệm người hàng xóm, toàn bộ ý tưởng củamột thuật toán dựa trên hành vi của ong sụp đổ. Trong trường hợp của các TSP, nơi một giải pháp cóthể được biểu diễn như là một mảng của các ID thành phố đại diện cho một con đường từ thành phốđến thành phố, một giải pháp hàng xóm tự nhiên liên quan đến một giải pháp hiện nay là một hoán vịcủa giải pháp hiện tại, nơi hai thành phố lân cận đã được trao đổi .Ví dụ, nếu một TSP hiện giải pháp là A, B, C, D, E, sau đó là một giải pháp hợp lý hàng xóm là A, C, B, D,E. Nó không phải như vậy rõ ràng nếu một hoán vị hai thành phố nơi nào tùy ý được trao đổi (như tráingược với hai thành phố lân cận) đại diện cho một giải pháp hợp lý hàng xóm. Đối với ví dụ trước đây, làA, D, C, B, E là một giải pháp hợp lý hàng xóm? Quyết định về định nghĩa của một giải pháp hàng xómcho một thuật toán SBC là vấn đề phụ thuộc và thường liên quan đến tiêu chí chủ quan.Khái niệm hàng xóm, giải pháp cũng phục vụ để minh họa một phần lý do tại sao không phải số vấn đềvề tổ hợp đặc biệt thích hợp cho giải pháp của các thuật toán SBC. Nếu vấn đề là vốn số, ý tưởng củamột người hàng xóm thường rất khó để xác định thỏa đáng. Nếu vấn đề vốn đã tổ hợp, ý tưởng củamột người hàng xóm thường có thể độc đáo được xác định bởi một số hình thức hoán vị toán học hoặckết hợp.Phương pháp GenerateNeighborMemoryMatrix chấp nhận hiện tại của ong memoryMatrix đại diệncủa một giải pháp như là một tham số đầu vào và bản sao nó thành một mảng kết quả. Phương phápchọn ngẫu nhiên một chỉ số duy nhất vào mảng kết quả hiện tại bằng cách sử dụng các lớp-phạm viđối tượng ngẫu nhiên. Nếu các điểm chỉ số ngẫu nhiên vào ô cuối cùng thì các ID thành phố đầu tiên vàcuối cùng được trao đổi, nếu không, nếu các điểm chỉ số ngẫu nhiên cho bất kỳ tế bào không qua, cácID được trỏ đến bởi các chỉ số ngẫu nhiên và chỉ số tiếp theo được trao đổi.Khái niệm hàng xóm giải pháp có liên quan đến giá trị maxNumberVisits. Có một số nghiên cứu cho thấymột giá trị tốt cho maxNumberVisits là khoảng năm lần số lượng các giải pháp hàng xóm có thể cho bấtkỳ giải pháp nào. Ví dụ, đối với ba thành phố (A, B, C), nếu một giải pháp hàng xóm được định nghĩa làtrao đổi bất kỳ cặp của các thành phố lân cận, sau đó có ba người hàng xóm có thể (trao đổi A và B, traođổi, B và C, trao đổi A và C) . Vì vậy, trong 20 thành phố, một maxNumberVisits giá trị hợp lý là khoảng20 * 5 = 100.Phương pháp đánh giá chất lượng của một giải pháp của ong, MeasureOfQuality, là:1. tăng gấp đôi công MeasureOfQuality (] [char memoryMatrix) {2. hai câu trả lời = 0,0;3. for (int i = 0; i <memoryMatrix.Length - 1; + + i) {4. char c1 = memoryMatrix [i];5. char c2 = memoryMatrix [i + 1];6. double d = this.citiesData.Distance (c1, c2);7. câu trả lời + = d;8. }9. trở lại câu trả lời;10. }Để giải quyết vấn đề bằng cách sử dụng một thuật toán SBC, một đặc tính cần thiết của vấn đề là cóbất kỳ giải pháp phải có khả năng được đánh giá để mang lại một thước đo chất lượng của giải pháp.Về khái niệm, ở thế giới thực vấn đề tối ưu hóa tổ hợp gần như luôn luôn có một số biện pháp cố hữuvà các giác quan thông thường về chất lượng. Tuy nhiên, trong thực tế, tính toán các thước đo chấtlượng của một giải pháp có thể khó khăn và tốn thời gian.Trong ví dụ này, phương pháp MeasureOfQuality chỉ đơn giản là duyệt qua tất cả các cặp của các IDthành phố liên tiếp trong giải pháp thể hiện bằng tham số memoryMatrix, xác định khoảng cách giữamỗi cặp sử dụng phương pháp từ xa của đối tượng CitiesData, và tích lũy khoảng cách số. Nhớ lại rằng
  • 14. các dữ liệu thành phố đã được nhân tạo xây dựng sao cho khoảng cách giữa bất kỳ hai thành phố có thểđược nhanh chóng và dễ dàng tính toán đơn giản chỉ bằng khoảng cách thứ tự giữa hai ID thành phố.Nhưng trong một vấn đề thực sự, khoảng cách giữa hai thành phố có khả năng sẽ phải được xem xéttrong một số loại cấu trúc dữ liệu. Trong triển khai thực hiện SBC, phương pháp MeasureOfQualitythường là thói quen mà thống trị thời gian chạy của chương trình. Do đó, nó thường có giá trị để đảmbảo rằng phương pháp này là tối ưu hóa cho hiệu suất cũng như tính khả thi, do tài nguyên bộ nhớ củahệ thống máy chủ.Các Phương pháp Giải quyếtPhương pháp Giải quyết nhà ở tất cả các logic mô phỏng hành vi của ong kiếm ăn để giải quyết mộtvấn đề. Phương pháp Giải quyết tương đối phức tạp và sử dụng ba phương pháp trợ giúp,ProcessActiveBee, ProcessScoutBee và ProcessInactiveBee. Các phương pháp ProcessActiveBee vàProcessScoutBee lần lượt sử dụng một phương pháp giúp đỡ DoWaggleDance. Phương pháp Giải quyếtđược trình bày trong hình 9.Hình 9 Các Giải quyết Phương pháp1. Giải quyết công void (bool doProgressBar) {2. bool pb = doProgressBar;3. numberOfSymbolsToPrint int = 10;4. int tăng = this.maxNumberCycles / numberOfSymbolsToPrint;5. if (pb) Console.WriteLine (" nEntering SBC du lịch chính của thuật toán người bán hàng chế biếnvòng lặp n");6. if (pb) Console.WriteLine ("Tiến độ: |==========|");7. if (pb) Console.Write ("");8. int chu kỳ = 0;9.10. trong khi (chu kỳ <this.maxNumberCycles) {11. for (int i = 0; i <totalNumberBees; + + i) {12. if (this.bees [i] tình trạng == 1.)13. ProcessActiveBee (i);14. khác nếu (this.bees [i] tình trạng == 2.)15. ProcessScoutBee (i);16. khác nếu (this.bees [i] tình trạng == 0.)17. ProcessInactiveBee (i);18. }19. + + Chu kỳ;20.21. if (pb & & tăng% chu kỳ == 0)22. Console.Write ("^");23. }24.25. if (pb) (""); Console.WriteLine26. }Hầu hết các công việc thực tế là nuôi ra để trợ giúp các phương pháp ProcessActiveBee,ProcessScoutBee và ProcessInactiveBee. Một tham số đầu vào Boolean được thông qua phải giải quyếtđể cho biết để in một thanh tiến trình dựa trên văn bản thô sơ. Điều này rất hữu ích khi phát triển mộtthuật toán SBC để theo dõi tốc độ thực hiện và giúp phát hiện ra nghẽn cổ chai. Cách tiếp cận này làmcho các giả định rằng phương pháp Giải quyết là một phần của một ứng dụng giao diện điều khiển.Giá trị của tham số giá trị Boolean được chuyển vào một biến Boolean địa phương tên là pb chỉ để cómột tên biến ngắn để làm việc. numberOfSymbolsToPrint này được thiết lập đến 10 để mỗi tăng trong
  • 15. thanh trạng thái sẽ đại diện cho 10 phần trăm của tổng số tiến bộ, được xác định bằng giá trịmaxNumberCycles (biến tăng được sử dụng để xác định chu kỳ tiến bộ rất nhiều đại diện 10 phầntrăm).Sau khi biến điều khiển vòng lặp, chu kỳ, được khởi tạo là 0, một vòng lặp trong khi được sử dụng đểxử lý mỗi con ong trong tổ. Một vòng lặp for có thể chỉ là một cách dễ dàng được sử dụng. Trên mỗichu kỳ, các mảng ong được lặp lại bằng cách sử dụng vòng lặp for và mỗi đối tượng Bee được chế biếntheo phương pháp trợ giúp thích hợp. Sau khi mỗi con ong đã được xử lý, nếu các tham sốdoProgressBar Boolean là đúng, mã này sử dụng các nhà điều hành môđun,%, để kiểm tra nếu nó làthời gian để in một cập nhật cho các thanh tiến trình bằng cách sử dụng một nhân vật ^.Phương pháp ProcessActiveBeePhương pháp ProcessActiveBee là trái tim của một thuật toán SBC và là phương pháp phức tạp nhất vềkích thước mã và phân nhánh. Phương pháp ProcessActiveBee được trình bày trong Hình 10.Hình 10 Phương pháp ProcessActiveBee1. private void ProcessActiveBee (int i) {2. char [] hàng xóm = GenerateNeighborMemoryMatrix (ong [i] memoryMatrix.);3. đôi neighborQuality = MeasureOfQuality (hàng xóm);4. đôi prob = random.NextDouble ();5. bool memoryWasUpdated = false;6. bool numberOfVisitsOverLimit = false;7.8. if (neighborQuality <ong [i] measureOfQuality.) {/ / tốt hơn9. if (prob <probMistake) {/ / sai lầm10. + + Ong [i] numberOfVisits.11. nếu (con ong [i] numberOfVisits>. maxNumberVisits)12. numberOfVisitsOverLimit = true;13. }14. else {/ / Không có sai lầm15. Array.Copy (hàng xóm, ong [i] memoryMatrix, neighbor.Length.);16. ong [i] measureOfQuality = neighborQuality.17. ong [i] numberOfVisits = 0.18. memoryWasUpdated = true;19. }20. }21. else {/ / Không tìm thấy người hàng xóm tốt hơn22. if (prob <probMistake) {/ / Sai lầm23. Array.Copy (hàng xóm, ong [i] memoryMatrix, neighbor.Length.);24. ong [i] measureOfQuality = neighborQuality.25. ong [i] numberOfVisits = 0.26. memoryWasUpdated = true;27. }28. else {/ / Không có sai lầm29. + + Ong [i] numberOfVisits.30. nếu (con ong [i] numberOfVisits>. maxNumberVisits)31. numberOfVisitsOverLimit = true;32. }33. }34.35. if (numberOfVisitsOverLimit == true) {
  • 16. 36. ong [i] trạng thái = 0.37. ong [i] numberOfVisits = 0.38. int x = random.Next (numberInactive);39. ong [indexesOfInactiveBees [x]] trạng thái = 1.40. indexesOfInactiveBees [x] = i;41. }42. khác nếu (memoryWasUpdated == true) {43. if ([i]. ong measureOfQuality <this.bestMeasureOfQuality) {44. Array.Copy (ong [i] memoryMatrix, this.bestMemoryMatrix,.45. ong [i] memoryMatrix.Length).46. this.bestMeasureOfQuality = ong [i]. measureOfQuality47. }48. DoWaggleDance (i);49. }50. else {51. trở lại;52. }53. }Phương pháp ProcessActiveBee chấp nhận một tham số đầu vào đơn, tôi, đó là chỉ số của các con ongong trong mảng. Các hoạt động đầu tiên của ong có được một giải pháp tương đối so với người hàngxóm giải pháp hiện tại của nó được lưu trữ trong memoryMatrix, và sau đó xác định chất lượng củahàng xóm rằng:1. char [] hàng xóm =2. GenerateNeighborMemoryMatrix (ong [i] memoryMatrix.);3. đôi neighborQuality = MeasureOfQuality (hàng xóm);Tiếp theo, thuật toán thiết lập ba biến địa phương sẽ được sử dụng sau này:1. đôi prob = random.NextDouble ();)2. bool memoryWasUpdated = false;3. bool numberOfVisitsOverLimit = false;Biến prob có một giá trị giữa 0.0 và 1.0 và sẽ được so sánh với giá trị trường probMistake để xác địnhxem con ong làm cho một sai lầm trong việc đánh giá các giải pháp hàng xóm-có nghĩa là, từ chối mộtgiải pháp hàng xóm tốt hơn hoặc chấp nhận một giải pháp hàng xóm tồi tệ hơn.Giá trị Boolean memoryWasUpdated sẽ được sử dụng để xác định xem các con ong đang hoạt động cầnthực hiện một điệu nhảy lúc lắc để những con ong không hoạt động (nếu đúng) hay không (nếu sai).Các numberOfVisitsOverLimit Boolean sẽ được so sánh với trường maxNumberVisits để xác định xemcác con ong đã cạn kiệt nguồn thức ăn đặc biệt mà không tìm một giải pháp hàng xóm tốt hơn, và nếunhư vậy nên chuyển đổi từ trạng thái hoạt động đến tình trạng không hoạt động.Nếu ong hiện nay tìm thấy một giải pháp hàng xóm tốt hơn, thuật toán xác định xem con ong làm chomột sai lầm và từ chối hàng xóm tốt hơn hoặc nếu ong chấp nhận người hàng xóm tốt hơn. Tương tựnhư vậy, nếu ong hiện nay không tìm thấy một giải pháp hàng xóm tốt hơn, thuật toán xác định xemcon ong làm cho một sai lầm và chấp nhận giải pháp hàng xóm tồi tệ hơn hoặc không làm lỗi và từ chốinhững người hàng xóm.Chú ý rằng có hai loại khác nhau của những sai lầm có thể, nhưng cả hai loại sai lầm có cùng một xácsuất, probMistake = 0,01. Có một số nghiên cứu cho thấy sử dụng hai xác suất khác nhau cho hai loạikhác nhau của những sai lầm không cải thiện tính hiệu quả của thuật toán SBC, nhưng bạn có thểmuốn thử nghiệm với hai giá trị ngưỡng khác nhau.Sau khi những con ong đang hoạt động hiện tại chấp nhận hoặc từ chối giải pháp hàng xóm, kiểm trathuật toán nếu số lần truy cập truy cập đã vượt quá ngưỡng maxNumberVisits. Nếu vậy, tình trạng
  • 17. hiện tại của con ong được chuyển đổi để hoạt động, một con ong lựa chọn ngẫu nhiên không hoạtđộng được chuyển thành trạng thái hoạt động và các mảng indexesOfInactiveBees được cập nhật. Tiếptheo, thuật toán để kiểm tra xem nếu bộ nhớ của ong đã được cập nhật. Nếu vậy, giải pháp mới đượckiểm tra để xem nếu nó là một mới giải pháp tốt nhất toàn cầu, và sau đó một phương pháp bổ trợ tưnhân, DoWaggleDance, được gọi là để mô phỏng các con ong quay trở lại các thông tin tổ ong và truyềnđạt về các nguồn thức ăn mới cho những con ong không hoạt động.Phương pháp DoWaggleDancePhương pháp trợ giúp DoWaggleDance mô phỏng một con ong trinh sát hoạt động hoặc trở về tổ vàsau đó thực hiện một điệu nhảy lúc lắc để ong không hoạt động để truyền đạt thông tin về vị trí vàchất lượng của một nguồn thực phẩm. Đây là phương pháp DoWaggleDance:1. private void DoWaggleDance (int i) {2. cho (ii int = 0; ii <numberInactive; + + ii) {3. int b = indexesOfInactiveBees [ii];4. nếu (con ong [i] measureOfQuality <ong [b].. measureOfQuality) {5. hai p = random.NextDouble ();6. if (this.probPersuasion> p) {7. Array.Copy (ong [i] memoryMatrix,. Ong [b]. MemoryMatrix,8. ong [i] memoryMatrix.Length).9. ong [b] measureOfQuality = ong [i] measureOfQuality..;10. }11. }12. }13. }Các i tham số đầu vào là các chỉ số của ong hiện nay thực hiện những điệu nhảy ảo lúc lắc. Các thướcđo chất lượng của giải pháp hiện tại của ong được so sánh với các thước đo chất lượng của mỗi conong không hoạt động. Nếu ong hiện tại của giải pháp là tốt hơn và những con ong hiện tại không hoạtđộng là thuyết phục (với xác suất probPersuasion = 0,90), con ong hiện tại của bộ nhớ được sao chépvào bộ nhớ của ong không hoạt động.Lưu ý rằng có nhiều cơ hội để kiểm tra lỗi chèn vào trong mã trình bày trong bài viết này. Ví dụ, bêntrong vòng lặp for trong DoWaggleDance, bạn có thể muốn kiểm tra tình trạng hiện tại của ong khônghoạt động với:1. nếu (. ong [b] tình trạng = 0!) ném ngoại lệ mới (...);Hoặc bạn có thể muốn xác minh số con ong không hoạt động của các chuyến thăm truy cập với:1. nếu (. ong [b] numberOfVisits = 0!) ném ngoại lệ mới (...);ProcessScoutBee và ProcessInactiveBeePhương pháp trợ giúp ProcessScoutBee được sử dụng bởi các phương pháp mô phỏng Giải quyết cáchành động của một con ong trinh sát ngẫu nhiên tìm kiếm nguồn thức ăn hấp dẫn. Phương phápProcessScoutBee được trình bày trong Hình 11.Hình 11: Phương pháp ProcessScoutBee1. private void ProcessScoutBee (int i) {2. char [] randomFoodSource = GenerateRandomMemoryMatrix ();3. đôi randomFoodSourceQuality =4. MeasureOfQuality (randomFoodSource);5. if (randomFoodSourceQuality <ong [i]. measureOfQuality {6. Array.Copy (randomFoodSource, ong [i]. MemoryMatrix,7. randomFoodSource.Length);8. ong [i] measureOfQuality = randomFoodSourceQuality.9. if ([i]. ong measureOfQuality <bestMeasureOfQuality) {
  • 18. 10. Array.Copy (ong [i] memoryMatrix, this.bestMemoryMatrix,.11. ong [i] memoryMatrix.Length).12. this.bestMeasureOfQuality = ong [i] measureOfQuality.13. }14. DoWaggleDance (i);15. }16. }Các tham số đầu vào i đại diện cho các chỉ số của một con ong trinh sát trong mảng ong. Một con ongtrinh sát tạo ra một giải pháp ngẫu nhiên, kiểm tra nếu các giải pháp ngẫu nhiên là tốt hơn so với cácgiải pháp hiện tại trong bộ nhớ, và, nếu có, bản sao các giải pháp ngẫu nhiên vào bộ nhớ. Hãy nhớ rằngcác giá trị chất lượng nhỏ hơn là tốt hơn. Nếu ong trinh sát đã tìm thấy một giải pháp tốt hơn, các thuậttoán để kiểm tra xem liệu các giải pháp mới là một giải pháp toàn cầu tốt nhất.Lưu ý rằng không giống như những con ong đang hoạt động, trong những con ong trinh sát SBC thựchiện không bao giờ phạm sai lầm đánh giá chất lượng của một nguồn thực phẩm. Không có nghiên cứuhiện hành về hiệu quả của những sai lầm của ong trinh sát.Phương pháp ProcessInactiveBee là:1. `Private void ProcessInactiveBee (int i) {2. trở lại;3. }4. private void ProcessInactiveBee (int i) {5. trở lại;6. }Trong thực hiện không hoạt động được SBC ong chính xác điều đó, không hoạt động, vì vậy phươngpháp ProcessInactiveBee chỉ đơn thuần là giữ chỗ trong trường hợp bạn muốn thực hiện một số vấn đềphụ thuộc vào logic cho một con ong không hoạt động. Một trong những sửa đổi có thể sẽ được biếnđổi ngẫu nhiên bộ nhớ một con ong không hoạt động với một số xác suất rất nhỏ.Tổng kếtQuá trình tổng thể thực hiện một thuật toán SBC bắt đầu với nhận dạng vấn đề. Phức tạp, không số,vấn đề tối ưu hóa tổ hợp không có tính quyết định các giải pháp thực tế thường được ứng viên tốt chomột giải pháp SBC. Các vấn đề mục tiêu phải có một cách để đại diện cho một giải pháp (thường là mộtmảng hoặc ma trận) và mỗi giải pháp phải có một số loại của một giải pháp hàng xóm và đo lường chấtlượng một giải pháp.Ví dụ, hãy xem xét các vấn đề của một đồ thị phân chia thành hai phần sao cho số lượng kết nối trongmỗi phần là tối đa và số lượng kết nối giữa hai phần được giảm thiểu. Vấn đề phân vùng đồ thị là tổ hợpvà không có thuật toán nhanh chóng mà tìm giải pháp tối ưu nhất (mặc dù có những thuật toán tấtđịnh có lợi trong việc tìm ra các giải pháp gần tối ưu). Có rất nhiều vấn đề khác NP-đầy đủ và cứng NPcó thể được giải quyết bằng cách sử dụng một SBC.SBC thuật toán dựa trên hành vi của các hệ thống tự nhiên. Có những thuật toán khác, bao gồm cácthuật toán di truyền (GA) dựa trên chọn lọc tự nhiên và sự tiến hóa, tối ưu hóa đàn kiến (aco) dựa trênhành vi của loài kiến, và mô phỏng luyện kim (SA) dựa trên các tính chất vật lý của kim loại làm mát.Các thuật toán dựa trên các hệ thống tự nhiên thường dễ thực hiện tương đối so với phương pháp tiếpcận tất định. Tuy nhiên, các thuật toán dựa trên các hệ thống tự nhiên thường đòi hỏi các đặc điểm kỹthuật của các giá trị cho một số tham số có xu hướng nhạy cảm đối với hiệu quả của giải pháp hội tụtốc độ và độ chính xác giải pháp. Trong trường hợp của một SBC, các thông số nhạy cảm mà phải đượcđiều chỉnh cho mỗi vấn đề bao gồm số lượng của từng loại ong, số lượng tối đa số lần truy cập trướckhi một nguồn thức ăn cạn kiệt, không hoạt động ngưỡng xác suất ong thuyết phục và xác suất sai lầmhoạt động của ong.Mặc dù SBC thuật toán không áp dụng cho mọi vấn đề, trong một số kịch bản họ có thể là những công
  • 19. cụ cực kỳ mạnh mẽ.________________________________________Dr. James McCaffrey làm việc cho Volt Thông tin Khoahọc Inc, nơi ông quản lý đào tạo kỹ thuật cho các kỹ sư phần mềm làm việc tại các khuôn viênMicrosoft tại Redmond, Washington,. Ông đã từng làm việc trên một số sản phẩm của Microsoft, baogồm cả Internet Explorer và MSN Search. Tiến sĩ McCaffrey là tác giả của "NET kiểm tra. Tự động hóaCông thức nấu ăn" (Apress, 2006) và có thể đạt được tại jammc@microsoft.com.Nhờ các chuyên gia kỹ thuật sau đây để xem lại bài viết này: Dan Liebling và Anne Loomis Thompson, cảhai nghiên cứu của Microsoft