1、首先點(diǎn)擊輸入下方的代碼:
創(chuàng)新互聯(lián)是專業(yè)的株洲網(wǎng)站建設(shè)公司,株洲接單;提供成都做網(wǎng)站、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行株洲網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
from goto import *
@patch
def f2():
goto(10)
2、然后輸入下方的代碼:
print 'should not see this'
label(10)
for i in range(1,99999):
print i
3、然后在輸入下方的代碼就完成了:
if i == 5:
goto('out')
label('out')
f2()
擴(kuò)展資料:
用法是:
1、from goto import *。注意暫時(shí)不支持import goto,
2、對(duì)需要使用goto的函數(shù),前面加個(gè)@patch
3、用label(x)和goto(x)的形式寫label和goto。x可以是數(shù)字或字符串。
goto模塊的代碼如下:
goto.py
想象一下,您有一個(gè)線性方程組和不等式系統(tǒng)。這樣的系統(tǒng)通常有許多可能的解決方案。線性規(guī)劃是一組數(shù)學(xué)和計(jì)算工具,可讓您找到該系統(tǒng)的特定解,該解對(duì)應(yīng)于某些其他線性函數(shù)的最大值或最小值。
混合整數(shù)線性規(guī)劃是 線性規(guī)劃 的擴(kuò)展。它處理至少一個(gè)變量采用離散整數(shù)而不是連續(xù)值的問題。盡管乍一看混合整數(shù)問題與連續(xù)變量問題相似,但它們?cè)陟`活性和精度方面具有顯著優(yōu)勢(shì)。
整數(shù)變量對(duì)于正確表示自然用整數(shù)表示的數(shù)量很重要,例如生產(chǎn)的飛機(jī)數(shù)量或服務(wù)的客戶數(shù)量。
一種特別重要的整數(shù)變量是 二進(jìn)制變量 。它只能取 零 或 一 的值,在做出是或否的決定時(shí)很有用,例如是否應(yīng)該建造工廠或者是否應(yīng)該打開或關(guān)閉機(jī)器。您還可以使用它們來模擬邏輯約束。
線性規(guī)劃是一種基本的優(yōu)化技術(shù),已在科學(xué)和數(shù)學(xué)密集型領(lǐng)域使用了數(shù)十年。它精確、相對(duì)快速,適用于一系列實(shí)際應(yīng)用。
混合整數(shù)線性規(guī)劃允許您克服線性規(guī)劃的許多限制。您可以使用分段線性函數(shù)近似非線性函數(shù)、使用半連續(xù)變量、模型邏輯約束等。它是一種計(jì)算密集型工具,但計(jì)算機(jī)硬件和軟件的進(jìn)步使其每天都更加適用。
通常,當(dāng)人們?cè)噲D制定和解決優(yōu)化問題時(shí),第一個(gè)問題是他們是否可以應(yīng)用線性規(guī)劃或混合整數(shù)線性規(guī)劃。
以下文章說明了線性規(guī)劃和混合整數(shù)線性規(guī)劃的一些用例:
隨著計(jì)算機(jī)能力的增強(qiáng)、算法的改進(jìn)以及更多用戶友好的軟件解決方案的出現(xiàn),線性規(guī)劃,尤其是混合整數(shù)線性規(guī)劃的重要性隨著時(shí)間的推移而增加。
解決線性規(guī)劃問題的基本方法稱為,它有多種變體。另一種流行的方法是。
混合整數(shù)線性規(guī)劃問題可以通過更復(fù)雜且計(jì)算量更大的方法來解決,例如,它在幕后使用線性規(guī)劃。這種方法的一些變體是,它涉及使用 切割平面 ,以及。
有幾種適用于線性規(guī)劃和混合整數(shù)線性規(guī)劃的合適且眾所周知的 Python 工具。其中一些是開源的,而另一些是專有的。您是否需要免費(fèi)或付費(fèi)工具取決于問題的規(guī)模和復(fù)雜性,以及對(duì)速度和靈活性的需求。
值得一提的是,幾乎所有廣泛使用的線性規(guī)劃和混合整數(shù)線性規(guī)劃庫都是以 Fortran 或 C 或 C++ 原生和編寫的。這是因?yàn)榫€性規(guī)劃需要對(duì)(通常很大)矩陣進(jìn)行計(jì)算密集型工作。此類庫稱為求解器。Python 工具只是求解器的包裝器。
Python 適合圍繞本機(jī)庫構(gòu)建包裝器,因?yàn)樗梢院芎玫嘏c C/C++ 配合使用。對(duì)于本教程,您不需要任何 C/C++(或 Fortran),但如果您想了解有關(guān)此酷功能的更多信息,請(qǐng)查看以下資源:
基本上,當(dāng)您定義和求解模型時(shí),您使用 Python 函數(shù)或方法調(diào)用低級(jí)庫,該庫執(zhí)行實(shí)際優(yōu)化工作并將解決方案返回給您的 Python 對(duì)象。
幾個(gè)免費(fèi)的 Python 庫專門用于與線性或混合整數(shù)線性規(guī)劃求解器交互:
在本教程中,您將使用SciPy和PuLP來定義和解決線性規(guī)劃問題。
在本節(jié)中,您將看到線性規(guī)劃問題的兩個(gè)示例:
您將在下一節(jié)中使用 Python 來解決這兩個(gè)問題。
考慮以下線性規(guī)劃問題:
你需要找到X和?使得紅色,藍(lán)色和黃色的不平等,以及不平等X 0和? 0,是滿意的。同時(shí),您的解決方案必須對(duì)應(yīng)于z的最大可能值。
您需要找到的自變量(在本例中為 x 和 y )稱為 決策變量 。要最大化或最小化的決策變量的函數(shù)(在本例中為 z) 稱為 目標(biāo)函數(shù) 、 成本函數(shù) 或僅稱為 目標(biāo) 。您需要滿足的 不等式 稱為 不等式約束 。您還可以在稱為 等式約束 的約束中使用方程。
這是您如何可視化問題的方法:
紅線代表的功能2 X + Y = 20,和它上面的紅色區(qū)域示出了紅色不等式不滿足。同樣,藍(lán)線是函數(shù) 4 x + 5 y = 10,藍(lán)色區(qū)域被禁止,因?yàn)樗`反了藍(lán)色不等式。黃線是 x + 2 y = 2,其下方的黃色區(qū)域是黃色不等式無效的地方。
如果您忽略紅色、藍(lán)色和黃色區(qū)域,則僅保留灰色區(qū)域?;疑珔^(qū)域的每個(gè)點(diǎn)都滿足所有約束,是問題的潛在解決方案。該區(qū)域稱為 可行域 ,其點(diǎn)為 可行解 。在這種情況下,有無數(shù)可行的解決方案。
您想最大化z。對(duì)應(yīng)于最大z的可行解是 最優(yōu)解 。如果您嘗試最小化目標(biāo)函數(shù),那么最佳解決方案將對(duì)應(yīng)于其可行的最小值。
請(qǐng)注意,z是線性的。你可以把它想象成一個(gè)三維空間中的平面。這就是為什么最優(yōu)解必須在可行區(qū)域的 頂點(diǎn) 或角上的原因。在這種情況下,最佳解決方案是紅線和藍(lán)線相交的點(diǎn),稍后您將看到。
有時(shí),可行區(qū)域的整個(gè)邊緣,甚至整個(gè)區(qū)域,都可以對(duì)應(yīng)相同的z值。在這種情況下,您有許多最佳解決方案。
您現(xiàn)在已準(zhǔn)備好使用綠色顯示的附加等式約束來擴(kuò)展問題:
方程式 x + 5 y = 15,以綠色書寫,是新的。這是一個(gè)等式約束。您可以通過向上一張圖像添加相應(yīng)的綠線來將其可視化:
現(xiàn)在的解決方案必須滿足綠色等式,因此可行區(qū)域不再是整個(gè)灰色區(qū)域。它是綠線從與藍(lán)線的交點(diǎn)到與紅線的交點(diǎn)穿過灰色區(qū)域的部分。后一點(diǎn)是解決方案。
如果插入x的所有值都必須是整數(shù)的要求,那么就會(huì)得到一個(gè)混合整數(shù)線性規(guī)劃問題,可行解的集合又會(huì)發(fā)生變化:
您不再有綠線,只有沿線的x值為整數(shù)的點(diǎn)。可行解是灰色背景上的綠點(diǎn),此時(shí)最優(yōu)解離紅線最近。
這三個(gè)例子說明了 可行的線性規(guī)劃問題 ,因?yàn)樗鼈兙哂杏薪缈尚袇^(qū)域和有限解。
如果沒有解,線性規(guī)劃問題是 不可行的 。當(dāng)沒有解決方案可以同時(shí)滿足所有約束時(shí),通常會(huì)發(fā)生這種情況。
例如,考慮如果添加約束x + y 1會(huì)發(fā)生什么。那么至少有一個(gè)決策變量(x或y)必須是負(fù)數(shù)。這與給定的約束x 0 和y 0相沖突。這樣的系統(tǒng)沒有可行的解決方案,因此稱為不可行的。
另一個(gè)示例是添加與綠線平行的第二個(gè)等式約束。這兩行沒有共同點(diǎn),因此不會(huì)有滿足這兩個(gè)約束的解決方案。
一個(gè)線性規(guī)劃問題是 無界的 ,如果它的可行區(qū)域是無界,將溶液不是有限。這意味著您的變量中至少有一個(gè)不受約束,可以達(dá)到正無窮大或負(fù)無窮大,從而使目標(biāo)也無限大。
例如,假設(shè)您采用上面的初始問題并刪除紅色和黃色約束。從問題中刪除約束稱為 放松 問題。在這種情況下,x和y不會(huì)在正側(cè)有界。您可以將它們?cè)黾拥秸裏o窮大,從而產(chǎn)生無限大的z值。
在前面的部分中,您研究了一個(gè)與任何實(shí)際應(yīng)用程序無關(guān)的抽象線性規(guī)劃問題。在本小節(jié)中,您將找到與制造業(yè)資源分配相關(guān)的更具體和實(shí)用的優(yōu)化問題。
假設(shè)一家工廠生產(chǎn)四種不同的產(chǎn)品,第一種產(chǎn)品的日產(chǎn)量為x ?,第二種產(chǎn)品的產(chǎn)量為x 2,依此類推。目標(biāo)是確定每種產(chǎn)品的利潤最大化日產(chǎn)量,同時(shí)牢記以下條件:
數(shù)學(xué)模型可以這樣定義:
目標(biāo)函數(shù)(利潤)在條件 1 中定義。人力約束遵循條件 2。對(duì)原材料 A 和 B 的約束可以從條件 3 和條件 4 中通過對(duì)每種產(chǎn)品的原材料需求求和得出。
最后,產(chǎn)品數(shù)量不能為負(fù),因此所有決策變量必須大于或等于零。
與前面的示例不同,您無法方便地將其可視化,因?yàn)樗兴膫€(gè)決策變量。但是,無論問題的維度如何,原理都是相同的。
在本教程中,您將使用兩個(gè)Python 包來解決上述線性規(guī)劃問題:
SciPy 設(shè)置起來很簡單。安裝后,您將擁有開始所需的一切。它的子包 scipy.optimize 可用于線性和非線性優(yōu)化。
PuLP 允許您選擇求解器并以更自然的方式表述問題。PuLP 使用的默認(rèn)求解器是COIN-OR Branch and Cut Solver (CBC)。它連接到用于線性松弛的COIN-OR 線性規(guī)劃求解器 (CLP)和用于切割生成的COIN-OR 切割生成器庫 (CGL)。
另一個(gè)偉大的開源求解器是GNU 線性規(guī)劃工具包 (GLPK)。一些著名且非常強(qiáng)大的商業(yè)和專有解決方案是Gurobi、CPLEX和XPRESS。
除了在定義問題時(shí)提供靈活性和運(yùn)行各種求解器的能力外,PuLP 使用起來不如 Pyomo 或 CVXOPT 等替代方案復(fù)雜,后者需要更多的時(shí)間和精力來掌握。
要學(xué)習(xí)本教程,您需要安裝 SciPy 和 PuLP。下面的示例使用 SciPy 1.4.1 版和 PuLP 2.1 版。
您可以使用pip以下方法安裝兩者:
您可能需要運(yùn)行pulptest或sudo pulptest啟用 PuLP 的默認(rèn)求解器,尤其是在您使用 Linux 或 Mac 時(shí):
或者,您可以下載、安裝和使用 GLPK。它是免費(fèi)和開源的,適用于 Windows、MacOS 和 Linux。在本教程的后面部分,您將看到如何將 GLPK(除了 CBC)與 PuLP 一起使用。
在 Windows 上,您可以下載檔案并運(yùn)行安裝文件。
在 MacOS 上,您可以使用 Homebrew:
在 Debian 和 Ubuntu 上,使用apt來安裝glpk和glpk-utils:
在Fedora,使用dnf具有g(shù)lpk-utils:
您可能還會(huì)發(fā)現(xiàn)conda對(duì)安裝 GLPK 很有用:
安裝完成后,可以查看GLPK的版本:
有關(guān)詳細(xì)信息,請(qǐng)參閱 GLPK 關(guān)于使用Windows 可執(zhí)行文件和Linux 軟件包進(jìn)行安裝的教程。
在本節(jié)中,您將學(xué)習(xí)如何使用 SciPy優(yōu)化和求根庫進(jìn)行線性規(guī)劃。
要使用 SciPy 定義和解決優(yōu)化問題,您需要導(dǎo)入scipy.optimize.linprog():
現(xiàn)在您已經(jīng)linprog()導(dǎo)入,您可以開始優(yōu)化。
讓我們首先解決上面的線性規(guī)劃問題:
linprog()僅解決最小化(而非最大化)問題,并且不允許具有大于或等于符號(hào) ( ) 的不等式約束。要解決這些問題,您需要在開始優(yōu)化之前修改您的問題:
引入這些更改后,您將獲得一個(gè)新系統(tǒng):
該系統(tǒng)與原始系統(tǒng)等效,并且將具有相同的解決方案。應(yīng)用這些更改的唯一原因是克服 SciPy 與問題表述相關(guān)的局限性。
下一步是定義輸入值:
您將上述系統(tǒng)中的值放入適當(dāng)?shù)牧斜怼⒃M或NumPy 數(shù)組中:
注意:請(qǐng)注意行和列的順序!
約束左側(cè)和右側(cè)的行順序必須相同。每一行代表一個(gè)約束。
來自目標(biāo)函數(shù)和約束左側(cè)的系數(shù)的順序必須匹配。每列對(duì)應(yīng)一個(gè)決策變量。
下一步是以與系數(shù)相同的順序定義每個(gè)變量的界限。在這種情況下,它們都在零和正無窮大之間:
此語句是多余的,因?yàn)閘inprog()默認(rèn)情況下采用這些邊界(零到正無窮大)。
注:相反的float("inf"),你可以使用math.inf,numpy.inf或scipy.inf。
最后,是時(shí)候優(yōu)化和解決您感興趣的問題了。你可以這樣做linprog():
參數(shù)c是指來自目標(biāo)函數(shù)的系數(shù)。A_ub和b_ub分別與不等式約束左邊和右邊的系數(shù)有關(guān)。同樣,A_eq并b_eq參考等式約束。您可以使用bounds提供決策變量的下限和上限。
您可以使用該參數(shù)method來定義要使用的線性規(guī)劃方法。有以下三種選擇:
linprog() 返回具有以下屬性的數(shù)據(jù)結(jié)構(gòu):
您可以分別訪問這些值:
這就是您獲得優(yōu)化結(jié)果的方式。您還可以以圖形方式顯示它們:
如前所述,線性規(guī)劃問題的最優(yōu)解位于可行區(qū)域的頂點(diǎn)。在這種情況下,可行區(qū)域只是藍(lán)線和紅線之間的綠線部分。最優(yōu)解是代表綠線和紅線交點(diǎn)的綠色方塊。
如果要排除相等(綠色)約束,只需刪除參數(shù)A_eq并b_eq從linprog()調(diào)用中刪除:
解決方案與前一種情況不同。你可以在圖表上看到:
在這個(gè)例子中,最優(yōu)解是紅色和藍(lán)色約束相交的可行(灰色)區(qū)域的紫色頂點(diǎn)。其他頂點(diǎn),如黃色頂點(diǎn),具有更高的目標(biāo)函數(shù)值。
您可以使用 SciPy 來解決前面部分所述的資源分配問題:
和前面的例子一樣,你需要從上面的問題中提取必要的向量和矩陣,將它們作為參數(shù)傳遞給.linprog(),然后得到結(jié)果:
結(jié)果告訴您最大利潤是1900并且對(duì)應(yīng)于x ? = 5 和x ? = 45。在給定條件下生產(chǎn)第二和第四個(gè)產(chǎn)品是沒有利潤的。您可以在這里得出幾個(gè)有趣的結(jié)論:
opt.statusis0和opt.successis True,說明優(yōu)化問題成功求解,最優(yōu)可行解。
SciPy 的線性規(guī)劃功能主要用于較小的問題。對(duì)于更大和更復(fù)雜的問題,您可能會(huì)發(fā)現(xiàn)其他庫更適合,原因如下:
幸運(yùn)的是,Python 生態(tài)系統(tǒng)為線性編程提供了幾種替代解決方案,這些解決方案對(duì)于更大的問題非常有用。其中之一是 PuLP,您將在下一節(jié)中看到它的實(shí)際應(yīng)用。
PuLP 具有比 SciPy 更方便的線性編程 API。您不必在數(shù)學(xué)上修改您的問題或使用向量和矩陣。一切都更干凈,更不容易出錯(cuò)。
像往常一樣,您首先導(dǎo)入您需要的內(nèi)容:
現(xiàn)在您已經(jīng)導(dǎo)入了 PuLP,您可以解決您的問題。
您現(xiàn)在將使用 PuLP 解決此系統(tǒng):
第一步是初始化一個(gè)實(shí)例LpProblem來表示你的模型:
您可以使用該sense參數(shù)來選擇是執(zhí)行最小化(LpMinimize或1,這是默認(rèn)值)還是最大化(LpMaximize或-1)。這個(gè)選擇會(huì)影響你的問題的結(jié)果。
一旦有了模型,就可以將決策變量定義為LpVariable類的實(shí)例:
您需要提供下限,lowBound=0因?yàn)槟J(rèn)值為負(fù)無窮大。該參數(shù)upBound定義了上限,但您可以在此處省略它,因?yàn)樗J(rèn)為正無窮大。
可選參數(shù)cat定義決策變量的類別。如果您使用的是連續(xù)變量,則可以使用默認(rèn)值"Continuous"。
您可以使用變量x和y創(chuàng)建表示線性表達(dá)式和約束的其他 PuLP 對(duì)象:
當(dāng)您將決策變量與標(biāo)量相乘或構(gòu)建多個(gè)決策變量的線性組合時(shí),您會(huì)得到一個(gè)pulp.LpAffineExpression代表線性表達(dá)式的實(shí)例。
注意:您可以增加或減少變量或表達(dá)式,你可以乘他們常數(shù),因?yàn)榧垵{類實(shí)現(xiàn)一些Python的特殊方法,即模擬數(shù)字類型一樣__add__(),__sub__()和__mul__()。這些方法用于像定制運(yùn)營商的行為+,-和*。
類似地,您可以將線性表達(dá)式、變量和標(biāo)量與運(yùn)算符 ==、=以獲取表示模型線性約束的紙漿.LpConstraint實(shí)例。
注:也有可能與豐富的比較方法來構(gòu)建的約束.__eq__(),.__le__()以及.__ge__()定義了運(yùn)營商的行為==,=。
考慮到這一點(diǎn),下一步是創(chuàng)建約束和目標(biāo)函數(shù)并將它們分配給您的模型。您不需要?jiǎng)?chuàng)建列表或矩陣。只需編寫 Python 表達(dá)式并使用+=運(yùn)算符將它們附加到模型中:
在上面的代碼中,您定義了包含約束及其名稱的元組。LpProblem允許您通過將約束指定為元組來向模型添加約束。第一個(gè)元素是一個(gè)LpConstraint實(shí)例。第二個(gè)元素是該約束的可讀名稱。
設(shè)置目標(biāo)函數(shù)非常相似:
或者,您可以使用更短的符號(hào):
現(xiàn)在您已經(jīng)添加了目標(biāo)函數(shù)并定義了模型。
注意:您可以使用運(yùn)算符將 約束或目標(biāo)附加到模型中,+=因?yàn)樗念怢pProblem實(shí)現(xiàn)了特殊方法.__iadd__(),該方法用于指定 的行為+=。
對(duì)于較大的問題,lpSum()與列表或其他序列一起使用通常比重復(fù)+運(yùn)算符更方便。例如,您可以使用以下語句將目標(biāo)函數(shù)添加到模型中:
它產(chǎn)生與前一條語句相同的結(jié)果。
您現(xiàn)在可以看到此模型的完整定義:
模型的字符串表示包含所有相關(guān)數(shù)據(jù):變量、約束、目標(biāo)及其名稱。
注意:字符串表示是通過定義特殊方法構(gòu)建的.__repr__()。有關(guān) 的更多詳細(xì)信息.__repr__(),請(qǐng)查看Pythonic OOP 字符串轉(zhuǎn)換:__repr__vs__str__ .
最后,您已準(zhǔn)備好解決問題。你可以通過調(diào)用.solve()你的模型對(duì)象來做到這一點(diǎn)。如果要使用默認(rèn)求解器 (CBC),則不需要傳遞任何參數(shù):
.solve()調(diào)用底層求解器,修改model對(duì)象,并返回解決方案的整數(shù)狀態(tài),1如果找到了最優(yōu)解。有關(guān)其余狀態(tài)代碼,請(qǐng)參閱LpStatus[]。
你可以得到優(yōu)化結(jié)果作為 的屬性model。該函數(shù)value()和相應(yīng)的方法.value()返回屬性的實(shí)際值:
model.objective持有目標(biāo)函數(shù)model.constraints的值,包含松弛變量的值,以及對(duì)象x和y具有決策變量的最優(yōu)值。model.variables()返回一個(gè)包含決策變量的列表:
如您所見,此列表包含使用 的構(gòu)造函數(shù)創(chuàng)建的確切對(duì)象LpVariable。
結(jié)果與您使用 SciPy 獲得的結(jié)果大致相同。
注意:注意這個(gè)方法.solve()——它會(huì)改變對(duì)象的狀態(tài),x并且y!
您可以通過調(diào)用查看使用了哪個(gè)求解器.solver:
輸出通知您求解器是 CBC。您沒有指定求解器,因此 PuLP 調(diào)用了默認(rèn)求解器。
如果要運(yùn)行不同的求解器,則可以將其指定為 的參數(shù).solve()。例如,如果您想使用 GLPK 并且已經(jīng)安裝了它,那么您可以solver=GLPK(msg=False)在最后一行使用。請(qǐng)記住,您還需要導(dǎo)入它:
現(xiàn)在你已經(jīng)導(dǎo)入了 GLPK,你可以在里面使用它.solve():
該msg參數(shù)用于顯示來自求解器的信息。msg=False禁用顯示此信息。如果要包含信息,則只需省略msg或設(shè)置msg=True。
您的模型已定義并求解,因此您可以按照與前一種情況相同的方式檢查結(jié)果:
使用 GLPK 得到的結(jié)果與使用 SciPy 和 CBC 得到的結(jié)果幾乎相同。
一起來看看這次用的是哪個(gè)求解器:
正如您在上面用突出顯示的語句定義的那樣model.solve(solver=GLPK(msg=False)),求解器是 GLPK。
您還可以使用 PuLP 來解決混合整數(shù)線性規(guī)劃問題。要定義整數(shù)或二進(jìn)制變量,只需傳遞cat="Integer"或cat="Binary"到LpVariable。其他一切都保持不變:
在本例中,您有一個(gè)整數(shù)變量并獲得與之前不同的結(jié)果:
Nowx是一個(gè)整數(shù),如模型中所指定。(從技術(shù)上講,它保存一個(gè)小數(shù)點(diǎn)后為零的浮點(diǎn)值。)這一事實(shí)改變了整個(gè)解決方案。讓我們?cè)趫D表上展示這一點(diǎn):
如您所見,最佳解決方案是灰色背景上最右邊的綠點(diǎn)。這是兩者的最大價(jià)值的可行的解決方案x和y,給它的最大目標(biāo)函數(shù)值。
GLPK 也能夠解決此類問題。
現(xiàn)在你可以使用 PuLP 來解決上面的資源分配問題:
定義和解決問題的方法與前面的示例相同:
在這種情況下,您使用字典 x來存儲(chǔ)所有決策變量。這種方法很方便,因?yàn)樽值淇梢詫Q策變量的名稱或索引存儲(chǔ)為鍵,將相應(yīng)的LpVariable對(duì)象存儲(chǔ)為值。列表或元組的LpVariable實(shí)例可以是有用的。
上面的代碼產(chǎn)生以下結(jié)果:
如您所見,該解決方案與使用 SciPy 獲得的解決方案一致。最有利可圖的解決方案是每天生產(chǎn)5.0第一件產(chǎn)品和45.0第三件產(chǎn)品。
讓我們把這個(gè)問題變得更復(fù)雜和有趣。假設(shè)由于機(jī)器問題,工廠無法同時(shí)生產(chǎn)第一種和第三種產(chǎn)品。在這種情況下,最有利可圖的解決方案是什么?
現(xiàn)在您有另一個(gè)邏輯約束:如果x ? 為正數(shù),則x ? 必須為零,反之亦然。這是二元決策變量非常有用的地方。您將使用兩個(gè)二元決策變量y ? 和y ?,它們將表示是否生成了第一個(gè)或第三個(gè)產(chǎn)品:
除了突出顯示的行之外,代碼與前面的示例非常相似。以下是差異:
這是解決方案:
事實(shí)證明,最佳方法是排除第一種產(chǎn)品而只生產(chǎn)第三種產(chǎn)品。
就像有許多資源可以幫助您學(xué)習(xí)線性規(guī)劃和混合整數(shù)線性規(guī)劃一樣,還有許多具有 Python 包裝器的求解器可用。這是部分列表:
其中一些庫,如 Gurobi,包括他們自己的 Python 包裝器。其他人使用外部包裝器。例如,您看到可以使用 PuLP 訪問 CBC 和 GLPK。
您現(xiàn)在知道什么是線性規(guī)劃以及如何使用 Python 解決線性規(guī)劃問題。您還了解到 Python 線性編程庫只是本機(jī)求解器的包裝器。當(dāng)求解器完成其工作時(shí),包裝器返回解決方案狀態(tài)、決策變量值、松弛變量、目標(biāo)函數(shù)等。
在Python中,lambda函數(shù)是一個(gè)簡單的匿名函數(shù)。該函數(shù)沒有函數(shù)名,它可以有多個(gè)參數(shù),但函數(shù)只由一個(gè)表達(dá)式構(gòu)成。
lambda函數(shù)具體的格式如下:
lambda 參數(shù) : 表達(dá)式
其中, lambda 是關(guān)鍵字, 參數(shù) 是函數(shù)的參數(shù),可以有0至多個(gè)。冒號(hào)后面是表達(dá)式,也是該函數(shù)中的唯一的表達(dá)式,lambda函數(shù)會(huì)返回該表達(dá)式的返回值。
我們來看一個(gè)具體的例子。
在上述代碼中,number1, number2是lambda函數(shù)的參數(shù),number1**2+number**2是函數(shù)的表達(dá)式,該函數(shù)返回number1, number2兩個(gè)數(shù)的平方和。
上述代碼創(chuàng)建了一個(gè)lambda函數(shù)后將其賦值給變量sum_square, 在print函數(shù)中通過sum_square來調(diào)用這個(gè)lambda函數(shù)。
上述的lambda函數(shù)完全可用標(biāo)準(zhǔn)的函數(shù)來實(shí)現(xiàn),我們可以將上述代碼改寫成下面的代碼。
在代碼中,定義了函數(shù)sum_square,該函數(shù)包含兩個(gè)參數(shù),并執(zhí)行一條語句并將該語句的執(zhí)行結(jié)果作為函數(shù)返回值。通過上述代碼可以幫助我們更直觀地理解lambda函數(shù)。
lambda函數(shù)的可讀性較差,那么為什么要有這樣奇怪的匿名函數(shù)呢?這個(gè)要從lambda的使用場合說起。我們來看下面的代碼。
上述代碼定義了一個(gè)數(shù)值列表,調(diào)用python的內(nèi)置函數(shù)filter來生成一個(gè)新的迭代器。 filter函數(shù)的第一個(gè)參數(shù)為一個(gè)函數(shù),用于決定過濾的方法;第二個(gè)參數(shù)為一個(gè)可迭代的對(duì)象如列表、集合等。filter函數(shù)返回一個(gè)新的迭代器, 用于獲得滿足第一個(gè)函數(shù)為真的所有元素。在上述代碼中,我們給filter傳遞的第一個(gè)參數(shù)是一個(gè)匿名函數(shù):lambda number:number%3==0, 該函數(shù)在一個(gè)數(shù)整除3時(shí)為True,否則為False. filter函數(shù)會(huì)創(chuàng)建一個(gè)新的迭代器,通過調(diào)用上述匿名函數(shù)來判斷該元素是否滿足條件,得到所有3的倍數(shù)的數(shù)。
當(dāng)然,上述代碼也可以使用正常的函數(shù)方式來實(shí)現(xiàn),如下所示:
我們可以看到,所有匿名函數(shù)的功能都可以通過標(biāo)準(zhǔn)函數(shù)來實(shí)現(xiàn)。匿名函數(shù)常在調(diào)用其它函數(shù)(如filter, map等)時(shí)作為參數(shù)使用。使用匿名函數(shù)可以使代碼更為精簡。匿名函數(shù)主要用于完成簡單的任務(wù),如果匿名函數(shù)過于復(fù)雜,會(huì)導(dǎo)致可讀性較差,調(diào)試起來也比較困難,因此,強(qiáng)烈不建議使用lambda寫天書般的代碼??傊?,要根據(jù)實(shí)際情況決定是否使用匿名函數(shù)。
頭插,從鏈表的頭部插入一個(gè)節(jié)點(diǎn),依次類推。中插,就是給定任意位置(index),然后插入該節(jié)點(diǎn)。尾插就是從鏈表的尾部依次插入節(jié)點(diǎn)Node
4
開始遍歷此鏈表
15
14
13
12
鏈表遍歷已經(jīng)結(jié)束
None
開始遍歷此鏈表
15
14
111
13
12
鏈表遍歷已經(jīng)結(jié)束
None
開始遍歷此鏈表
111
15
14
111
13
12
鏈表遍歷已經(jīng)結(jié)束
None
開始遍歷此鏈表
111
111
15
14
111
13
12
鏈表遍歷已經(jīng)結(jié)束
None
網(wǎng)頁標(biāo)題:包含python鏈?zhǔn)綏l件函數(shù)的詞條
當(dāng)前網(wǎng)址:http://jinyejixie.com/article44/hsesee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、小程序開發(fā)、域名注冊(cè)、全網(wǎng)營銷推廣、商城網(wǎng)站、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)