Excel Solver: mendefinisikan kendala menjadi nol ATAU lebih besar dari

2

Saya membuat model untuk mengoptimalkan pesanan pembelian.

Jumlah yang dipesan harus lebih besar dari 500 atau sama dengan nol.

Bagaimana cara saya mendefinisikan batasan seperti itu di Solver?

Saya mencoba batasan biner dan saya juga mencoba beberapa formula berbeda tetapi sepertinya tidak ada yang berhasil.

Pada dasarnya saya harus bisa berekspresi OR di Solver, bagaimana saya melakukannya?

EDIT: di tautan berikut Anda dapat melihat file excel yang saya gunakan: Klik disini

Nuno Nogueira
sumber
File yang Anda tautkan untuk memunculkan tanda peringatan yang mungkin akan segera dihapus dan memerlukan masuk. SU adalah basis pengetahuan dan konsep dasarnya adalah bahwa orang berkontribusi T&J; Karena itu akan bertahan lama dan membantu orang lain dengan masalah yang sama. Jika file yang ditautkan penting untuk pertanyaan Anda, elemen-elemen penting harus dimasukkan ke dalam pertanyaan secara permanen yang dapat diakses oleh setiap pembaca.
fixer1234

Jawaban:

2

Jadi 0 diizinkan, 1 tidak diizinkan, 499 tidak diizinkan, dan 501 diizinkan? Tampak seperti area yang tidak bersebelahan. Jadi itu bukan masalah optimasi murni tetapi juga semacam masalah kombinatorial. Saya khawatir Solver tidak bisa menangani ini.

Anda harus menganalisis dua kasus penggunaan secara terpisah:

  • Jumlahnya nol (nilai tetap, perhitungan sederhana);
  • Jumlahnya 500 atau lebih besar (mengoptimalkan di Solver menggunakan kendala & gt; = 500);

dan kemudian membandingkan dua kasus ini menggunakan rumus IF.


EDIT:

Saya mencoba menggunakan batasan "biner" dan "integer" seperti yang disarankan Karl tetapi tidak berhasil.

  • Buat variabel biner 0-1 dan variabel kontinu & gt; = 500, lalu gunakan IF untuk menyalin variabel kontinu atau menulis 0 ke nilai pembelian
  • Buat variabel biner 0-1 dan variabel kontinu & gt; = 500, lalu hitung pembelian sebagai produk mereka
  • Buat variabel integer & gt; = 499, lalu gunakan IF untuk mengganti 499 dengan 0 untuk nilai pembelian

Dalam semua kasus, hasilnya seringkali salah dan tergantung pada kondisi awal. Rupanya Solver tidak suka hal-hal seperti itu.

Kemudian saya berpikir untuk menerapkan proposal saya di atas ke enam nilai pembelian, dan mengoptimalkannya secara mandiri, misalnya, dengan mengoptimalkan jumlah biaya untuk semua bulan. Tetapi ternyata mereka tidak independen: persediaan pembukaan tergantung pada bulan sebelumnya, dan pembelian optimal untuk sebulan tergantung pada apakah pembelian dilakukan pada bulan sebelumnya. Jadi, tidak mungkin menambahkan IF sederhana ke setiap bulan.

Yang terbaik yang bisa saya lakukan adalah sebagai berikut.

Saya menambahkan variabel biner 0-1 dan variabel kontinu & gt; = 500, dan menghitung pembelian setiap bulan menggunakan IF. Tapi saya hanya mengoptimalkan variabel kontinu menggunakan Solver. Variabel biner adalah parameter. Yaitu, kami memilih bulan saat pembelian akan dilakukan, kemudian menggunakan Solver untuk menghitung nilai pembelian ini, dan kemudian mencatat total biaya yang dihasilkan.

Ini harus diulang untuk semua kombinasi pembelian dan non-pembelian. Jumlah kombinasi ini adalah 2 6 = 64. Tetapi sebenarnya, jika Anda tidak membeli apa pun di bulan Januari, Anda berakhir dengan persediaan penutupan negatif yang tidak diperbolehkan. Jadi hanya ada 32 kombinasi yang valid. Saya menambahkan rumus untuk menghitung nilai biner dari indeks kombinasi, mengulangi indeks 32 kali, meluncurkan Solver setiap kali dengan tangan dan menyalin hasilnya "hanya sebagai nilai" untuk setiap kombinasi.

