Tantangan ini didasarkan pada beberapa temuan baru yang berkaitan dengan dugaan Collatz dan dirancang agak dalam semangat proyek polymath kolaboratif . Memecahkan dugaan penuh dianggap sangat sulit atau mungkin mustahil oleh para ahli teori matematika / bilangan, tetapi tugas yang lebih sederhana ini cukup bisa dilakukan dan ada banyak contoh kode sampel. Dalam skenario kasus terbaik, wawasan teoretis baru dapat diperoleh ke dalam masalah berdasarkan entri kontestan / kecerdikan / kreativitas.
Temuan baru adalah sebagai berikut: Bayangkan serangkaian bersebelahan bilangan bulat [ n1 ... n2 ] mengatakan m Total. Tetapkan bilangan bulat ini ke struktur daftar. Sekarang versi umum dugaan Collatz dapat dilanjutkan sebagai berikut. Ulangi salah satu bilangan bulat m (atau lebih sedikit) dalam daftar selanjutnya berdasarkan pada beberapa kriteria / algoritma pemilihan. Hapus bilangan bulat itu dari daftar jika mencapai 1. Jelas dugaan Collatz setara dengan menentukan apakah proses ini selalu berhasil untuk semua pilihan n1, n2 .
Ini adalah twist, kendala tambahan. Pada setiap langkah, tambahkan m iterate iterates dalam daftar bersama. Kemudian pertimbangkan fungsi f (i) di mana i adalah nomor iterasi dan f (i) adalah jumlah dari iterasi saat ini dalam daftar. Cari f (i) dengan properti "bagus" tertentu.
Konsep keseluruhan / keseluruhan lebih baik / lebih lengkap didokumentasikan di sini (dengan banyak contoh di ruby). Temuannya adalah bahwa strategi / heuristik / algoritma yang cukup sederhana yang mengarah ke "penurunan secara monoton" f (i) ada dan banyak contoh diberikan pada halaman itu. Berikut adalah salah satu contoh output grafis (diplot melalui gnuplot):
Jadi inilah tantangannya: Gunakan variasi pada contoh-contoh yang ada atau ide yang sama sekali baru untuk membangun algoritma seleksi yang menghasilkan f (i) "sedekat mungkin dengan penurunan monoton". Peserta harus menyertakan grafik f (i) dalam pengiriman mereka. Pemilih dapat memberikan suara berdasarkan grafik itu & ide algoritmik dalam kode.
Kontes akan didasarkan pada n1 = 200 / n2 = 400 parameter saja! (Hal yang sama pada halaman contoh.) Tapi semoga kontestan akan menjelajahi daerah lain dan juga berusaha untuk menggeneralisasi algoritma mereka.
Catatan, salah satu taktik yang mungkin sangat berguna di sini adalah algoritma tipe gradient descent, atau algoritma genetika.
Dapat mendiskusikan semua ini lebih lanjut dalam obrolan untuk peserta yang tertarik.
Untuk beberapa ref, tantangan codegolf Collatz lainnya: Collatz Conjecture (oleh Doorknob )
Jawaban:
Saya menulis beberapa kode dengan Python 2 untuk menjalankan algoritma untuk tantangan ini:
g(x)
mengambil daftar nilai dan mengembalikan daftar bools untuk apakah masing-masing harus diubah.Itu termasuk hal pertama yang saya coba, sebagai baris setelah komentar, yang iterating semua nilai dalam daftar. Saya mengerti:
Itu tidak terlihat dekat dengan monoton, jadi saya mencoba iterasi hanya nilai-nilai yang akan mengurangi jumlah, jika ada, iterasi yang akan meningkatkan paling tidak sebaliknya:
Sayangnya, itu tidak berakhir (setidaknya untuk
n1=200
,n2=400
). Saya mencoba melacak nilai yang saya lihat sebelumnya dengan menginisialisasic=set()
:Tapi itu juga tidak berakhir.
Saya belum mencoba yang lain, tetapi jika saya punya ide baru, saya akan mempostingnya di sini.
sumber
Python 3
Gagasan utama saya adalah menambahkan setiap angka Urutan Collatz ke
f(i)
fungsi secara individual sedemikian rupa sehingga meminimalkan peningkatan totalf(i)
. Fungsi yang dihasilkan tidak sepenuhnya menurun tetapi memiliki struktur yang bagus (menurut saya :)). Grafik kedua dibuat dengan interval yang lebih panjang untukf(i)
dan fungsi hukuman yang sedikit berbeda. Kode pada Gist.Saat menggunakan aturan (3 * n + 1) / 2, bukannya 3 * n + 1, algoritma menghasilkan monoton sepenuhnya
f(i)
! Saya yakin modifikasi ini dapat membuat grafik vzn jauh lebih lancar juga. Grafik kedua dibuat dengan interval yang lebih panjang untukf(i)
. Kode pada Gist.Kedua hasil serupa untuk
[n,2*n]
rentang yang lebih besar .sumber
f
tampaknya dapat dicapai. Bahkan jika algoritma saya saat ini gagal ada ruang yang cukup untuk perbaikan. Saya akan membiarkannya berjalan dan melihat apakah gagal untuk beberapan
(lebih dari 200). Monoton yang ketat lebih kuat dari dugaan Collatz sehingga saya bisa meneruskannya untuk saat ini. :) Apakah fungsi Anda berfungsi dengan baik dengan aturan (3n + 1) / 2? Mengapa Anda tidak menggunakannya?[1,n]
rentang mungkin akan lebih menarik karena ada kami juga bisa bertanya (jika monoton memegang) apakah kita dapat membuat[1,n+1]
dengan tidak memodifikasi[1,n]
satu dan menambahkann+1
urutan untuk itu.