Bayangkan kita memiliki penyihir yang tahu beberapa mantra. Setiap mantra memiliki 3 atribut: Kerusakan, waktu pendinginan, dan waktu pemeran. Barang RPG standar cantik.
Waktu pendinginan: jumlah waktu (t) yang diperlukan sebelum dapat mengucapkan mantra itu lagi. Mantra melanjutkan "cooldown" saat ia mulai melakukan casting.
Cast time: jumlah waktu (t) yang diperlukan untuk menggunakan mantra. Sementara wisaya sedang melakukan sesuatu, mantra lain tidak bisa dilemparkan dan itu tidak bisa dibatalkan.
Pertanyaannya adalah: Bagaimana Anda memaksimalkan kerusakan karena set mantra yang berbeda?
Mudah untuk menghitung kerusakan tertinggi per waktu tuang. Tetapi bagaimana dengan situasi di mana lebih baik menunggu kemudian untuk mendapatkan "macet" casting mantra kerusakan rendah ketika yang jauh lebih tinggi tersedia?
Sebagai contoh,
Bola api: 3000 kerusakan, 3 detik waktu casting, 6 detik dingin.
Frostbolt: 20 kerusakan, 4 detik waktu casting, 4 detik pendinginan.
Fireblast: 3 kerusakan, 3 detik waktu casting, 3 detik pendinginan.
Dalam hal ini kerusakan Anda per detik lebih tinggi jika Anda memilih untuk menggunakan mantra DPCT yang lebih rendah (fireblast) daripada frostbolt. Jadi kita harus mempertimbangkan konsekuensi memilih mantra.
Dalam contoh berikut adalah kasus "over casting" dan "waiting".
sumber
Jawaban:
Ketika Anda masuk ke nyali AI, sungguh menakjubkan betapa banyak yang benar-benar dicari .
Atau, tujuan dapat menghabiskan waktu kurang dari 50 detik dan pencarian akan menemukan kerusakan maksimal yang dapat dilakukan dalam 50 detik.
Masukkan parameter ini ke dalam Uniform Cost Search (UCS) dan presto, dijamin rencana pertempuran yang optimal. Bahkan lebih baik jika Anda dapat menemukan heuristik, cari dengan A * , atau IDA * dan Anda akan mendapatkan jawaban yang sama lebih cepat.
Beberapa kelebihan menggunakan UCS adalah dapat menemukan urutan pemain optimal untuk situasi yang jauh lebih rumit daripada yang Anda berikan dengan hanya 3 variabel. Beberapa aspek lain yang dapat dengan mudah ditambahkan:
UCS tidak mahakuasa. Itu tidak bisa memodelkan manfaat mantra perlindungan. Untuk itu, Anda harus meningkatkan ke penelusuran alfa-beta atau minimum.
Juga ia tidak menangani area yang terpengaruh dan pertarungan kelompok dengan sangat baik. UCS dapat diubah untuk memberikan solusi yang masuk akal dalam situasi ini, tidak dijamin untuk menemukan solusi yang optimal.
sumber
Ini adalah masalah optimisasi kombinatorial khusus. Ketika jumlah mantra meningkat, kesulitan dalam menemukan kombinasi optimal / pola mantra meningkat secara signifikan. Heuristik mirip dengan yang digunakan untuk masalah ransel akan sangat berharga dalam menyelesaikan masalah ini.
sumber
Anda perlu berpikir dalam hal 'kerusakan per unit waktu casting' (DPCT) - misalnya, bola api dengan pemain 3 detik dan melakukan 3000 kerusakan akan menghasilkan 1000 DPCT.
Jika Anda harus menunggu 3 detik untuk cooldown sebelum melemparkannya, itu akan menguranginya menjadi 500 DPCT (3000 kerusakan, dibagi dengan total 6 detik, termasuk menunggu)
Jadi, Anda hanya perlu menentukan damage-per-cast-time dari masing-masing mantra, termasuk sisa menunggu cooldown. Pilih satu dengan DPCT tertinggi, Tunggu jika perlu, lalu masukkan. Ulangi sampai bos mati :)
sumber
Menggunakan contoh Anda, Anda mungkin ingin kedua mantra lebih efektif, tetapi mungkin memberi Anda keuntungan yang berbeda. Memiliki waktu casting yang pendek (atau tidak ada waktu casting dalam hal ini) akan sangat berguna, jadi mungkin layak untuk digunakan bahkan jika itu tidak terlalu merusak dan membutuhkan waktu lebih lama untuk digunakan lagi.
Anda selalu bisa memaksakan elemen lain ke dalam persamaan. Mana / Poin Ajaib dapat melayani tujuan ini, dengan memungkinkan pemain untuk menentukan apakah penggunaan poin-poin tersebut sepadan dengan manfaatnya.
Namun secara keseluruhan, seperti yang dikatakan bluescrn, DPCT (atau DPS seperti yang disebut di banyak game yang sangat disetel dan didiskusikan oleh para pemain yang mencari campuran terbaik) benar-benar elemen utama yang ingin Anda keseimbangan, terutama jika Anda memiliki jenis pohon teknologi / keterampilan yang memungkinkan pemain yang berbeda untuk maju dengan keterampilan yang berbeda, namun dengan kemampuan untuk melakukan jumlah kerusakan yang sama pada posisi yang diberikan mereka dalam permainan.
sumber
Mencari tahu algoritma ini yang berfungsi dengan baik untuk tujuan saya.
Orang-orang mengemukakan beberapa poin bagus. Memberikannya parameter tujuan akhir akan memungkinkan algoritma pencarian normal untuk melakukan hal mereka. yaitu. lakukan kerusakan optimal dalam t detik, lakukan kerusakan x dalam waktu optimal.
Algoritme saya hanya mengembalikan urutan mantra dengan DPS tertinggi. Ini adalah algoritma cepat karena mengurangi ukuran set yang Anda lintasi, tidak memerlukan pengetahuan tentang teknik pohon pencarian lainnya.
Langkah pertama adalah mengidentifikasi mantera dengan kerusakan tertinggi per waktu tuang. Mantra ini menjadi mantra "dasar" karena itu akan menjamin kerusakan tertinggi per detik. Artinya, Anda harus selalu menggunakan mantra ini jika 2 kondisi berikut terpenuhi: 1) mantra dasar tersedia (bukan pada cooldown). 2) Saat ini Anda tidak menggunakan mantra.
Jadi itu kemudian menjadi masalah mengisi mantra lain sementara mantra dasar adalah pada cooldown. Antara (waktu cast) dan (cooldown - waktu cast). Namun, beberapa tumpang tindih dapat terjadi (aturan 2 di atas salah).
Ini kemudian menjadi masalah berulang melalui semua mantra non-baseline untuk menemukan semua urutan mantra yang tidak melanggar 2 aturan.
Untuk mantra yang DO tumpang tindih Anda harus menghukum mereka untuk potensi kerusakan yang bisa dilakukan oleh mantra awal (hingga kerusakan maksimum).
Ambil contoh, 2 mantra
1: 300 damage, 3s cast time, 10s cooldown
2: 290 kerusakan, 3s waktu casting, 3s cooldown
Kerusakan paling banyak berasal dari urutan 1 - 2 - 2 - 2. Yang menyebabkan tumpang tindih 2 detik menjadi pemain # 1 potensial. Namun, ini masih menguntungkan karena jika Anda tidak menggunakan mantra ketiga (mis. 1 - 2 - 2) Anda akan melakukan 880 kerusakan dengan 1 detik tersisa. Jika Anda menggunakan mantra # 2 ekstra Anda akan melakukan 1170 - 2 detik dari # 1 yaitu 200. Jadi 970 kerusakan adalah kerusakan relatif Anda.
sumber
Anda dapat melakukan case switch gaya "tingkat keamanan" sederhana.
Ini hanya di atas kepala saya jadi waspadalah terhadap kesalahan logika di luar tingkat kelelahan pikiran saya, tapi saya harap ini bisa membantu Anda memulai.
Dengan asumsi waktu Anda dilakukan dalam bilangan bulat blok -
Beberapa panggilan metode tidak perlu karena waktu ejaan Anda, tetapi selalu ada ruang untuk pembaruan dengan cara ini.
Sunting: Saya baru sadar, Anda perlu mengatur ulang waktu yang tersisa setelah mantra baru dilemparkan, mungkin yang terbaik untuk menjadikannya atribut kelas / bidang dan mengaturnya dari panggilan dalam metode castSpell.
sumber