Tìm một thứ tự tối ưu


9

Tôi đã gặp vấn đề này và đang đấu tranh để tìm cách tiếp cận nó. Bất kỳ suy nghĩ sẽ được đánh giá rất cao!

Giả sử chúng ta được cung cấp một ma trận , ví dụ:{1,0,1}n × k

[1010110001011011101110001]

Không cần thử mọi hoán vị, tìm một thứ tự các cột để tối đa hóa số lượng hàng mà phần tử khác không đầu tiên là .ci1

Đối với ví dụ trên, một thứ tự như vậy (không phải là duy nhất!) Là , nghĩa là,(c3,c4,c1,c2,c5)

[1010100101100110111100101]

Ở đây, với 4 trên 5 hàng, phần tử khác không đầu tiên là 1 .


Những cách tiếp cận thuật toán bạn đã thử? Bạn gặp phải vấn đề này ở đâu? Bạn có thể ghi có nguồn gốc? Bạn có thể chia sẻ bất cứ điều gì về bối cảnh hoặc động lực? Bạn có thể thấy trang này hữu ích trong việc cải thiện câu hỏi của bạn.
DW

1
Tôi muốn đề xuất một bước tiền xử lý: Đặt cột bán dương (hàng tương ứng) là một cột (hàng tương ứng) chỉ với 0 và 1 giây. Gợi ý là xóa tất cả các cột bán dương và cả các hàng có 1 trong cột bán dương. Trong ví dụ của bạn, điều đó sẽ loại bỏ các hàng 1, 3 và 4. Bây giờ bạn còn lại các hàng và cột chứa tất cả -1. Có thể không giúp đỡ, nhưng nó có thể đơn giản hơn để lý do về.
Pål GD

Chúng ta có thể giả sử rằng số lượng hàng nhỏ hơn nhiều số lượng cột không? Điều này có thể làm cho vấn đề dễ dàng hơn.
Angela Pretorius

1
@ Pål, tiền xử lý tương tự có thể với các hàng và cột không chứa 1s. Tuy nhiên, tôi không nghĩ rằng nó dễ dàng hơn để suy luận về: chỉ nhỏ hơn.
Peter Taylor

1
FWIW đây là một bài chéo . haijo, nếu bạn không nhận được câu trả lời trên một ngăn xếp và nghĩ rằng một câu trả lời khác có thể tốt hơn, bạn có thể gắn cờ và yêu cầu di chuyển. Đăng chéo không phải là nghi thức tốt vì người trả lời không biết câu trả lời bạn có thể nhận được trên trang khác và có thể lãng phí thời gian của họ để lặp lại chúng.
Peter Taylor

Câu trả lời:


4

Vấn đề này, mà tôi sẽ gọi CO cho Đặt hàng cột, là NP-hard . Đây là một sự giảm bớt từ vấn đề NP-hard Vertex Cover (VC) sang nó:

Các dạng vấn đề quyết định của VC và CO

Đặt đối tượng VC đầu vào là (V,E,k) . Nó đại diện cho câu hỏi: "Với đồ thị (V,E) , có thể chọn một tập hợp nhiều nhất k đỉnh từ V sao cho mọi cạnh trong E là sự cố trên ít nhất một đỉnh được chọn?" Chúng tôi sẽ xây dựng một thể hiện (A,k) của Công ty đại diện cho câu hỏi: "Căn cứ vào ma trận A với các yếu tố trong {1,0,1}, có thể hoán vị các cột của A sao cho số 1 xuất hiện trước -1 trên ít nhất k hàng không? "Hai vấn đề này được nêu trong mẫu vấn đề quyết định , theo đó câu trả lời cho mỗi câu là CÓ hoặc KHÔNG: nói chính thức , đây là dạng của một vấn đề hoàn toàn NP (hoặc không). Không quá khó để thấy rằng dạng bài toán tối ưu hóa tự nhiên hơn được nêu trong câu hỏi của OP gần như tương đương về độ phức tạp: tìm kiếm nhị phân trên ngưỡng tham số có thể được sử dụng để giải quyết vấn đề tối ưu hóa bằng cách sử dụng trình giải quyết vấn đề quyết định, trong khi một lệnh gọi duy nhất của trình giải quyết vấn đề tối ưu hóa, theo sau là một so sánh duy nhất, là đủ để giải quyết vấn đề quyết định.

Xây dựng một thể hiện của CO từ một thể hiện của VC

Đặt n=|V|m=|E|. Chúng ta sẽ xây dựng một ma trận A với (n+1)m+n hàng và n+1 cột. Đỉnh (n+1)m hàng sẽ được hình thành của m khối n+1 hàng mỗi, với mỗi khối đại diện cho một cạnh đó nhu cầu được bảo hiểm . Đáy n các hàng chứa các "cờ" đỉnh, sẽ làm cho một cột (tương ứng với một đỉnh) phải chịu một chi phí cố định nếu nó được bao gồm ở phía bên trái của giải pháp CO (tương ứng với một đỉnh được bao gồm trong nắp đỉnh của Giải pháp VC).

