Ini pertama kalinya saya mencoba menggunakan cvxpy. Saya memiliki 2 batasan yang sangat sederhana:

x = cp.Variable((5, 5))
constrains = [cp.sum(x) == 1.0, 0 <= x]

Solusinya bekerja hampir sepanjang waktu, memenuhi kedua kendala. Namun terkadang solusinya hanya memenuhi kendala pertama dan mengeluarkan nilai negatif. Saya bertanya-tanya apakah ada cara untuk memiliki pemecah untuk menunjukkan apakah itu berhasil atau tidak.

0
zhihao_li 1 November 2020, 05:46

1 menjawab

Jawaban Terbaik

Informasi semacam ini selalu menjadi bagian dari beberapa informasi status yang diisi oleh pemecah masalah. Dalam kasus cvxpy, ini didokumentasikan di sini:

Jadi sesuatu seperti:

problem.solve()
if problem.status == 'optimal':
    ...
else:
    ...   

Adalah rute biasa.

Ucapan:

Pemecah memutuskan ini dan kelayakan dan keputusan optimalitas tergantung pada toleransi secara umum (matematika floating-point!).

Selain itu, sebagian besar pemecah dalam cvxpy adalah pemecah seperti titik interior (bahkan beberapa pemecah berbasis orde pertama) yang perlahan-lahan menyatu ke beberapa solusi perkiraan yang akurat secara sewenang-wenang sehingga:

  • batasan simpleks Anda (sum(x) == 1) mungkin tidak aktif (dibandingkan dengan 1,0) oleh beberapa epsilon kecil seperti 1e-12
  • beberapa variabel non-negatif mungkin negatif oleh beberapa epsilon kecil seperti 1e-12

Ini benar-benar normal (untuk jenis pemecah ini; hal-hal berbeda ketika menggunakan pemecah seperti simpleks atau pasca-opt crossover berbasis simpleks). Pengguna perlu berhati-hati dan pendekatan yang dia pilih biasanya tergantung pada kasus penggunaannya. Misalnya. pasca-kliping x = np.clip(x.value, 0.0, np.inf), pembulatan dan seterusnya.

1
sascha 1 November 2020, 12:16