Misi Anda adalah untuk membangun algoritma (program atau fungsi) yang dapat mengoptimalkan pengemasan buah dari ban berjalan ke dalam tas untuk dikirim ke pengecer, mengoptimalkan untuk sejumlah besar tas.
Setiap kantung harus memiliki berat setidaknya jumlah tertentu, tetapi setiap kelebihannya akan hilang karena bobot tersebut dapat digunakan untuk mengisi kantung lain. Mesin pengepakan Anda selalu melihat n
buah - buahan dari antrian dan hanya dapat memilih untuk menambahkan n
buah - buahan ini ke tas (tunggal) yang sedang diproses. Itu tidak bisa melihat melampaui n
elemen pertama dalam antrian. Program selalu tahu persis berapa banyak berat yang ada di dalam tas.
Cara lain untuk memvisualisasikan ini adalah memiliki ban berjalan dengan area pemuatan ukuran n
di ujung, dari mana buah harus diambil sebelum buah baru tiba. Buah sisa dan kantong yang tidak penuh di bagian akhir akan dibuang.
Input
- Daftar / array bobot buah dalam antrian (bilangan bulat positif)
- Berat total minimum untuk tas (bilangan bulat positif)
- Lookahead
n
(bilangan bulat positif)
Keluaran
Algoritme Anda harus mengembalikan untuk semua kantong bobot buah-buahan di dalamnya, dengan cara apa pun yang nyaman bagi Anda dan bahasa Anda, baik itu stdin atau nilai balik atau sesuatu yang lain. Anda harus dapat menjalankan program dan menghitung skor Anda dalam satu menit di komputer Anda.
Contoh
Total weight 1000, lookahead of 3 and fruit queue:
[171,163,172,196,156,175,162,176,155,182,189,142,161,160,152,162,174,172,191,185]
One possible output (indented to show how the lookahead affects the bagging):
[171,163,172, 156,175, 176]
[162, 155,182,189, 161,160]
[152,162,174,172,191,185]
Mencetak gol
Algoritme Anda akan diuji pada enam kali berjalan pada batch 10.000 jeruk yang telah saya siapkan untuk Anda, pada lookaheads mulai dari 2 hingga 7, termasuk di kedua ujungnya. Anda harus mengemasnya ke dalam tas dengan berat setidaknya 1000 unit. Jeruk biasanya didistribusikan dengan berat rata-rata 170 dan standar deviasi 13, jika itu bisa membantu.
Skor Anda akan menjadi jumlah jumlah tas dari enam seri. Skor tertinggi menang. Celah standar tidak diijinkan.
Contoh implementasi sederhana dan test suite boilerplate di Haskell
Jawaban:
Python 3,
99649981 tasGagasan solusi ini mirip dengan Jonathan, JayCe dan fortraan, tetapi dengan fungsi penilaian =)
Solusi ini menambahkan himpunan bagian terbaik dari area lookahead yang mengakses
score
.score
menyediakan pesanan melalui subset menggunakan skema berikut:expected_mean
mencoba untuk memprediksi seperti apa sisa nilai seharusnya (dengan asumsi pilihan mereka optimal).UPD :
Berikut adalah pengamatan lain: Anda dapat menempatkan jeruk dari subset terbaik ke dalam tas tanpa merusak kinerja algoritma. Memindahkan bagian mana pun dari itu masih memungkinkan untuk memindahkan sisanya setelahnya, dan sisanya harus tetap menjadi pilihan terbaik (tanpa jeruk baru) jika skornya tepat. Selain itu, dengan cara ini ada peluang untuk secara dinamis meningkatkan set kandidat untuk dimasukkan ke dalam tas dengan melihat lebih banyak jeruk sebelum mengisi tas. Dan Anda ingin mengetahui informasi sebanyak mungkin, sehingga tidak ada gunanya memindahkan lebih dari satu jeruk ke tas pada waktu tertentu.
Cobalah!
sumber
powerset
fungsi Anda berlebihan dalam hal ini karena sama denganlen(list_)
?)expected_mean(w)
yang memberikan hasil yang baik:return (w+2) / max(1, round((w+2) / mean))
Python 3 , 9796 tas
Membangun jawaban Jonathan:
Ini bergantung pada powerset dari buku masak itertool. Pertama menemukan subset optimal dari buffer berdasarkan meminimalkan perbedaan dari berat target untuk semua subset, dan kemudian mengambil elemen dari subset ini berdasarkan kriteria yang sama. Jika tidak ada subset optimal memilih dari seluruh buffer.
sumber
C ++ 17, 9961.58 (rata-rata di atas beberapa benih acak)
(gulir ke bawah untuk penjelasan jika Anda tidak tahu C ++)
(jika
<
digunakan pada dasarnya algoritma mencoba untuk meminimalkan jumlah tas)Terinspirasi oleh jawaban ini .
TIO link untuk 250 pengulangan: Coba online!
Menentukan fungsi (sebenarnya hanya terlihat seperti fungsi, itu adalah sebuah struct)
pick_orange
yang, mengingatvector<int> weights
berat jeruk danint remain
sisa berat tas, mengembalikan indeks jeruk yang harus dipetik.Algoritma:
ulangi
500
kali{
menghasilkan jeruk acak (palsu) (distribusi normal dengan rata-rata 170 dan stddev 13) sampai ada
N_NEW_ORANGES=7
jerukmemilih subset yang jumlahnya paling kecil dan tidak lebih kecil dari
remain
(fungsibacktrack
melakukan itu)menandai semua jeruk di subset itu sebagai baik
}
rata-rata berapa kali jeruk ditandai sebagai yang baik dari jeruk (nyata) dengan berat yang sama
mengembalikan jeruk terbaik
Ada 3 konstanta hardcode dalam program yang tidak dapat disimpulkan dari masalah:
N_NEW_ORANGES
(panjang prediksi). Peningkatan ini membuat program berjalan lebih lama secara eksponensial (karena mundur)sumber
invalid use of template-name ‘std::normal_distribution’
. Tidak ada masalah dengan gcc 7.1.0.Python 2 , 9756 tas
Mari kita mulai menggulung jeruk ...
Cobalah online!
Selalu memetik buah dari buffer yang meminimalkan perbedaan absolut dari berat baru dan berat target.
sumber
Python 3, 9806 tas
Membangun jawaban Jonathan dan JayCe:
Cobalah online!
Bagaimana itu bekerja
Katakanlah bahwa tas itu memiliki 900 unit di dalamnya, dan ada 2 buah yang tersedia: buah 99 unit dan buah 101 unit. Jika 99 unit buah lebih dekat dengan awal daftar lookahead, maka
min
akan memilihnya daripada 101. Jika ini terjadi, kita sekarang akan membutuhkan buah lain untuk memenuhi 1 unit yang dibutuhkan. Saya mengubah program untuk mendukung buah yang bernilai lebih tinggi dalam kasus-kasus ini.Ia melakukan ini dengan menyortir dan kemudian membalik daftar lookahead sebelum mengatur ulang.
sumber
PHP, 9975 tas
terpanjang dari semua pengiriman tetapi harus dapat dibaca
Cobalah
sumber
Python 3,
98559928994799569964 tasBerdasarkan kode starter Jonathan Allan, tetapi tidak dapat dibaca.
Gagasan: Sejak 1000/170 = 5.88, kami mencoba memilih buah yang mendekati 1000/6 (Saya mengutak-atik konstanta ajaib). Namun, jika buah terakhir dalam kantong dapat meminimalkan limbah, kami menggunakannya sebagai gantinya.
Solusi ini memiliki target jumlah tas untuk setiap buah yang ditambahkan. Saya mungkin akan berhenti di sini. Saya menggunakan Nelder-Mead untuk menemukan
targets
array saya :9956 tas
Program tas 9947 sangat sederhana:
sumber
targets
? Pelatihan tentang data acak?Ruby , 9967 tas
Cobalah online!
Jika Anda memiliki cukup berat untuk mengisi tas, temukan subset yang paling ringan yang bisa mengisi tas dan gunakan oranye paling ringan dari subset itu. Jika tidak, dapatkan sisa berat sedekat mungkin dengan kelipatan 170.
sumber
Racket / Skema, 9880 tas
Untuk memutuskan potongan buah mana yang akan ditambahkan ke dalam tas, bandingkan berat tas yang optimal dengan berat kantong dengan potongan buah tambahan. Jika beratnya optimal, gunakan itu. Jika kelebihan berat badan, minimalkan jumlah berlebih. Jika beratnya kurang, minimalkan jumlah berlebih setelah mencoba meninggalkan celah yang optimal.
sumber
Haskell , 9777 tas
Ini adalah upaya pertama saya:
Cobalah online!
sumber
Haskell , 9981 tas
The Angs → Jonathan Allan → JayCe → fortraan → Alex → Roman Czyborra codegolf python bisa cyclize kembali ke Haskell untuk beberapa menambahkan kemurnian matematika sepanjang kereta utama yang sama pemikiran
(<miss)==False<True
)untuk bilangan bulat itu membalikkan
(m-n)/sqrt(n)==(n+1-m)/sqrt(n+1) <==> n=sqrt(m^2-1/4)-1/2
dari https://en.wikipedia.org/wiki/Sum_of_normally_distributed_random_variablesdibumbui dengan beberapa hal yang tidak perlu
Cobalah online!
tanpa menghasilkan keuntungan numerik yang berbeda di atas 9981 jaring jeruk yang dipanen sebelumnya, sementara pengepak tas 10k011 saya yang mengambil jeruk yang tidak layak keluar dari kantong tidak tertutup didiskualifikasi oleh user69850 secara pribadi user202729 → Jo King → ovs karenanya sebelum hadiah yang layak pergi ke Alex
sumber