必威电竞|足球世界杯竞猜平台

LINDO
來源:互聯網

LINDO(Linear, INteractive, and Discrete Optimizer)是一個解決二次線性整數規劃問題的方便而強大的工具。這些問題主要出現在商業、工業、研究和政府等領域。

簡介

什么是LINDO

在這里有必要先讓大家知道什么是運籌學。運籌學是近四十年來發展起來的一門新興學科。它的目的是 為行政管理人員在作決策時提供科學的依據。因此,它是實現管理現代化的有力工具。運籌學在生產管理、工程技術、軍事作戰、科學試驗、財政經濟以及社會科學中都得到了極為廣泛的應用。講到這里,你已經被運籌學深深吸引了吧,至于你會怎么去學不是我們討論的問題,在這里我們只說學運籌學要用到的工具。應用運籌學去處理問題有兩個重要特征:一是從全局的觀點出發;二是通過建立模型如數學模型或模擬模型,對于要求解的問題得到最合理的決策。好了,說到這里,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的進度,下表是對各項數據/控制按鈕的說明:

當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。

參考資料 >

生活家百科家居網