Hasilnya adalah biaya minimum adalah 4 625,00 € dan ada dua kombinasi untuk mencapai nilai ini.

Ini adalah file yang diunggah ke Google Documents, dengan tangkapan layar Solver.

Meluncurkan Solver berkali-kali dengan tangan itu membosankan, saya percaya ini bisa diotomatisasi menggunakan makro.

Goblin Alchemist
sumber
Terima kasih, ini adalah masalah umum di banyak perusahaan, saya tidak percaya pemecah tidak bisa menanganinya: pemasok meminta jumlah pembelian minimum, itu saja. Jika Anda punya waktu, silakan lihat pertanyaan saya yang diedit di atas, tempat saya memposting tautan ke file yang saya gunakan. Terima kasih.
Nuno Nogueira
@NunoNogueira, silakan lihat edit saya. Ternyata jawaban yang benar adalah 4 625,00 €
Goblin Alchemist
Terima kasih banyak, ini adalah solusi yang rumit untuk masalah umum, saya mencari alternatif untuk solver. Ngomong-ngomong, Anda sepertinya melakukannya dengan benar sehingga saya menerima jawaban Anda.
Nuno Nogueira
1

Buat variabel biner dengan menambahkan batasan yang menyatakan bahwa nilai variabel (dalam fungsi tujuan) adalah biner. Koefisien variabel ini dalam fungsi tujuan harus 0. maka Anda menambahkan batasan berikut seperti yang biasa Anda lakukan:

-500B + X & gt; = 0 (tidak pernah di bawah 500)

-MB + X & lt; = 0 (dikombinasikan dengan gaya kendala sebelumnya 0 saat B adalah 0)

B = Variabel biner1

M = Angka positif yang sangat besar (Lebih besar dari X yang pernah ada)

X = variabel kontinu

[Sunting]

Saya mengerti Anda ingin melakukan sesuatu seperti ini (saya juga membuat beberapa perubahan pada file sheet Anda, tetapi saya tidak dapat membagikan file excel yang saya kerjakan di sini):

enter image description here

Karl
sumber
Terima kasih, itu terdengar seperti penjelasan yang masuk akal, meskipun saya tidak dapat mengimplementasikannya. Dalam pertanyaan saya di atas, saya menambahkan file yang saya gunakan, jika Anda punya waktu, dapatkah Anda melihatnya? Terima kasih banyak!
Nuno Nogueira
Hai, terima kasih banyak atas upaya Anda membantu saya! Ini lebih masuk akal sekarang, meskipun masalahnya belum terpecahkan: persyaratan minimum 500 per pesanan tidak terpenuhi.
Nuno Nogueira
Saya rasa saya mengerti: batasan C5 & lt; = C14 * C16 harus: C5 & lt; = C14 * C16 + C15. Sama untuk yang berikut ini.
Nuno Nogueira
Saya mendapatkan hasil yang layak (dan saya percaya optimal) tanpa mengubah batasan seperti yang Anda katakan: Membuka inventaris 450 50 100 425 50 Pembelian 800 0 500 725 0 500 Penjualan 350 400 450 400 375 250 Menutup inventaris 450 50 100 425 50 300 Memegang biaya 1250 500 650 1250 475 850 Total biaya 4975
Karl
1
@NunoNogueira, harap berhati-hati karena solusi ini mungkin tidak berfungsi. Saya melakukan beberapa percobaan pada masalah sederhana dengan solusi yang jelas, dan formula nonlinear seperti itu memberikan hasil yang salah yang tergantung pada kondisi awal. Menambahkan variabel tambahan dengan batasan "biner" dan mengalikannya, atau menambahkan perbandingan "JIKA", juga tidak berfungsi dengan baik. Rupanya Solver tidak suka diskontinuitas, dan juga mencampur variabel biner dan kontinu ...
Goblin Alchemist