Pada akhirnya, Anda akan membutuhkan bukti matematika dari kebenaran. Saya akan membahas beberapa teknik pembuktian di bawah ini, tetapi pertama-tama, sebelum menyelami itu, biarkan saya menghemat waktu: sebelum Anda mencari bukti, cobalah pengujian acak.
Pengujian acak
Sebagai langkah pertama, saya sarankan Anda menggunakan pengujian acak untuk menguji algoritma Anda. Sungguh menakjubkan betapa efektifnya ini: dalam pengalaman saya, untuk algoritma serakah, pengujian acak tampaknya sangat efektif. Luangkan 5 menit untuk mengkodekan algoritme Anda, dan Anda mungkin menghemat satu atau dua jam untuk mencoba memberikan bukti.
Ide dasarnya sederhana: terapkan algoritma Anda. Juga, terapkan algoritma referensi yang Anda tahu benar (mis., Yang secara menyeluruh mencoba semua kemungkinan dan mengambil yang terbaik). Tidak apa-apa jika algoritma referensi Anda tidak efisien secara asimptot, karena Anda hanya akan menjalankan ini pada contoh masalah kecil. Kemudian, buat secara acak satu juta contoh masalah kecil, jalankan kedua algoritma pada masing-masing, dan periksa apakah algoritma kandidat Anda memberikan jawaban yang benar dalam setiap kasus.
Secara empiris, jika calon algoritma serakah Anda salah, biasanya Anda akan sering menemukan ini selama pengujian acak. Jika tampaknya benar pada semua kasus uji, maka Anda harus beralih ke langkah berikutnya: datang dengan bukti matematika dari kebenaran.
Bukti matematis tentang kebenaran
OK, jadi kita perlu membuktikan algoritma serakah kita benar: bahwa ia menghasilkan solusi optimal (atau, jika ada beberapa solusi optimal yang sama-sama baik, bahwa itu menghasilkan salah satunya).
Prinsip dasarnya adalah prinsip intuitif:
Prinsip: Jika Anda tidak pernah membuat pilihan yang buruk, Anda akan baik-baik saja.
Algoritma serakah biasanya melibatkan urutan pilihan. Strategi bukti dasar adalah bahwa kita akan mencoba membuktikan bahwa algoritma tidak pernah membuat pilihan yang buruk. Algoritma serakah tidak dapat mundur - setelah mereka membuat pilihan, mereka berkomitmen dan tidak akan pernah membatalkan pilihan itu - jadi sangat penting bahwa mereka tidak pernah membuat pilihan yang buruk.
Apa yang akan dianggap sebagai pilihan yang baik? Jika ada satu solusi optimal, mudah untuk melihat apa yang merupakan pilihan yang baik: setiap pilihan yang identik dengan yang dibuat oleh solusi optimal. Dengan kata lain, kami akan mencoba membuktikan bahwa, pada setiap tahap dalam pelaksanaan algoritma serakah, urutan pilihan yang dibuat oleh algoritma sejauh ini sama persis dengan beberapa awalan dari solusi optimal. Jika ada beberapa solusi optimal yang sama baiknya, pilihan yang baik adalah yang konsisten dengan setidaknya satu optima. Dengan kata lain, jika urutan algoritme pilihan sejauh ini cocok dengan awalan salah satu solusi optimal, semuanya baik-baik saja sejauh ini (belum ada yang salah).
Untuk menyederhanakan kehidupan dan menghilangkan gangguan, mari kita fokus pada kasus di mana tidak ada ikatan: ada solusi optimal tunggal yang unik. Semua mesin akan terbawa ke kasus di mana ada beberapa optima yang sama baiknya tanpa perubahan mendasar, tetapi Anda harus sedikit lebih berhati-hati tentang detail teknis. Mulailah dengan mengabaikan detail tersebut dan berfokus pada kasus di mana solusi optimal adalah unik; itu akan membantu Anda fokus pada apa yang penting.
Ada pola bukti yang sangat umum yang kami gunakan. Kami akan bekerja keras untuk membuktikan properti algoritma berikut:
Klaim: Misalkan adalah solusi keluaran oleh algoritma dan O menjadi solusi optimal. Jika S adalah berbeda dari O , maka kita dapat men-tweak O untuk mendapatkan solusi lain O * yang berbeda dari O dan ketat lebih baik dari O .SOSOOO∗OO
Perhatikan mengapa ini berguna. Jika klaim itu benar, berarti algoritma tersebut benar. Ini pada dasarnya adalah bukti oleh kontradiksi. Baik sama dengan O atau berbeda. Jika berbeda, maka kita dapat menemukan solusi lain O ∗ yang benar-benar lebih baik daripada O - tetapi itu kontradiksi, karena kami mendefinisikan O sebagai solusi optimal dan tidak mungkin ada solusi yang lebih baik dari itu. Jadi kami terpaksa menyimpulkan bahwa S tidak bisa berbeda dari O ; S harus selalu sama dengan OSOO∗OOSOSO, yaitu, algoritma serakah selalu menghasilkan solusi yang benar. Jika kami dapat membuktikan klaim di atas, maka kami telah membuktikan algoritma kami benar.
Baik. Jadi bagaimana kita membuktikan klaim itu? Kami menganggap solusi sebagai vektor ( S 1 , ... , S n ) yang sesuai dengan urutan pilihan n yang dibuat oleh algoritma, dan kami juga memikirkan solusi optimal O sebagai vektor ( O 1 , ... , O n ) sesuai dengan urutan pilihan yang akan menyebabkan O . Jika S berbeda dari O , harus ada beberapa indeks i di mana S i ≠S(S1,…,Sn)nO(O1,…,On)OSOi ; kami akan fokus pada i seperti terkecil. Kemudian, kita akan men-tweak O dengan mengubah O sedikit di i posisi th pertandingan S i , yaitu, kita akan men-tweak solusi optimal O dengan mengubah i th pilihan dengan yang dipilih oleh algoritma serakah, dan kemudian kami akan menunjukkan bahwa ini mengarah ke solusi yang lebih baik. Secara khusus, kami akan mendefinisikan O ∗ menjadi sesuatu sepertiSi≠OiiOOiSiOiO∗
O∗=(O1,O2,…,Oi−1,Si,Oi+1,Oi+2,…,On),
kecuali yang sering kita harus memodifikasi bagian sedikit untuk menjaga konsistensi global. Bagian dari strategi pembuktian melibatkan beberapa kepintaran dalam mendefinisikan O ∗ dengan tepat. Kemudian, daging bukti akan di entah bagaimana menggunakan fakta-fakta tentang algoritma dan masalah untuk menunjukkan bahwa O * ketat baik dari OOi+1,Oi+2,…,OnO∗O∗O; di situlah Anda membutuhkan wawasan khusus masalah. Pada titik tertentu, Anda perlu menyelami rincian masalah spesifik Anda. Tapi ini memberi Anda rasa struktur bukti khas kebenaran untuk algoritma serakah.
Contoh sederhana: Subset dengan jumlah maksimal
Ini mungkin lebih mudah dipahami dengan bekerja melalui contoh sederhana secara rinci. Mari kita pertimbangkan masalah berikut ini:
Input: Sebuah set bilangan bulat, integer k Output: Sebuah set S ⊆ U ukuran k yang jumlahnya adalah sebagai besar mungkinUk
S⊆Uk
Ada algoritma serakah alami untuk masalah ini:
- Set .S:=∅
- Untuk :
i:=1,2,…,k
- Biarkan menjadi angka terbesar di U yang belum diambil (yaitu, angka terbesar ke- i di U ). Add x i ke S .xiUiUxiS
Pengujian acak menunjukkan ini selalu memberikan solusi optimal, jadi mari kita secara formal membuktikan bahwa algoritma ini benar. Perhatikan bahwa solusi optimal adalah unik, jadi kami tidak perlu khawatir tentang ikatan. Mari kita buktikan klaim yang diuraikan di atas:
Klaim: Misalkan adalah solusi keluaran oleh algoritma ini pada input U , k , dan O solusi optimal. Jika S ≠ O , maka kita dapat membangun solusi lain O * yang jumlahnya bahkan lebih besar dari O .SU,kOS≠OO∗O
Bukti. Asumsikan , dan membiarkan saya menjadi indeks pertama iterasi mana x i ∉ O . (Indeks seperti itu saya harus ada, karena kita telah mengasumsikan S ≠ O dan oleh definisi algoritma kita memiliki S = { x 1 , ... , x k } .) Karena (dengan asumsi) saya minimal, kita harus memiliki x 1 , … , x i - 1 ∈ O , dan khususnya,S≠Oixi∉OiS≠OS={x1,…,xk}ix1,…,xi−1∈O memiliki bentuk O = { x 1 , x 2 , ... , x i - 1 , x ′ i , x ′ i + 1 , ... , x ′ n } , di mana angka x 1 , ... , x i - 1 , x ′ i , … , x ′ nOO={x1,x2,…,xi−1,x′i,x′i+1,…,x′n}x1,…,xi−1,x′i,…,x′nterdaftar dalam urutan menurun. Melihat bagaimana algoritma memilih , kita melihat bahwa kita harus memiliki x i > x ′ j untuk semua j ≥ i . Secara khusus, x i > x ′ i . Jadi, tentukan O = O ∪ { x i } ∖ { x ′ i } , yaitu, kita memperoleh O ∗ dengan menghapus angka ke- i di Ox1,…,xixi>x′jj≥ixi>x′iO=O∪{xi}∖{x′i}O∗iOdan menambahkan . Sekarang jumlah unsur O * adalah jumlah dari unsur O ditambah x i - x ' i , dan x i - x ' i > 0 , sehingga O * 's sum ketat lebih besar dari O ' sum s. Ini membuktikan klaim. ◼xiO∗Oxi−x′ixi−x′i>0O∗O■
Intuisi di sini adalah bahwa jika algoritma serakah pernah membuat pilihan yang tidak konsisten dengan , maka kita dapat membuktikan O bisa lebih baik jika dimodifikasi untuk memasukkan elemen yang dipilih oleh algoritma serakah pada tahap itu. Karena O adalah optimal, tidak mungkin ada cara untuk membuatnya lebih baik (itu akan menjadi kontradiksi), jadi satu-satunya kemungkinan yang tersisa adalah asumsi kami salah: dengan kata lain, algoritma serakah tidak akan pernah membuat pilihan yang tidak sesuai dengan O .OOOO
Argumen ini sering disebut argumen pertukaran atau pertukaran lemma . Kami menemukan tempat pertama di mana solusi optimal berbeda dari solusi serakah dan kami membayangkan menukar elemen untuk pilihan serakah yang sesuai (ditukar x ′ i untuk x i ). Beberapa analisis menunjukkan bahwa pertukaran ini hanya dapat meningkatkan solusi optimal - tetapi menurut definisi, solusi optimal tidak dapat ditingkatkan. Jadi satu-satunya kesimpulan adalah bahwa tidak boleh ada tempat di mana solusi optimal berbeda dari solusi serakah. Jika Anda memiliki masalah yang berbeda, cari peluang untuk menerapkan prinsip pertukaran ini dalam situasi spesifik Anda.Ox′ixi