Tìm một tập hợp các giải pháp khác nhau tối đa bằng cách sử dụng lập trình tuyến tính hoặc kỹ thuật tối ưu hóa khác


8

Theo truyền thống, lập trình tuyến tính được sử dụng để tìm một giải pháp tối ưu cho một tập hợp các ràng buộc, biến và mục tiêu (tất cả được mô tả là mối quan hệ tuyến tính). Đôi khi, khi mục tiêu song song với một ràng buộc, có vô số hoặc nhiều giải pháp tối ưu tốt tương đương. Tôi không hỏi về trường hợp sau này.

Tôi quan tâm hơn đến việc tìm kiếm nhiều giải pháp trong khu vực khả thi được tạo ra bởi các ràng buộc của tôi. Nhưng tôi muốn các giải pháp mà tôi thấy là 'phân tán' xung quanh khu vực khả thi theo nghĩa là chúng cách xa nhau tối đa. Có một cách đã biết, mà không cần chạy một bộ giải nhiều lần, tạo ra nhiều giải pháp và sử dụng hàm mục tiêu để thực thi rằng các giải pháp nên được tách ra?

Ví dụ: bất kỳ chương trình tuyến tính nào có quyết định a và b và các ràng buộc w <= a <= x và y <= b <= z đều có thể được 'sao chép' để tìm hai giải pháp. Chương trình tuyến tính mới của chúng tôi có các biến a1, a2, b1 và b2 và các ràng buộc w <= a1 <= x và w <= a2 <= x và tương tự cho b1, b2. Tuy nhiên, khi hình thành một hàm mục tiêu, chúng ta gặp rắc rối vì chúng ta không thể sử dụng các chỉ tiêu khác với định mức L1 mà không loại bỏ tuyến tính và chúng ta thậm chí không thể sử dụng định mức L1 vì điều đó là không thể (cho đến nay tôi biết ) để mã hóa các giá trị tuyệt đối.

Có lẽ tôi nên xem xét tối ưu hóa lồi hoặc lập trình semidefinite hoặc một cái gì đó?

Có cách nào để tạo ra một tập hợp các giải pháp cho một chương trình tuyến tính và sử dụng một mục tiêu thực thi "khoảng cách" giữa các giải pháp không?


1
Tính toán khối lập phương nhỏ nhất xung quanh khu vực khả thi của bạn (nếu nó không bị ràng buộc, hãy chọn một phần giới hạn), đặt một siêu dữ liệu với độ phân giải mong muốn lên nó và loại bỏ tất cả các điểm không đáp ứng các hạn chế. bạn có muốn công việc kia?
Raphael

Điều đó có thể làm việc cho tôi, mặc dù tôi không rõ tôi sẽ làm thế nào về việc tính toán hypercube và tôi nghĩ rằng khu vực khả thi mà tôi đang điều tra là không tầm thường - tôi hy vọng rằng nhiều điểm sẽ phải bị loại bỏ. Ứng dụng cụ thể của tôi có hàng chục ngàn biến / quyết định và hàng trăm ràng buộc.
Ross

Một giải pháp khả thi cơ bản là trong một đỉnh của đa giác. Bạn có thể không nhìn vào các quy tắc của các mặt sự cố để tính toán một hướng "xuyên qua" đa giác và đi theo nó đến ranh giới của khu vực khả thi không? Điều đó sẽ cung cấp cho bạn các giải pháp hợp lý khác nhau, nhưng có lẽ không phải là những giải pháp khác nhau nhất.
adrianN

Đừng sử dụng một khối lập phương. Sử dụng một ellipsoid (cụ thể, một ellipsoid nhỏ có chứa polytope, có thể được tìm thấy bằng phương pháp ellipsoid). Bằng cách đó, bạn được đảm bảo tìm thấy số điểm hợp lý trong khu vực.
Peter Shor

Câu trả lời:


2

Một heuristic, sử dụng lập trình tuyến tính

Một cách tiếp cận có thể là chọn một hàm mục tiêu ngẫu nhiên và tối đa hóa nó. Sau đó lặp lại, với một tập hợp các hàm mục tiêu khác nhau mỗi lần.

Nói cách khác, giả sử các ẩn số là và bạn có một số ràng buộc . Trong mỗi lần lặp, bạn chọn , sau đó tìm kiếm một giải pháp tối đa hóa theo các ràng buộc .x1,x2,,xnCc1,c2,,cnRc1x1++cnxnC

Tôi hy vọng heuristic này thường có thể tìm thấy một bộ giải pháp hơi phân tán - không nhất thiết phải phân tán tối đa (cách xa nhau tối đa), nhưng có lẽ cũng không quá gần nhau.

Tối đa hóa khoảng cách cặp trung bình L2, sử dụng lập trình bậc hai

Ngoài ra, sử dụng lập trình bậc hai. Để đơn giản, chúng ta hãy xem xét vấn đề tìm hai giải pháp. Giả sử bạn muốn hai giải pháp cách nhau càng xa càng tốt, theo định mức (khoảng cách Euclide). Sau đó, điều này có thể được coi là một vấn đề lập trình bậc hai .x,yL2

Về cơ bản, bạn muốn tối đa hóa khoảng cách bình phương giữa và , phải tuân theo yêu cầu cả và phải Đáp ứng các ràng buộc. Đây là vấn đề tối đa hóa hàm mục tiêu bậc hai, với các ràng buộc tuyến tính - tức là lập trình bậc hai.d(x,y)2=(x1y1)2++(xnyn)2xyxy

Nếu bạn muốn điểm phân tán tối đa, điều này cũng có thể. Giả sử các điểm là . Sau đó, bạn có thể tối đa hóa chức năng mục tiêukx1,,xkRn

i<jd(xi,xj)2,

tức là chức năng

i<j(xixj)2.

Cxi

kk+1k

Lập trình bậc hai khó hơn lập trình tuyến tính, nhưng có những người giải quyết tự giải quyết vấn đề lập trình bậc hai cho bạn.

Tối đa hóa khoảng cách cặp đôi tối thiểu L2, sử dụng QCQP

ktkx1,,xkRntd(xi,xj)ti<j. Sau đó, điều này có thể được xây dựng như một chương trình tối ưu hóa bậc hai với các ràng buộc bậc hai, tức là QCQP . QCQP thậm chí còn khó hơn, nhưng cũng có những người giải quyết sẵn sàng cho QCQP mà bạn có thể thử.


1

Tôi tìm thấy một cách tiếp cận để tạo ra các giá trị tuyệt đối.

a1a2b1b2|a1a2|+|b1b2|

Chúng tôi có thể giới thiệu "biến chùng" abs_a và abs_b và các ràng buộc:

absa+a1a20

absaa1+a20

b1b2absaa1a2absaa1a2

absa+absb


Trên thực tế, các bảng mã này chỉ hoạt động để giảm thiểu các giá trị tuyệt đối. Trong đó nó không giải quyết vấn đề của tôi. Thêm thông tin tại đây: lpsolve.sourceforge.net/5.5/absolute.htmlm
Ross
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.