Làm thế nào để tìm các chu kỳ, cùng với nhau, liên quan đến số lượng cạnh không chia sẻ lớn nhất trong đồ thị có hướng?


26

Tôi không phải là một nhà lý luận khoa học máy tính, nhưng nghĩ rằng vấn đề thế giới thực này thuộc về nơi này.

Vấn đề

Công ty tôi có một số đơn vị trên toàn quốc.

Chúng tôi cung cấp cho nhân viên khả năng làm việc trên một đơn vị khác. Nhưng có một điều kiện: Tổng số công nhân trên một đơn vị không thể thay đổi.

Điều đó có nghĩa là: Chúng tôi sẽ cho phép một nhân viên rời khỏi đơn vị của mình nếu ai đó muốn vị trí của anh ta.

Ví dụ (hư cấu) dữ liệu yêu cầu:

Name            Origin    Destination
Maria              1  ->  2
Marcos             2  ->  3
Jones              3  ->  4
Terry              4  ->  5
Joe                5  ->  6
Rodrigo            6  ->  1
Barbara            6  ->  1
Marylin            1  ->  4
Brown              4  ->  6
Benjamin           1  ->  3
Lucas              4  ->  1

Trên đây, âm mưu: Trực quan hóa các dữ liệu trên

Xem làm thế nào chúng ta phải lựa chọn giữa các tùy chọn màu đỏ, xanh hoặc đen?

Vấn đề thực sự phức tạp hơn một chút, bởi vì chúng tôi có 27 đơn vị và 751 yêu cầu. Xin hãy nhìn vào trực quan

Mục đích

Đã thu thập tất cả các yêu cầu, làm thế nào để đáp ứng hầu hết chúng?

Ứng dụng lý thuyết (?)

Có đồ thị , hãy để mọi đơn vị là một đỉnh và một yêu cầu là cạnh được định hướng , một trao đổi thành công sẽ có dạng một cyle có hướng.G(V,E)VE

Mỗi chu kỳ phải sử dụng chỉ một lần ( một công nhân không thể rời khỏi đơn vị của mình hai lần ), nhưng có thể truy cập nhiều lần ( một đơn vị có thể có nhiều công nhân muốn rời đi ).EV

Câu hỏi

Nếu vấn đề này được thể hiện là

"Làm thế nào để tìm các chu kỳ, cùng với nhau, liên quan đến số lượng cạnh không chia sẻ lớn nhất trong đồ thị có hướng"?

Chúng tôi sẽ đáp ứng hầu hết những người yêu cầu?

Điều đó có đúng không, có một thuật toán để tìm ra bộ chu trình tối ưu đó không?

Cách tiếp cận greddy này sẽ giải quyết vấn đề?

  1. Tìm chu trình định hướng lớn nhất trên ;G
  2. Xóa các cạnh của nó khỏi ;G
  3. Lặp lại 1 cho đến khi không có chu trình định hướng trên ;G

Bạn có thể giúp tôi được không?

Bạn có biết một cách khác để mô tả vấn đề ban đầu (làm cho hầu hết những người yêu cầu hài lòng) không?

Chỉnh sửa : thay đổi bộ phận thành đơn vị, để mô tả tốt hơn vấn đề.


3
Bạn có chắc chắn rằng bạn chỉ muốn tránh sử dụng cùng một cạnh nhiều lần không? Từ mô tả của bạn về ứng dụng, theo tôi, bạn nên tránh sử dụng cùng một đỉnh nhiều lần, đó là một điều kiện mạnh hơn.
Tsuyoshi Ito

3
@TsuyoshiIto: Theo tôi hiểu từ mô tả, điều kiện là ở mỗi đỉnh, độ chính xác phải bằng với độ lệch. Vì vậy, sự không phân biệt đỉnh là không cần thiết.
Yoshio Okamoto

7
Nhân tiện, nếu sự hiểu biết của tôi là chính xác, vấn đề sẽ được giải quyết trong thời gian đa thức bằng dòng chảy mạng. Cụ thể, nếu chúng ta đưa ra một đơn vị lợi nhuận cho một đơn vị dòng chảy dọc theo một cạnh và chúng ta cung cấp một công suất đơn vị cho mỗi cạnh, vấn đề là tìm ra sự lưu thông lợi nhuận tối đa.
Yoshio Okamoto

3
Bài đăng này thảo luận về khái quát hóa vấn đề của bạn okasaki.blogspot.co.uk/2008/03/what-heck-is-math-trade.html (nghĩ rằng mỗi người có một mặt hàng để giao dịch, cụ thể là vị trí công việc của họ).
Radu GRIGore

