Menemukan satu set solusi yang berbeda secara maksimal menggunakan pemrograman linier atau teknik optimasi lainnya

8

Secara tradisional, pemrograman linier digunakan untuk menemukan satu solusi optimal untuk sekumpulan kendala, variabel, dan tujuan (semuanya digambarkan sebagai hubungan linier). Kadang-kadang, ketika tujuannya sejajar dengan kendala, ada solusi optimal tak terbatas atau banyak yang sama baiknya. Saya tidak bertanya tentang kasus terakhir ini.

Saya lebih tertarik menemukan banyak solusi yang berada di wilayah layak yang dihasilkan oleh serangkaian kendala saya. Tapi saya ingin solusi yang saya temukan 'tersebar' di sekitar wilayah yang layak dalam arti bahwa mereka secara maksimal jauh dari satu sama lain. Adakah cara yang diketahui untuk, tanpa menjalankan pemecah beberapa kali, menghasilkan banyak solusi dan menggunakan fungsi objektif untuk menegakkan bahwa solusi harus dipisahkan?

Misalnya, setiap program linier dengan keputusan a dan b dan kendala w <= a <= x dan y <= b <= z dapat 'diduplikasi' untuk menemukan dua solusi. Program linier baru kami memiliki variabel a1, a2, b1, dan b2 dan kendala w <= a1 <= x dan w <= a2 <= x dan serupa untuk b1, b2. Namun, ketika datang untuk membentuk fungsi obyektif kita mengalami kesulitan karena kita tidak dapat menggunakan norma selain norma L1 tanpa membuang linearitas dan kita tidak dapat benar-benar bahkan menggunakan norma L1 karena itu tidak mungkin (sejauh yang saya tahu ) untuk menyandikan nilai absolut.

Mungkin saya harus melihat ke dalam optimasi cembung atau pemrograman semidefinite atau sesuatu?

Adakah cara yang diketahui untuk menghasilkan serangkaian solusi untuk program linier, dan menggunakan tujuan yang memberlakukan "jarak" antara solusi?

Ross
sumber
1
Hitung kubus terkecil di sekitar wilayah Anda yang layak (jika tidak dibatasi, pilih beberapa bagian yang dibatasi), letakkan hypergrid dengan resolusi yang diinginkan di atasnya dan buang semua poin yang tidak memenuhi batasan. Apakah itu akan berhasil untuk Anda?
Raphael
Itu mungkin bekerja untuk saya, meskipun tidak jelas bagi saya bagaimana saya akan menghitung hypercube, dan saya pikir wilayah yang layak saya selidiki sangat tidak sepele - saya berharap bahwa banyak poin harus dibuang. Aplikasi khusus saya memiliki puluhan ribu variabel / keputusan dan ratusan kendala.
Ross
Solusi dasar yang layak adalah dalam sebuah simpul dari polytope. Tidak bisakah Anda melihat normals dari wajah-wajah kejadian untuk menghitung arah "melintasi" polytope dan mengikutinya ke batas wilayah yang layak? Itu seharusnya memberi Anda solusi yang cukup berbeda, tetapi mungkin bukan yang paling berbeda.
adrianN
Jangan gunakan kubus. Gunakan ellipsoid (khususnya, ellipsoid kecil yang mengandung polytope, yang dapat ditemukan dengan metode ellipsoid). Dengan begitu, Anda dijamin akan menemukan sejumlah poin di wilayah ini.
Peter Shor

Jawaban:

2

Heuristik, menggunakan pemrograman linier

Salah satu pendekatan mungkin untuk memilih fungsi objektif acak, dan memaksimalkannya. Kemudian ulangi, dengan serangkaian fungsi tujuan yang berbeda setiap kali.

Dengan kata lain, anggaplah yang tidak diketahui itu x1,x2,,xn, dan Anda memiliki beberapa kendala C. Di setiap iterasi yang Anda pilihc1,c2,,cnR secara acak, lalu cari solusi yang memaksimalkan c1x1++cnxn tunduk pada kendala C.

Saya berharap heuristik ini mungkin sering menemukan serangkaian solusi yang agak tersebar - tidak harus tersebar secara maksimal (maksimal jauh dari satu sama lain), tetapi mungkin juga tidak terlalu dekat satu sama lain.

