CHƯƠNG IV: Search and Evolutionary Scatter Search for ‘Tree-Star’ Network Problems, with Applications to Leased-Line Network Design
4.4.5. Phương pháp kết hợp giải pháp
Khi một subset của một RefSet được xác định, chúng tôi áp dụng một phương pháp kết hợp giải pháp để tạo ra một loạt các giải pháp thử nghiệm. Cho S* biểu thị subset chúng tôi đang xem xét, trong đó có chứa K vector riêng biệt (x(1),..., x(k)). Sau đó các giải pháp thử nghiệm được tạo ra theo các bước sau:
1. Tạo ra các tâm cho k-1 subset của S*, ký hiệu bằng y(i), đó là:
2. Đối với mỗi cặp (x(i), y(i)), xem xét các đường kết nối x(i) và y(i) bằng biểu thức đại diện z(w) = x(i) + w(y(i) – x(i)). Chúng tôi hạn chế chú ý đến 4 điểm z(1/3), z(-1/3), z(2/3), và z(4/3) (hai trong số đó là điểm phía trong và hai điểm còn lại là điểm bên ngoài.
3. Chuyển đổi mỗi điểm trong đó thành vector 0-1 bằng cách áp dụng các quy định ngưỡng, đó là thiết lập một yếu tố là 1 nếu nó vượt quá ngưỡng xác định u, đặt nó là 0 nếu ngược lại.
Chúng tôi thấy rằng tất cả các đường tạo ra trong bước 2 đều đi qua tâm y* của tất cả các điểm k, và do đó nó không cần thiết để tính toán điểm y(i) một cách rõ ràng, nhưng chỉ để xác định giá trị trường ứng của w cho các đường thông qua y*. Tuy nhiên, với giá trị nhỏ của k, nó chỉ dễ dàng để tham chiếu các điểm y(i) như đã nêu.
Từ các điểm thử nghiệm đã làm tròn của ngưỡng đơn trong bước 3, nó hoàn toàn có thể tạo ra các vector thử nghiệm như nhau cho các S* khác nhau. Các vector thử nghiệm đầu tiên đưa đến các giải pháp thử nghiệm (vi dụ bằng cách xây dựng một cây bao trùm tối thiểu trên các node Steiner hoạt động và tính toán tổng chi phí) và sau đó làm đầu vào cho các phương pháp cải thiện. Một khía cạnh quan trọng ở đây là để tránh những nỗ lực chuyển đổi và cái tiến các giải pháp đã được tạo ra. Tránh sự trùng lặp bằng cách kiểm soát các giải pháp kết hợp. Trong đó bao gồm qui trình chẩn đoán mang tính xây dựng và
nâng cao, có thể là một yếu tố quan trọng trong việc tạo ra một quy trình tổng thể hiệu quả. Để làm điều này, chúng tôi lưu trữ duy nhất r = rNow giải pháp gần nhất được tạo ra (cho phép rNow sẽ tăng lên đến Rmax giải pháp khác nhau được ghi nhận), theo như một sắp xếp gợi nhớ của một thuật ngữ ngắn đơn giản về hướng tiếp cận lân cận bộ nhớ trong bảng tìm kiếm. Cụ thể, chúng tôi giữ các giải pháp này trong một mảng xsave[r], r=1 đến rNow, và cũng giữ một con trỏ rNext, cái mà nhận biết giải pháp kế tiếp x’ sẽ được ghi lại mỗi khi mảng đầy.
Cho E0 và Hash0 là giá trị các hàm dánh giá và hàm băm cho giải pháp x’, và biểu diễn các giá trị liên quan cho mảng xsave[r] bằng Esave(r) và Hashsave(r). Chúng được đi kèm bởi một giá trị ‘depth’, với giá trị 0 có nghĩa không sảy ra sự trùng lặp, và các giá trị khác sẽ cho biết độ sâu của danh sách - là khoảng cách để quay lại tu giải pháp cuối cùng đã được ghi nhận - một sự trùng lặp có thể tìm thấy. Lấy ví dụ, depth = 3 sẽ cho biết giải pháp hiện tại trùng với một giải pháp đã được ghi lại từ 3 vòng lặp trước đó. (điều này không phải hoàn toàn chính xác, lấy ví dụ, depth = 3 có thể có nghĩa là các giải pháp đã được ghi lại từ 5 vòng lặp trước đó và sau đó sảy ra hai sự trùng lặp khác, khi đó kết quả vẫn sẽ ghi nhận 3 giải pháp.)
Dưới đây là mã giả cho chương trình kiểm tra sự trùng lặp:
Initialisation Step:
rNow = 0 ; rNext = 0; CountDup(dep) = 0, for depth = 1 to rMax
Duplication Check Subroutine.
Begin Subroutine
Depth = 0
If rNow = 0 then:
rNow =1; rNext = 1;
xsave[1] = X’ (record X’ in xsave[1]),
Esave[1] = E0; Firstsave(1) = FirstIndex0
End the subroutine Elseif rNow > 0 then:
(Go through in ‘depth order’, from most recently to least recently stored. When a duplicate is found, index r (below) gives the value of rMax that would have been large enough to identify the
duplication.)
i = rNext
For r = 1 to rNow
If Esave(i) = E0 then:
If Hash0 = Hashsave(i) then: If x’ = x[i] then: ( x’ is a duplicate) Depth = r
End Duplication Check Subroutine Endif Endif Endif i = i – 1 if i < 1 then i = rNow End r
(Here, no solutions were dupticated by x’. Add x’ to the list in position rNext, which will replace the solution previously in rNext if the list is full)
rNext = rNext + 1
If rNext > rMax then rNext = 1
If rNow < rMax then rNow = rNow + 1
Xsave [rNext] = x’ Esave (rNext) = E0
Hashsave (rNext) = Hash0
Endif
End of Duplication Check Subroutine