2012-05-13 21 views
5

Câu hỏi: Sự cố tuần hoàn cho phép bạn có cả giới hạn dưới và giới hạn trên trên luồng thông qua một vòng cung cụ thể. Các ràng buộc trên tôi hiểu (như đường ống, chỉ có rất nhiều thứ có thể đi qua). Tuy nhiên, tôi đang gặp khó khăn trong việc hiểu ý tưởng bị ràng buộc thấp hơn. Nó có nghĩa là gì? Sẽ là một thuật toán để giải quyết vấn đề ...'Giới hạn dưới' trong các vấn đề lưu thông có nghĩa là gì?

  • cố gắng đảm bảo mỗi vòng cung có giới hạn dưới sẽ nhận được ít nhất dòng chảy đó, không hoàn toàn nếu nó không tìm được đường?
  • chỉ đơn giản là bỏ qua vòng cung nếu không thể đáp ứng giới hạn dưới? Điều này sẽ có ý nghĩa hơn đối với tôi, nhưng có nghĩa là có thể có vòng cung với một dòng chảy của 0 trong đồ thị dưới kết quả, tức là lower ≤ f ≤ upper v f = 0

Context: Tôi đang cố gắng để tìm thấy một cách để nhanh chóng sắp xếp một bộ các sự kiện, mỗi sự kiện có độ dài và một tập hợp thời gian có thể có thể được lên lịch tại. Tôi đang cố gắng để giảm vấn đề này cho một vấn đề lưu thông, mà thuật toán hiệu quả tồn tại.

Tôi đặt mọi sự kiện vào biểu đồ được chỉ dẫn dưới dạng nút và cung cấp cho nó khoảng thời gian cần lấp đầy. Sau đó, tôi thêm tất cả các lần có thể là các nút là tốt, và cuối cùng tất cả các khe thời gian, như thế này (tất cả các vòng cung trỏ sang phải):

 

My graph

 

Các hai sự kiện đầu tiên có một thời gian có thể và chiều dài là 1 và sự kiện cuối cùng có độ dài là 4 và hai lần có thể.

Biểu đồ này có ý nghĩa không? Cụ thể hơn, số lượng các khoảng thời gian có được 'lấp đầy' là 2 (chỉ những cái 'dễ') hay sáu, như trong hình?

(Tôi đang sử dụng một thuật toán push-relabel từ thư viện LEMON nếu mà làm cho bất kỳ sự khác biệt.)

+1

fyi: lưu lượng tối đa là một sự cố lưu thông đặc biệt trong đó giới hạn dưới là bằng không. Chúng không giống nhau. – KillianDS

+0

Đã xóa thẻ. Cảm ơn! –

+1

Giới hạn dưới có thể chỉ có nghĩa là người dùng yêu cầu phải có ít nhất X luồng trong một đường ống để nó có ích cho họ? Ví dụ, nếu họ đang cố gắng cấp năng lượng cho một thứ gì đó từ dòng chảy? Hãy suy nghĩ các nhà máy nước hoặc bóng đèn hay gì đó. (Đó là cách nó hoạt động trong đầu của tôi anyway.) – Helen

Trả lời

4

Về vấn đề lưu thông chung:

Tôi đồng ý với @Helen; mặc dù nó có thể không trực quan để thụ thai về việc sử dụng thực tế của giới hạn dưới, nhưng đó là một ràng buộc rằng phải đáp ứng được. Tôi không tin rằng bạn sẽ có thể bỏ qua hạn chế này, ngay cả khi dòng chảy đó bằng không.

Trường hợp dòng = 0 kháng cáo vấn đề luồng tối đa trực quan hơn (như được chỉ ra bởi @KillianDS). Trong trường hợp đó, nếu lưu lượng giữa một cặp nút bằng 0, thì chúng không thể ảnh hưởng đến "bảo toàn tổng lưu lượng": enter image description here