Memaksimalkan rata-rata jarak L2 berpasangan, menggunakan pemrograman kuadratik

Atau, gunakan pemrograman kuadratik. Untuk kesederhanaan, mari kita lihat masalah menemukan dua solusi. Misalkan Anda menginginkan dua solusix,y yang sejauh mungkin terpisah satu sama lain, di bawah L2norma (jarak Euclidean). Maka ini dapat dirumuskan sebagai masalah pemrograman kuadratik .

Pada dasarnya, Anda ingin memaksimalkan jarak kuadrat d(x,y)2=(x1y1)2++(xnyn)2 antara x dan y, tunduk pada persyaratan bahwa keduanya x dan yharus memenuhi kendala. Ini adalah masalah memaksimalkan fungsi tujuan kuadratik, dengan kendala linier - yaitu, pemrograman kuadratik.

jika kamu mau kpoin yang tersebar secara maksimal, ini juga mungkin. Katakan poinnyax1,,xkRn. Maka Anda bisa memaksimalkan fungsi tujuan

i<jd(xi,xj)2,

yaitu fungsi

i<j(xixj)2.

Ini adalah fungsi kuadratik, dan Anda memiliki batasan linear C pada masing-masing poin xi, jadi ini adalah contoh pemrograman kuadratik. Ini menemukan Anda titik yang tersebar maksimal dalam arti bahwa jarak berpasangan rata-rata dimaksimalkan.

Anda juga dapat merumuskan varian serakah dari algoritma ini, yang sudah Anda miliki k solusi, dan Anda ingin menemukan k+1solusi th yang memenuhi semua ketidaksetaraan linear dan juga memaksimalkan jarak L2 rata-rata dari yang lain ksolusi. Itu juga bisa dirumuskan sebagai masalah pemrograman kuadratik.

Pemrograman kuadratik lebih sulit daripada pemrograman linier, tetapi ada pemecah sendiri yang akan memecahkan masalah pemrograman kuadratik untuk Anda.

Memaksimalkan jarak L2 minimal berpasangan, menggunakan QCQP

Akhirnya, katakanlah Anda menginginkannya kpoin yang akan tersebar dalam arti bahwa Anda ingin memaksimalkan jarak berpasangan minimum. Dengan kata lain, katakanlah Anda ingin menemukan ambang batas sebesar mungkint sedemikian rupa sehingga memungkinkan untuk ditemukan k poin x1,,xkRn bahwa masing-masing memenuhi kendala linier, dan sedemikian rupa sehingga setiap pasangan titik berada di kejauhan t jauh dari satu sama lain: d(xi,xj)t untuk semua i<j. Maka ini dapat dirumuskan sebagai program optimasi kuadratik dengan kendala kuadratik, yaitu, QCQP . QCQP bahkan lebih sulit, tetapi ada pemecah yang tidak sesuai untuk QCQP yang bisa Anda coba juga.

DW
sumber
1

Saya menemukan pendekatan untuk menghasilkan nilai absolut.

Misalkan kita memiliki variabel a1, a2, b1 dan b2dan banyak kendala. Fungsi objektif kami terlihat seperti: maksimalkan|a1a2|+|b1b2|; gagasannya adalah kita ingin memaksimalkan norma L1 dari dua solusi ini (sesuai pertanyaan awal).

Kami dapat memperkenalkan "slack variable" abs_a dan abs_b dan batasannya:

absa+a1a20

absaa1+a20

dan juga untuk b1 dan b2. Kendala ini memaksaabsa paling banyak perbedaan antara a1 dan a2, dan mungkin lebih sedikit. Dengan kata lainabsa tidak boleh lebih besar dari perbedaan maksimum antara a1 dan a2.

Kemudian yang tersisa adalah mengganti fungsi tujuan: memaksimalkan SebuahbsSebuah+Sebuahbsb.

Ross
sumber
Sebenarnya, pengkodean ini hanya berfungsi untuk meminimalkan nilai absolut. Itu tidak memecahkan masalah saya. Informasi lebih lanjut di sini: lpsolve.sourceforge.net/5.5/absolute.htm
Ross