Chi nhánh và ràng buộc để sắp xếp tuyến tính tối thiểu


7

Tôi đang cố gắng giải quyết vấn đề chi nhánh và ràng buộc này nhưng tôi không thể đưa ra bất kỳ hàm chi phí gần đúng nào tốt hơn chi phí.

Hãy cùng nói nào G là một biểu đồ của n điểm giao {1,2,3,Giáo dục,n}. Cho một hoán vịf của các nút của G, trọng lượng của mỗi cạnh (x,y) sẽ là |f(x)-f(y)|. Tổng trọng lượng củaGsẽ là tổng trọng số của các cạnh của nó. Bạn có thể nghĩ vềf như một sự gắn lại của các nút của G, Ở đâu f(x) là nhãn mới của nút x.

Tôi đang cố gắng tìm một hoán vị f dẫn đến tổng trọng lượng tối thiểu là G.

Bây giờ cố gắng giải quyết vấn đề này, tất cả những gì tôi có thể nghĩ ra là tìm chi phí gần đúng là tổng trọng số của mỗi cạnh được hoàn thành cho đến bây giờ (đối với mỗi nút cây quay lui) và tiến hành từ nút chi phí tối thiểu. Tôi tự hỏi nếu ai đó có thể giúp tôi với một công thức gần đúng tốt hơn.


Công thức thay thế: để sắp xếp các đỉnh theo cách mà trong ma trận kề, hầu hết các 1 đều ở gần đường chéo.
Karolis Juodelė

Câu trả lời:


5

Một trong những giải pháp tốt nhất có khả năng dựa trên thư giãn lập trình tuyến tính hoặc lập trình số nguyên trực tiếp . Đối với trường hợp sau, việc phân nhánh và quay lui sẽ được ẩn giấu và bạn sẽ không phải tự mình quản lý nó.

Tôi đã thấy nó được giải quyết theo hai cách sử dụng kỹ thuật này. Chúng tôi có thể cải thiện một chút thuật toán giới hạn của bạn.

Phương pháp sách giáo khoa

Sử dụng biến nhị phân xTôij đại diện f(Tôi)= =j, bạn có thể định nghĩa các biến liên tục f(Tôi)= =Σj= =1njxTôij

Thêm các ràng buộc ΣTôixTôij= =1ΣjxTôij= =1 đại diện cho một vị trí được gán một và chỉ một nút.

Đối với mỗi cạnh, chi phí ce có hai ràng buộc: cef(Tôi)-f(j)cef(j)-f(Tôi)và bạn muốn giảm thiểu Σece

Bạn có thể đưa ra vấn đề này cho một người giải quyết lập trình số nguyên, họ sẽ rất vui khi thực hiện quay lui cho bạn và hơn thế nữa - hoặc bạn có thể tự giải quyết việc thư giãn lập trình tuyến tính (chỉ khi bạn muốn tìm hiểu, người giải quyết tối ưu hóa nội bộ).

Thư giãn khác

Thay vì sử dụng các vị trí làm biến nhị phân, bạn có thể sử dụng f(Tôi)<f(j) tức là nút Tôi đi trước nút j. Điều này phù hợp hơn nếu bạn muốn tự phân nhánh và không chỉ định rõ ràng các biến đó.

Với cách tiếp cận này, đôi khi bạn có thể có một vấn đề nhanh hơn để giải quyết tại mỗi nút - ở đây có thể giải quyết vấn đề dòng chi phí tối thiểu đơn giản hơn như được trình bày trong bài viết này . Tôi sẽ không giới thiệu nó trừ khi bạn sẵn sàng điều tra nhiều thời gian và nghiên cứu về vấn đề của bạn.

Các kỹ thuật khác

Đối với chi nhánh và ràng buộc, mọi ràng buộc thấp hơn trên hàm chi phí của bạn sẽ làm. Đối với các vấn đề nhỏ, cách tiếp cận giới hạn của bạn là hoàn toàn tốt.

Bạn có thể làm cho nó chặt hơn: đối với mỗi cạnh có một nút không có dấu, hãy chọn nhãn miễn phí tốt nhất có thể để ước tính chi phí của nó. Một số cạnh có thể sử dụng cùng một vị trí cho các nút khác nhau, nhưng điều này sẽ tốt hơn so với ước tính chi phí của chúng là 0.

Có nhiều biến thể có thể có trong sơ đồ này: chọn nhãn miễn phí tốt nhất cho mỗi nút không được gắn nhãn (không phân biệt chồng lấp) hoặc chỉ xem xét chồng lấp bên trong các nhóm nút nhỏ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.