Khi không có giới hạn dưới nào (giả thiết luồng không âm) chảy không thể ảnh hưởng đến kết quả, vì

  1. nó không thể giới thiệu một sự vi phạm đến những hạn chế
  2. nó không thể ảnh hưởng đến sự sum (vì nó cho biết thêm một thuật ngữ không).

Ví dụ thực tế về lưu lượng tối thiểu có thể tồn tại do một số ràng buộc bên ngoài (một vấn đề liên quan yêu cầu ít nhất X nước đi qua một đường ống nhất định, như được chỉ ra bởi @Helen). Các ràng buộc giới hạn dưới cũng có thể phát sinh từ một vấn đề kép tương đương, làm giảm thiểu dòng chảy sao cho các cạnh nhất định có giới hạn thấp hơn (và tìm ra một tương đương tối ưu cho một vấn đề tối đa với giới hạn trên).

Đối với vấn đề cụ thể của bạn:

Nó có vẻ như bạn đang cố gắng để có được càng nhiều sự kiện thực hiện trong một tập cố định các khe thời gian (nơi không có hai sự kiện có thể chồng lên nhau trong một khe thời gian).

Hãy xem xét các bộ khe thời gian có thể được gán cho một sự kiện nhất định:

E1 - {09:10}
E2 - {09:00}
E3 - {9 : 20, 9:30, 9:40, 9:50}
E3 - {9:00, 9:10, 9:20, 9:30}

Vì vậy, bạn muốn tối đa hóa số của nhiệm vụ phân công (tức là sự kiện sự kiện để cạnh được bật "trên") st các tập kết quả được phân tách theo cặp (nghĩa là không có khe thời gian được gán chồng lên nhau).

Tôi tin rằng đây là NP-Hard bởi vì nếu bạn có thể giải quyết vấn đề này, bạn có thể sử dụng nó để giải quyết maximal set packing problem (tức là bộ đóng gói tối đa giảm xuống mức này). Vấn đề của bạn có thể được giải quyết với lập trình tuyến tính số nguyên, nhưng trong thực tế những vấn đề này cũng có thể được giải quyết rất tốt với các phương pháp tham lam/nhánh và bị ràng buộc.

Ví dụ: trong ví dụ của bạn. sự kiện E1 "xung đột" với xung đột E3 và E2 với E3. Nếu E1 được chỉ định (chỉ có một tùy chọn), thì chỉ có một nhiệm vụ có thể còn lại của E3 (bài tập sau). Nếu nhiệm vụ này được thực hiện cho E3, thì chỉ có một nhiệm vụ còn lại cho E2. Hơn nữa, các biểu đồ con rời rạc (các tập hợp các sự kiện không thể xung đột với các tài nguyên) có thể được giải quyết một cách riêng biệt.

Nếu đó là tôi, tôi sẽ bắt đầu với một giải pháp tham lam rất đơn giản (chỉ định nhiệm vụ với ít "khe" nhất), và sau đó sử dụng nó làm hạt giống cho chi nhánh và bộ giải kết buộc (nếu giải pháp tham lam tìm thấy 4 nhiệm vụ nhiệm vụ, sau đó bị ràng buộc nếu bạn đệ quy subtree của bài tập không thể vượt quá 3). Bạn thậm chí có thể ép ra một số hiệu suất bổ sung bằng cách tạo ra đồ thị của các giao điểm cặp giữa các bộ và chỉ thông báo cho các bộ liền kề khi một phép gán được thực hiện. Bạn cũng có thể cập nhật số bài tập tốt nhất khi bạn tiếp tục nhánh và bị ràng buộc (tôi nghĩ điều này là bình thường), vì vậy nếu bạn may mắn sớm, bạn hội tụ nhanh chóng.

Tôi đã sử dụng ý tưởng tương tự này để tìm tập hợp protein nhỏ nhất có thể giải thích một tập hợp các peptide được xác định (các phần protein) và nhận thấy nó là quá đủ cho các vấn đề thực tế. Đó là một vấn đề rất giống nhau.

