Pertimbangkan masalah berikut:
Biarkan roda didefinisikan sebagai daftar bilangan bulat diindeks secara melingkar . Sebagai contoh…
{3, 4, 9, -1, 6}
… Adalah roda 5 dengan 3 di posisi 0, 4 di posisi 1, dan seterusnya. Roda mendukung operasi rotasi, sehingga rotasi satu langkah akan mengubah roda di atas menjadi ...
{6, 3, 4, 9, -1}
… Sekarang dengan 6 di posisi 0, 3 di posisi 1, dan seterusnya. Biarkan menjadi seperangkat - -roda yang dipesan . Diberikan beberapa dan beberapa bilangan bulat , temukan serangkaian rotasi sedemikian rupa sehingga…
Dengan kata lain, jika Anda meletakkan roda sebagai matriks, jumlah setiap kolom adalah . Asumsikan bahwa dibangun sehingga solusinya unik hingga rotasi setiap elemen (yaitu, ada solusi unik yang terdiri dari mengambil satu solusi, kemudian memutar setiap roda di dengan jumlah langkah yang sama).
Solusi sepele untuk masalah ini melibatkan hanya memeriksa setiap kemungkinan rotasi. Berikut ini beberapa pseudocode untuk itu:
function solve(wheels, index)
if wheels are solved:
return true
if index >= wheels.num_wheels:
return false
for each position 1..k:
if solve(index + 1) is true:
return true
else:
rotate wheels[index] by 1
solve(wheels, 0)
Ini adalah solusi yang sangat lambat (seperti ). Saya bertanya-tanya apakah mungkin untuk melakukan masalah ini lebih cepat, dan juga apakah ada nama untuk itu.
sumber
Jawaban:
Untuk sebagian besar jawaban ini, saya membahas versi keputusan masalah, di mana sebuah contoh memiliki paling banyak satu solusi diberikan ("janji"), dan Anda harus memutuskan apakah ia punya solusi atau tidak.
Anda dapat mengurangi PARTISI untuk masalah Anda (olahraga). (PARTISI adalah masalah menentukan apakah satu set bilangan bulat dapat dipartisi menjadi dua bagian dengan jumlah yang sama.) Harus diakui, ini tidak selalu memenuhi syarat bahwa solusinya unik.
Dengan beberapa pekerjaan lagi, Anda dapat (secara langsung) mengurangi SAT menjadi (versi keputusan) masalah Anda, dan mungkin itu dapat dilakukan sedemikian rupa sehingga jika instance SAT memiliki solusi yang unik, maka demikian juga hasil instance dari masalahmu. Dalam hal itu, kami mendapatkan bahwa versi keputusan tidak dapat dipecahkan dalam polytime kecuali NP = RP, yang dianggap tidak mungkin.
Perhatikan bahwa jika versi keputusan (lebih tepatnya, versi janji) dari masalah tidak dapat dipecahkan dalam polytime, maka tidak ada algoritma yang dapat menyelesaikan semua instance YA dalam polytime: jika ya, Anda dapat menjalankannya hingga waktu berjalan yang ditentukan, dan periksa solusinya (jika algoritme berhenti tepat waktu).
sumber