4
Câu hỏi tuyệt vời, làm cho chúng ta cảm thấy như những gì chúng ta làm thực sự có thể được sử dụng trong cuộc sống thực :).
Gopi

Câu trả lời:


9

OK, tôi đã đọc mã của TradeMaximizer và tôi tin rằng nó giải quyết được vấn đề chung hơn sau đây.

VẤN ĐỀ: Đưa ra là một đồ thị có hướng có cung có chi phí. Tìm một tập hợp các chu kỳ tách rời đỉnh tối đa hóa số lượng đỉnh được bảo hiểm trước tiên và tối thiểu hóa tổng chi phí thứ hai.

Để giải quyết câu hỏi được hỏi ở đây, hãy tạo các đỉnh là nhân viên và vẽ một cung tròn chi phí đơn vị khi x muốn công việc của y . Lưu ý rằng nhân viên bây giờ là đỉnh chứ không phải cạnh. Điều tuyệt vời là một nhân viên có thể nói "Tôi thực sự muốn công việc của y , nhưng công việc của z cũng vậy".xyxyyz

Dung dịch:

  1. Xây dựng biểu đồ lưỡng cực như sau: Với mỗi đỉnh trong biểu đồ ban đầu giới thiệu một đỉnh bên trái x L , một đỉnh phải x R và một cung x Lx R có chi phí rất lớn (lớn hơn tổng chi phí trong bản gốc đồ thị). Đối với mỗi cung x y trong biểu đồ gốc, giới thiệu một cung x Ly R trong biểu đồ lưỡng cực.xxLxRxLxRxyxLyR

  2. Tìm một kết hợp hoàn hảo chi phí tối thiểu trong biểu đồ lưỡng cực.

Cũng có một số tiền xử lý của biểu đồ gốc: Loại bỏ các cung giữa các SCC, sau đó xử lý tất cả các SCC có kích thước như được chỉ ra ở trên.>1

(Trên thực tế, TradeMaximizer lặp đi lặp lại trên tất cả các giải pháp tối ưu, theo hai tiêu chí trên, để tối ưu hóa một cách tự nhiên những thứ khác, chẳng hạn như độ dài của chu kỳ lớn nhất. người thay đổi suy nghĩ của họ.)

PS: Tác giả, Chris Okasaki, đã xác nhận rằng đây là những gì mã làm, trở lại tại bài viết trên blog .


Tôi quản lý để tìm một giải pháp cho vấn đề ban đầu bằng TradeMaximizer. Tôi sẽ đăng Detais vào ngày mai.
motobói

@ motobói, nhưng tất cả những gì bạn cần làm là những gì tôi đã viết trong đoạn thứ hai ...
Radu GRIGore

Tôi tìm thấy lời giải thích này về thuật toán: boardgamegeek.com/wiki/page/TradeMaximizer
motobói

Bạn có thể giải thích hoặc chỉ ra một lời giải thích về lý do tại sao cần phải loại bỏ các cung giữa các Thành phần được kết hợp mạnh?
motobói

@ motobói, Đó là một tối ưu hóa (đối với trường hợp trung bình). Các bước (1) và (2) là đủ.
Radu GRIGore

22

11

Bởi vì tất cả các chi phí và năng lực được giới hạn bởi các hằng số, một thuật toán hủy bỏ chu kỳ đơn giản sẽ tìm thấy sự lưu thông cần thiết trong thời gian đa thức. Điều này gần giống như thuật toán tham lam rõ ràng:

while G has any negative-cost directed cycles
    γ = arbitrary negative-cost directed cycle
    reverse every edge in γ
    negate the cost of every edge in γ
return the subgraph of reversed edges

O(VE)0EEO(VE2)

Đây không phải là thuật toán nhanh nhất được biết đến.


nghĩ rằng điều này hoạt động miễn là một người không muốn làm việc trong nhiều "đơn vị", phải không? sử dụng phrasing của câu hỏi ban đầu. nhưng nếu mọi người muốn làm việc trong nhiều đơn vị, hãy nghi ngờ sự trừu tượng này bị phá vỡ. OP đã nêu vấn đề về chỉ một đơn vị, nhưng điều này có vẻ khá hạn chế giả tạo đối với tôi. [những gì con người chỉ có một sở thích ...?]
vzn

1
"Người" và "đơn vị" là gì? Đây là một câu hỏi về đồ thị.
Jeffε