Đối với mỗi đỉnh vi , tạo một cột trong đó:

  • Trong số các hàng trên cùng (n+1)m , khối thứ j của n+1 hàng đều chứa +1 khi cạnh ej xảy ra trên vi và 0 khác, và
  • n hàng dưới cùng đều bằng 0 ngoại trừ i -th, là -1.

Tạo thêm một cột "hàng rào" bao gồm (n+1)m bản sao của -1, theo sau là n bản sao của +1.

Cuối cùng, đặt ngưỡng k cho thể hiện CO được xây dựng: (n+1)m+nk . Nói cách khác, chúng tôi cho phép tối đa k hàng trong đó -1 xuất hiện trước +1. Chúng ta hãy gọi số hàng vi phạm này là "chi phí" của giải pháp CO.

Bằng chứng

Sự tương ứng giữa một giải pháp cho thể hiện CO và một tập hợp các đỉnh trong thể hiện VC ban đầu là: Mỗi cột ở bên trái của hàng rào tương ứng với một đỉnh nằm trong tập hợp và mỗi cột ở bên phải của hàng rào tương ứng với một đỉnh không.

Theo trực giác, các -1 ở trên cùng của cột "hàng rào" buộc phải lựa chọn một tập hợp con của các cột được đặt ở bên trái của nó, cùng nhau chứa +1 trong tất cả các vị trí này - tương ứng với một tập hợp các đỉnh xảy ra trên mọi cạnh. Mỗi cột xuất hiện ở bên trái của "hàng rào" có -1 trên một hàng riêng biệt ở đâu đó trong n hàng dưới cùng , phát sinh chi phí là 1; các +1 ở dưới cùng của "hàng rào" đảm bảo rằng tất cả các cột được đặt ở bên phải của nó không phải chịu chi phí như vậy.

Rõ ràng một giải pháp VC sử dụng tối đa các đỉnh k tạo ra một giải pháp cho trường hợp CO được xây dựng với chi phí tối đa là k : Chỉ cần đặt hàng các cột tương ứng với các đỉnh trong nắp đỉnh tùy ý, theo sau là hàng rào, theo sau là tất cả các cột còn lại theo thứ tự .

Vẫn còn phải chỉ ra rằng một giải pháp cho trường hợp CO với chi phí nhiều nhất là k tương ứng với một đỉnh đỉnh với nhiều nhất là k đỉnh.

Giả sử ngược lại rằng tồn tại một giải pháp cho trường hợp CO với chi phí nhiều nhất là k để lại một số hàng trong hàng (n+1)m hàng đầu với -1 trước +1. Hàng này thuộc về một khối (n+1) hàng tương ứng với một cạnh cụ thể uv . Mỗi hàng trong khối này trong trường hợp A ban đầu giống hệt nhau khi xây dựng; các cột hoán vị có thể thay đổi các hàng này, nhưng không ảnh hưởng đến thực tế là chúng giống hệt nhau. Do đó, mỗi hàng n+1 giống hệt nhau này có -1 trước +1 trong giải pháp, ngụ ý chi phí ít nhất làn+1 . Nhưngkn<n+1 : mâu thuẫn.

Vì mỗi khối m của các hàng trong hàng (n+1)m hàng có +1 trước -1, nên mỗi cạnh tương ứng được bao phủ bởi một đỉnh tương ứng với một cột ở bên trái của hàng rào: đó là , tập hợp con của các đỉnh này tạo thành một nắp đỉnh. Vì không có hàng nào trong số (n+1)m hàng đầu có -1 trước +1, nên nơi duy nhất mà chi phí có thể tích lũy trong giải pháp là ở n hàng dưới cùng , từ các cột được đặt ở bên trái của hàng rào. Mỗi cột như vậy có chi phí chính xác là 1, do đó, chi phí tối đa là k , phải có tối đa kcác cột như vậy, và do đó tại hầu hết các đỉnh k trong bìa.

Cuối cùng, rõ ràng rằng thể hiện CO có thể được xây dựng trong thời gian đa thức từ thể hiện VC, nghĩa là nếu tồn tại thuật toán đa thức thời gian để giải CO, thì mọi trường hợp VC cũng có thể được giải quyết trong thời gian đa thức bằng cách xây dựng một thể hiện CO như mô tả trước ở trên và sau đó giải quyết nó. Vì VC là NP-hard, CO cũng vậy.


Bất cứ khi nào có một câu trả lời hay như vậy, nó khiến tôi tự hỏi liệu "Câu hỏi mạng nóng" nên được thay thế hoặc tham gia bởi một cái gì đó như "Câu trả lời mạng có giá trị".
John L.

