我正在創建一個模型來優化採購訂單。
訂購數量必須大於 500 或等於 0。
如何在 Solver 中定義這樣的約束?
我嘗試了二元約束,也嘗試了幾個不同的公式,但似乎沒有任何效果。
基本上我需要能夠OR
在 Solver 中表達,我該怎麼做?
編輯:在以下連結中您可能會看到我正在使用的 Excel 檔案: 點這裡
答案1
那麼0是允許的,1是不允許的,499是不允許的,501是允許的?看起來像是一個不連續的區域。所以這不是一個純粹的最佳化問題,而是一種組合問題。恐怕 Solver 無法處理這個問題。
您應該分別分析兩個用例:
- 金額為零(固定值,計算簡單);
- 數量為 500 或更大(在規劃求解中使用限制 >=500 進行最佳化);
然後使用 IF 公式比較這兩種情況。
編輯:
我嘗試按照卡爾的建議使用“二進制”和“整數”約束,但它們不起作用。
- 建立一個二進位變數 0-1 和一個 >=500 的連續變量,然後使用 IF 複製連續變數或將 0 寫入購買值
- 建立一個二元變數 0-1 和一個連續變數 >=500,然後計算購買量作為它們的乘積
- 建立一個 >=499 的整數變量,然後使用 IF 將 499 替換為 0 作為購買值
在所有情況下,結果常常是錯誤的並且取決於初始條件。顯然 Solver 不喜歡這樣的事。
然後我考慮將我的上述建議應用於所有六個購買值,並獨立優化它們,例如,透過優化所有月份的成本總和。但事實證明它們並不是獨立的:期初庫存取決於上個月,而一個月的最優採購取決於上個月是否進行了採購。所以不可能為每個月添加一個簡單的 IF。
我能做的最好的事情如下。
我新增了一個二元變數 0-1 和一個連續變數 >=500,並使用 IF 計算了每個月的購買量。但我使用求解器僅優化了連續變數。二進制變數是一個參數。也就是說,我們選擇進行購買的月份,然後使用規劃解算器計算這些購買的價值,然後記下最終的總成本。
對於購買和非購買的所有組合都應重複此操作。這些組合的數量為2 6 =64。但實際上,如果你在一月不購買任何東西,你最終會得到負的期末庫存,這是不允許的。所以只有 32 種有效組合。我添加了公式來計算組合索引的二進位值,迭代索引 32 次,每次手動啟動求解器,並為每個組合「僅作為值」複製結果。
結果是最低成本為 4 625,00 €,有兩種組合可以達到該值。
這是上傳到 Google Docs 的文件,以及 Solver 螢幕截圖。
手動多次啟動 Solver 很乏味,我相信它可以使用巨集自動化。