Tôi bối rối: Có phải ví dụ của tôi không phải là ví dụ phản biện cho thuật toán này? Sau khi chọn C, các chu kỳ C_1 và C_2 không còn là chu kỳ nữa (vì mỗi chu kỳ có một cạnh đảo ngược); C sẽ không được sử dụng lại bởi vì nó có chi phí dương sau khi đảo ngược các cạnh của nó và không có chu kỳ mới nào được giới thiệu. Có phải chúng ta đang nói về cùng một vấn đề? Rất thích có một công thức toán học của vấn đề.
FiB

3
CCC1C2CCC1C2C=C1+C2C

rõ ràng một "đơn vị" là một cái gì đó giống như một "bộ phận" và người dùng đang ghi lại các yêu cầu chuyển giữa các bộ phận [không chính xác các vị trí cụ thể trong các bộ phận]? Biểu đồ FIB dường như có các đơn vị là đỉnh và cạnh như yêu cầu empl giữa các đơn vị. FiB-- "rất thích có một công thức toán học của vấn đề" .. bạn thực sự phải cung cấp một công thức chính xác .. bạn dường như đã đi được nửa đường ..
vzn

4

Cách tiếp cận tham lam này sẽ không luôn luôn đưa ra giải pháp tốt nhất.

Cn{(v1,v2),,(vn,v1)}C1C2n1C

CnC1C2

C1C22(n1)=2n2

n2


-3

có lẽ có một cách / công thức lý thuyết đồ thị để giải quyết vấn đề này, nhưng vấn đề này nghe có vẻ giống như một vấn đề hoán vị đối với tôi khi một số tất cả các hoán vị bị từ chối và những cái khác là hợp lệ. hoán vị là nhân viên và các vị trí là "vị trí" trong công ty. một hoán vị bị từ chối nếu nó không phù hợp với yêu cầu của "người [x] muốn vị trí [y]". sự phân biệt các ranh giới đơn vị / depts / org rõ ràng là hơi thừa đối với giải pháp trong trường hợp này.

loại vấn đề hoán vị với các ràng buộc này có thể dễ dàng được chuyển đổi thành một ví dụ của vấn đề SAT (thỏa đáng). các phép gán biến boolean đại diện cho nhân viên và các mệnh đề ràng buộc đại diện cho các ràng buộc "person [x] muốn vị trí [y]". Có những ví dụ kinh điển gần đây về vấn đề này, người ta thường gọi là vấn đề "bàn ăn tối" nơi bạn có vị trí ngồi và khách và không phải tất cả khách đều muốn ngồi cạnh nhau (hoặc rất giống một số khách muốn ngồi cạnh khách khác).

và tất nhiên, có các bộ giải SAT tinh vi cho các trường hợp khá lớn liên quan đến khoảng hàng trăm biến và mệnh đề trên PC và nếu hàng ngàn vấn đề không "khó".

xem ví dụ [1] để tham khảo chuyên môn và [2] cho bài tập trên lớp. cũng có một số điểm tương đồng về cấu trúc với "vấn đề chim bồ câu" được nghiên cứu kỹ trong các vòng SAT nơi chim bồ câu được gán cho chim bồ câu và bạn có nhiều hoặc ít lỗ hơn chim bồ câu. tuy nhiên trong trường hợp đó, chim bồ câu thường được xem là có thể hoán đổi cho nhau. nói cách khác, vấn đề bàn ăn giống như vấn đề chim bồ câu với những ràng buộc mạnh mẽ hơn và khách / bồ câu có sở thích bắt buộc.

tất nhiên lưu ý / lưu ý rằng đối với các loại vấn đề này, tùy thuộc vào các ràng buộc, câu trả lời có thể là "không có giải pháp ràng buộc nào như vậy tồn tại".

[1] thuật toán bàn ăn tối, bởi crato

[2] CS402 Princeeton HW SAT

[3] Vấn đề thỏa mãn, wikipedia


Tôi đã thử hoán vị bằng cách sử dụng brandaximizer. Đặt một nhân viên như một người dùng muốn buôn bán đơn vị của ông X cho đơn vị Y . Nhưng phần mềm sẽ không cho phép nhiều người dùng giao dịch cùng một mặt hàng (đơn vị của anh ta). Mỗi mục phải là duy nhất. Để phù hợp với điều này, tôi đã phải có, nói rằng, ((Jones) muốn trao đổi Đơn vị-C-James cho Đơn vị-D-Laura hoặc Đơn vị-D-Sergio hoặc Đơn vị-D-Mary]
motobói
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.