Nếu bạn cần hiệu suất cạnh chảy máu: Khi được lặp lại, lập trình tuyến tính số nguyên có thể thực hiện gần như bất kỳ biến thể nào của sự cố mà bạn muốn. Tất nhiên, trong trường hợp rất xấu nó có thể chậm (trong thực tế, nó có thể sẽ làm việc cho bạn, đặc biệt là nếu đồ thị của bạn không phải là rất mật độ kết nối). Nếu không, thường xuyên lập trình tuyến tính thư giãn gần đúng các giải pháp cho ILP và nói chung là khá tốt cho loại vấn đề.

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn câu trả lời đầy đủ và rõ ràng! Tôi có cảm giác rằng điều này sẽ trở thành NP-hard ... Mặc dù, tôi không hoàn toàn hiểu được giải pháp xấp xỉ sẽ là gì. Một giải pháp mà trong đó không phải mọi sự kiện đều có thời gian? Một giải pháp trong đó một số sự kiện có nhiều lần? Đó sẽ là vô giá trị. –

+0

@WanderNauta :) Có hai loại giải pháp gần đúng (chúng kết thúc giống nhau ở cuối). Một tìm kiếm tham lam và sau đó là một nhánh không hoàn hảo và bị ràng buộc, dừng lại sau một thời gian nhất định, và vì vậy không thử * mọi * subtree (nhánh thực và ràng buộc là chính xác). Giải pháp khác là viết bài toán là ILP, và sau đó sử dụng một xấp xỉ LP cho ILP. tối đa E1 + E2 + E3 s.t. tất cả Ei trong {0,1}, E1 <= số lần gán cạnh, # phép gán cạnh cho mỗi khe thời gian trong {0,1}, v.v. Về cơ bản bạn sẽ giải quyết w/LP này (biến cố định trong [0, 1] thay vì {0,1}, v.v.). Bất kỳ giải pháp nonzero var = 1. – user

+0

@WanderNauta Nhưng thực sự, tổng thể thử nhánh và bị ràng buộc đầu tiên. Bạn có thể mã một đệ quy nhanh chóng một cách nhanh chóng, và đối với nhiều, nhiều đồ thị nó sẽ làm một công việc tuyệt vời (đặc biệt là nếu gieo bởi một tìm kiếm tham lam tốt). – user

1

Giới hạn dưới trên dòng chảy của cung là một ràng buộc cứng. Nếu không thể đáp ứng các ràng buộc, thì thuật toán sẽ thất bại. Trong trường hợp của bạn, họ chắc chắn không thể được đáp ứng.

Sự cố của bạn không thể được mô hình hóa bằng mô hình luồng mạng thuần túy ngay cả với giới hạn dưới. Bạn đang cố gắng để có được ràng buộc rằng một dòng chảy là 0 hoặc ít nhất một số ràng buộc thấp hơn. Điều đó đòi hỏi các biến số nguyên. Tuy nhiên, gói LEMON có một interface nơi bạn có thể thêm các ràng buộc số nguyên. Dòng chảy của mỗi lớp đầu tiên của cung phải là 0 hoặc n trong đó n là số lượng các khoảng thời gian cần thiết hoặc bạn có thể nói rằng tối đa một cung trong mỗi "sự kiện" có luồng không khác.

"phân ly" của bạn hạn chế, lower ≤ f ≤ upper v f = 0 có thể được mô hình hóa như

f >= y * lower 
f <= y * upper 

với y giới hạn là 0 hoặc 1. Nếu y là 0, sau đó e chỉ có thể là 0. Nếu y là 1, f có thể là bất kỳ giá trị nào từ dưới lên trên. Các thuật toán lập trình hỗn hợp số nguyên sẽ đơn đặt hàng của cường độ chậm hơn so với các thuật toán dòng chảy mạng, nhưng họ sẽ mô hình vấn đề của bạn.

+0

Cảm ơn! Tôi sẽ nhìn vào giao diện LP. –