LINDO
LINDO
LINDO(Linear, INteractive, and Discrete Optimizer)是一個解決二次線性整數規劃問題的方便而強大的工具。這些問題主要出現在商業、工業、研究和政府等領域。
什麼是LINDO
LINDO
已被證實LINDO能在商業、工業、研究和政府等領域發揮巨大作用的具體事務包括:產品分銷、成分混合、生產與個人事務安排、存貨管理……在這裡不一一列舉,但可以肯定的是,LINDO可以大展拳腳的領域是多不勝數的。LINDO的主要設計原則是,如果一個用戶只是想解決一個簡單的問題,就不應該在學習LINDO的基本特性上花費太多的準備成本。例如,某個用戶想解決以下這樣一個問題:(看懂這個問題需要一定的運籌學知識,下面是一個實際問題的數學模型)
Maximize 2X + 3Y
Subject to
4X + 3Y < 10
3X + 5Y < 12
那麼,用戶就只需要打開LINDO,然後直接輸入以上內容即可。而另一方面,LINDO也可以用來解決一些複雜的二次線性整數規劃方面的實際問題。如在大型的機器上,LINDO被用來解決一些擁有超過50,000個約束條件和200,000萬個變數的大規模複雜問題。
LINDO主要有三個基本使用模式。對於一些中小規模的問題,LINDO只要通過鍵盤輸入就可以方便地實現交互性良好的操作與使用,如輸入一個模型是相當簡單方便的事情。另外,LINDO也可以對外建文件進行處理,只要這些文件里包含有必要的命令代碼和輸入數據,處理后就可以生成用於報告目的的文檔。最後,你還可以自建子程序,然後直接與LINDO相結合形成一個包括你自己的代碼和LINDO本身的優化庫的綜合程序。
現在讓我們用例子來說明怎樣輸入和求解一個模型。當我們打開LINDO后,屏幕將出現以下窗口:
在外面標題為"LINDO"的是主窗口,它包含所有的其他窗口以及所有命令菜單和工具欄。在裡面的是一個新的空白的模型窗口,等下我們就會在那裡直接輸入一個簡單的範例模型,但在此之前,我們首先需要簡明地了解一下一個LINDO模型所必須具備的基本條件和要素。
一個LINDO模型至少需要具備三個要素:目標、決策變數和約束條件。
第一個基本要素是目標,顧名思義,是指一個問題解決后所要達到的目標。有兩種目標可選擇:MAX或MIN,也就是最大化或最小化。在一個典型的經濟問題里,你可能想使你的獲利最大化或成本最小化。因此,LINDO模型里的第一個字必須是MAX或是MIN。然後,在其後輸入的一個式子就叫做目標函數。現在假設要使利益最大化,就需要輸入:MAX 10X + 15Y,然後回車。
那麼,X和Y又是什麼呢?他們是第二個要素:模型里的決策變數,LINDO就是通過調整這些變數的值,使你的利益達到最大化。它們可以表示兩種產品的銷售量,或者兩個不同公司的銷售量。在這裡每單位X(產品)的毛利是10,Y的是15。他們是變數,在LINDO里,從開始使用他們的時候起,他們就存在。目標和變數就講這麼多。
現在讓我們來看一下約束條件。在某種意義上,約束條件是我們所建立的模型中最重要的部分,它們需要認真地考慮。
在前面的例子里,我們打算使式子10X + 15Y的值最大,但對X和Y能賣出多少卻沒有加以限制,這當然不可能,因為在現實世界里會存在諸如勞動產出和有效性等限制因素。所以我們會把X和Y的值限制在一個合理的範圍之內而不是任其隨意地取值。於是我們需要在模型的另外一行里輸入"SUBJECT TO"字樣(或者可以只輸入ST),跟著在後面分行輸入X < 10 和 Y < 12。有一點值得注意的是,LINDO會將"<"符號理解為小於或等於而不是絕對的小於。如果你喜歡的話,你可以用"<="來代替"<"。
很好,我們已經對X和Y加以限制了。再假設我們只有有限的勞動力,如16單位的勞動力,產品X需要一個單位而Y需要兩個單位。現在我們繼續加上一條約束條件:X + 2 Y < 16。最後,我們在另一行加上END字樣以表明約束條件的結束。這時,建立后的模型應該就是下面這個樣子:
這樣我們就建立了一個簡單的模型,下面我們可以開始求解了。從Solve菜單選擇Solve命令,或者在窗口頂部的工具欄里按Solve按鈕,LINDO就會開始對模型進行編譯。首先,LINDO會檢查模型是否具有數學意義以及是否符合語法要求。如果模型不能通過這一步檢查,會看到以下報錯信息:An error occurred during compilation on line: n(產生錯誤的行數),LINDO會自動跳轉到發生錯誤的行。我們就可以檢查該行的語法錯誤並改正過來。
通過這一檢查階段后,LINDO就會正式開始求解,這由一個叫LINDO solver的處理器完成。當solver初始化時,會在屏幕上顯示一個狀態窗口,如下圖所示:這個狀態窗口可以顯示solver的進度,下表是對各項數據/控制按鈕的說明:
數據項/控制 | 說明 |
Status | 給出當前解決方案的狀態,可能的值包括:Optimal(最優的), Feasible(可行的), Infeasible(不可行的),Unbounded(未定的) |
Iterations | solver的重複次數 |
Infeasibility | 多餘或錯誤約束條件數量 |
Objective | 目標函數的當前值 |
Best IP | 標示得到最優整數解決方案值,該項只出現在IP(整數規劃)模型。 |
IP Bound | IP模型中目標的理論範圍 |
Branches | 由LINDO IP solver分生出來的整型變數個數 |
Elapsed Time | solver啟動后所經過時間 |
Update Interval | 狀態窗口更新周期(秒)。你可以把這個值設成任何一個非負數,如果把它設成零的話很可能會增加求解時間。 |
Interrupt Solver | 按下該按鈕,solver將立刻停止並返回當前得到的最優解。 |
Close | 按下該按鈕關閉狀態窗口,solver繼續運行。狀態窗口可以通過選取相應命令重新打開。 |
當solver完成優化過程后將會提示你是否要進行靈敏度和範圍分析(都是運籌學裡面的術語)。隨著運籌學學習的深入,以後我們會用到這個有用的信息的,但現在我們先按下"No"按鈕關閉狀態窗口。
現在,屏幕將會出現一個名為"Reports Window"的窗口。這個窗口裡顯示的就是LINDO的輸出結果報告,它可以顯示64,000個字元的信息。如果有需要,LINDO會從頂部開始刷除部分輸出以騰出空間來顯示新的輸出。如果你有一個很長的解決方案報告,需要完整地進行閱讀使用,你可以把這些信息從Reports Window寫到另外一個磁碟文件里,方法是選取File|Log Output命令,快捷鍵是F10,然後你就可以找到該文件進行閱讀使用。
還是回到我們的例子,Reports Window里顯示的是模型的最優解決方案,如下所示:
按照順序,報告首先告訴我們LINDO進行了兩次運算后求出該解;跟著是在約束條件的約束下我們可以得到的最大利潤是145;這時X和Y分別取值10和3。值得注意的是,利潤似乎更高的產品Y在這裡居然用得比較少,這是因為我們前面所假設的勞動力供給的限制在起作用,在這裡就很好地證明了運籌學的強大作用,使我們不至於因為一些表面現象而作出錯誤的決策。
lindo當前最新版本為8.0 beta。