Bạn có thể làm sáng tỏ về cách bạn tìm thấy câu trả lời? Điều đó thậm chí còn được khai sáng hơn chính câu trả lời.
John L.

1
@ Apass.Jack: Cảm ơn! :) Tôi không có một chiến lược đặc biệt nào và có thể mất nhiều thời gian để đi sai hướng. Ví dụ, ở đây tôi đã mất một thời gian dài để nghĩ rằng tôi có thể giảm từ Chu kỳ Hamilton (tương tự như trong phần tử đặt hàng) trước khi nhận ra rằng công trình của tôi sẽ cho phép các cấu hình tương ứng với các phần phụ, và do đó sẽ không hoạt động. Theo quy định, tôi luôn thử giảm từ Vertex Cover hoặc Phân vùng, sau đó có thể là Clique. "Câu trả lời mạng có giá trị" nghe có vẻ là một ý tưởng tuyệt vời :)
j_random_hacker

1
@ Apass.Jack: Một ý tưởng chung hữu ích là suy nghĩ về cách bạn có thể "chia tỷ lệ" cho một trường hợp vấn đề mục tiêu mà không thay đổi câu trả lời của nó - ví dụ: nếu vấn đề mục tiêu (những gì chúng tôi đang cố gắng chứng minh) là Vertex Cover, làm cho mọi điều tích cực số nguyên tách rời các bản sao của biểu đồ và cũng nhân ngưỡng k với r để câu trả lời không thay đổi. Thường thì bạn muốn một số vi phạm nhất định (các giải pháp đích không tương ứng với các giải pháp nguồn hợp lệ) để "chế ngự" một số vi phạm khác và trong trường hợp đó bạn có thể "nhân lên" các tiện ích tương ứng với vi phạm quan trọng hơn. rkr
j_random_hacker

1
Để giảm bớt câu trả lời của tôi, chúng tôi muốn mã hóa một trường hợp của một vấn đề trong đó có hai "lực": Cố gắng che tất cả các cạnh và cố gắng sử dụng càng ít đỉnh càng tốt. Cái đầu tiên quan trọng hơn ở đây, vì vậy tôi đã "nhân lên" các hàng tương ứng với các cạnh: bây giờ một vi phạm một cạnh có giá , nghĩa là bỏ lỡ một cạnh còn tệ hơn là bao gồm tất cả các đỉnh. Và bây giờ tôi mới nhận ra rằng tôi nên chỉnh sửa câu trả lời để làm rõ rằng chúng tôi đang xử lý các phiên bản vấn đề quyết định của hai vấn đề này, trong đó các tham số ngưỡng là một phần của ví dụ vấn đề ...n+1
j_random_hacker 28/03/19

2

S

function simplification:
while(true)
    if any row i$ has no 1 or no -1 left, remove it
    if any column j has no -1 then,
       remove it and put j on the leftmost available position in S,
       remove all rows where column j has 1.
    if any column j has no 1 then, 
       remove it and put j on the rightmost available position in S.
    if no modification has been done on this loop, break

Sau đó, bạn phải thực hiện một khám phá hoàn chỉnh về tổ hợp bằng cách sử dụng lặp lại chức năng chọn:

function pick(k):
    put column k on the leftmost available position in S
    remove any row where column k is -1 or 1

Sau mỗi lượt chọn, bạn có thể thực hiện đơn giản hóa để có thể giảm số lượng khả năng khám phá. Tôi đề nghị khám phá một cách tham lam bắt đầu với cột có ít -1, do đó bạn có thể đạt đến giới hạn thấp hơn làm tiêu chí dừng.

Trong ví dụ đã cho, sự đơn giản hóa đầu tiên đưa ra (như Pål GD đã giải thích trong bình luận)

  • S[0]=c3
  • S[1]=c4
  • S[2]=c2
    [1111]

[110000110000001100001100000011000011]

Tuy nhiên, đơn giản hóa vẫn còn khoảng một nửa các bước thăm dò. Và loại ma trận này có thể được phân chia trong một số ma trận phụ độc lập.


1
@ Apass.Jack Tôi chỉnh sửa để chính xác hơn. Có, tôi có nghĩa là vị trí cột trong chuỗi đầu ra.
Optidad

Nâng cao như bước đơn giản hóa có thể đủ tốt cho các mục đích thực tế (chẳng hạn như các bài tập lập trình trực tuyến?).
John L.

Cảm ơn, trên thực tế tôi đã quan tâm đến việc ước tính chi phí thời gian khấu hao nhưng tôi thực sự không biết phải làm thế nào. Điều này có thể không? Hoặc là nó phụ thuộc nhiều vào vấn đề?
Optidad

2
ijijjij

1
ijijijijikk
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.