濮阳杆衣贸易有限公司

主頁 > 知識庫 > 淺談Python數(shù)學(xué)建模之整數(shù)規(guī)劃

淺談Python數(shù)學(xué)建模之整數(shù)規(guī)劃

熱門標(biāo)簽:無錫客服外呼系統(tǒng)一般多少錢 梅州外呼業(yè)務(wù)系統(tǒng) 北京電信外呼系統(tǒng)靠譜嗎 百度地圖標(biāo)注位置怎么修改 老人電話機器人 大連crm外呼系統(tǒng) 地圖標(biāo)注視頻廣告 洪澤縣地圖標(biāo)注 高德地圖標(biāo)注是免費的嗎

一、從線性規(guī)劃到整數(shù)規(guī)劃

1.1、為什么會有整數(shù)規(guī)劃?

線性規(guī)劃問題的最優(yōu)解可能是分?jǐn)?shù)或小數(shù)。整數(shù)規(guī)劃是指變量的取值只能是整數(shù)的規(guī)劃。

這在實際問題中很常見,例如車間人數(shù)、設(shè)備臺數(shù)、行駛次數(shù),這些變量顯然必須取整數(shù)解。

根據(jù)對變量的不同情況,整數(shù)規(guī)劃又可以分為:

  • 完全整數(shù)規(guī)劃,全部變量都要求是整數(shù);
  • 混合整數(shù)規(guī)劃,部分變量要求是整數(shù);
  • 0-1整數(shù)規(guī)劃,變量的取值只能是 0 或 1;
  • 混合0-1規(guī)劃,部分變量的取值只能是 0 或 1。

0-1整數(shù)規(guī)劃 是非常重要也非常特殊的整數(shù)規(guī)劃,需要在另外的文章進(jìn)行討論。

1.2、四舍五入就能得到整數(shù)解嗎?

整數(shù)規(guī)劃問題與線性規(guī)劃問題的區(qū)別只是增加了整數(shù)約束。這看上去好像只要把線性規(guī)劃得到的非整數(shù)解舍入化整,就可以得到整數(shù)解,并不是多么復(fù)雜的問題。

但是問題并沒有這么簡單?;蟮慕獠粌H不一定是最優(yōu)解,甚至不一定是可行解的——線性規(guī)劃的最優(yōu)解,取整后可能就不滿足約束條件了。

那么,不要按四舍五入取整,而是向滿足約束條件的方向取整,是不是就可以呢?這是很好的想法,通常這樣可以獲得可行解,但卻不一定是最優(yōu)解了。

因此,整數(shù)規(guī)劃問題比線性規(guī)劃復(fù)雜的多,以至于至今還沒有通用的多項式解法,也就是說算法復(fù)雜度與問題規(guī)模成指數(shù)關(guān)系(NP問題)。還沒有意識到與問題規(guī)模指數(shù)關(guān)系意味著什么嗎?就是那個在象棋棋盤上放麥子,每格比前一格加倍的故事。

問題區(qū)別一點點,難度卻相差千萬里。小白與學(xué)霸,差距其實并不大。

二、整數(shù)規(guī)劃的求解方法

2.1、分支定界法(Branch and bound)

分支定界法的基本思想是把原問題(整數(shù)規(guī)劃問題)轉(zhuǎn)換為一個個線性規(guī)劃問題來處理,并在求解這些線性規(guī)劃問題的過程中不斷追蹤原問題的上界(最優(yōu)可行解)和下界(最優(yōu)線性松弛解)。

分支定界法把全部可行解空間反復(fù)地分割為越來越小的子集,稱為分枝;并且對每個子集內(nèi)的解集計算一個目標(biāo)上界,稱為定界。每次分枝后,對于超出已知可行解集目標(biāo)值的那些子集不再進(jìn)一步分枝,就可以刪減很多子集,這稱為剪枝。

數(shù)學(xué)課代表的說法是:設(shè)有最大化的整數(shù)規(guī)劃問題 A,先解與之相應(yīng)的線性規(guī)劃問題 B,若 B 的最優(yōu)解不符合 A 的整數(shù)條件,則 B 的最優(yōu)目標(biāo)函數(shù)必是 A 的最優(yōu)目標(biāo)函數(shù) z 的上界,記為 z2,而 A 的任意可行解的目標(biāo)函數(shù)值將是 z 的一個下界 z1。分支定界法就是將 B 的可行域分成子區(qū)域(分支)的方法,逐步減小 z2 和增大 z1,最終求到 z*。

分支定界法是一個迭代算法,隨著迭代過程不斷更新上界和下界,直到上界和下界非常接近時結(jié)束。通常設(shè)置 Gap 0.1%,就可把當(dāng)前的最優(yōu)可行解近似為問題的全局最優(yōu)解了。因此,分支定界法的“收斂” 不是分析意義上的而是算法意義上的,優(yōu)化結(jié)果是近似解而不是精確解。

分支定界法不用區(qū)分完全整數(shù)規(guī)劃與混合整數(shù)規(guī)劃,算法便于實現(xiàn),但計算量比較大。

2.2、割平面法(Cutting plane)

割平面法的基本思路是先求解普通線性規(guī)劃問題的最優(yōu)解,再對非整數(shù)解添加約束條件使可行域縮小,如此反復(fù)求解添加了約束條件的普通線性規(guī)劃問題,直到得到整數(shù)解。

也就是說,先不考慮整數(shù)約束條件,直接求解松弛問題的最優(yōu)解,如果滿足整數(shù)條件就結(jié)束了,如果不滿足整數(shù)條件,就在此非整數(shù)解的基礎(chǔ)上增加新的約束條件重新求解。這個新增加的約束條件稱為割平面,對松弛問題的可行域割一刀,割去松弛問題的部分非整數(shù)解。經(jīng)過有限次的反復(fù)切割,必定可在縮小的可行域的一個整數(shù)極點上達(dá)到整數(shù)規(guī)劃問題的最優(yōu)解 。

割平面法的計算量比較小,但對問題的結(jié)構(gòu)及求解的要求較高,算法比較復(fù)雜。

2.3、整數(shù)規(guī)劃的編程方案

在各種算法的介紹和評價中,有時會說“算法比較簡單,編程比較容易”。對此小白千萬不要當(dāng)真。不論分支定界法還是割平面法,小白不要說自己按照算法步驟一步步編程實現(xiàn),就是給你現(xiàn)成的程序估計你也看不懂的。這很正常,就算大神也沒幾個人能看懂哪怕是自己寫出來的算法。

但是如果給你程序也不會使用,那就是問題了。不幸的是,這是數(shù)學(xué)建模學(xué)習(xí)和參賽中經(jīng)常遇到的問題:有了調(diào)試好的程序,例程運行結(jié)果也正常,但換個問題仍然不會使用。

這并不是你的錯。程序有漏洞,接口不標(biāo)準(zhǔn),文檔對不上,教程說不清,這就是你所拿到的例程。你的錯誤,是選擇了這樣的例程,或者說選擇了這樣的編程方案。

這也是本系列教程希望解決的問題。就拿線性規(guī)劃、整數(shù)規(guī)劃來說,算法還不是很復(fù)雜,第三方軟件包也很豐富。但是,Scipy 只能求解線性規(guī)劃,不能求解整數(shù)規(guī)劃,如果選擇 Scipy 做線性規(guī)劃,那在學(xué)整數(shù)規(guī)劃時就要再學(xué)另一種工具包,二者的模型描述、函數(shù)定義、參數(shù)設(shè)置肯定也是不同的。接下來遇到非線性規(guī)劃問題再學(xué)一種軟件包,最后別說熟練掌握算法函數(shù),連什么時候該用哪個 工具包都搞暈了。

閑話少說,我們還是用上節(jié)求解線性規(guī)劃問題的 PuLP 工具包。

三、PuLP 求解整數(shù)規(guī)劃問題

我們不僅繼續(xù)用 PuLP 工具包,而且解題過程和編程步驟也與求解線性規(guī)劃問題完全一致。

下面我們以一個簡單的數(shù)學(xué)模型練習(xí),來講解整個解題過程,而不僅給出例程。

3.1、案例問題描述

例題 1:

某廠生產(chǎn)甲乙兩種飲料,每百箱甲飲料需用原料 6千克、工人 10名,獲利 10萬元;每百箱乙飲料需用原料 5千克、工人 20名,獲利 9萬元。

今工廠共有原料 60千克、工人 150名,又由于其他條件所限甲飲料產(chǎn)量不超過8百箱。

問題 1:問如何安排生產(chǎn)計劃,即兩種飲料各生產(chǎn)多少使獲利最大?

問題 2:若投資0.8萬元可增加原料1千克,是否應(yīng)作這項投資?投資多少合理?

問題 3:若不允許散箱(按整百箱生產(chǎn)),如何安排生產(chǎn)計劃,即兩種飲料各生產(chǎn)多少使獲利最大?

問題 4:若不允許散箱(按整百箱生產(chǎn)),若投資0.8萬元可增加原料1千克,是否應(yīng)作這項投資?投資多少合理?

3.2、建模過程分析

線性規(guī)劃和整數(shù)規(guī)劃類的問題的建模和求解,通常可以按問題定義、模型構(gòu)建、模型求解的步驟進(jìn)行。

3.2.1、問題定義

問題定義, 確定決策變量、目標(biāo)函數(shù)和約束條件。

1.決策變量是問題中可以在一定范圍內(nèi)進(jìn)行變化而獲得不同結(jié)果的變量。

對于問題 1,問題描述中說的很明確,希望通過改變甲、乙兩種飲料的產(chǎn)量使總利潤最大,甲、乙兩種飲料的產(chǎn)量就是決策變量。

對于問題 2 則要注意,如果只看前一句,就是比較問題 1 與問題 2 的利潤,還是把甲、乙兩種飲料的產(chǎn)量作為決策變量。但要回答后一句“投資多少合理”,這就出現(xiàn)了一個新的變量“投資額”,因此對問題 2 要建立 3個決策變量:甲產(chǎn)量、乙產(chǎn)量和投資額。

2.目標(biāo)函數(shù)是決策變量的函數(shù),我們希望通過改變決策變量的值而獲得目標(biāo)函數(shù)的最大值或最小值,通常是總成本(最?。?、總利潤(最大)、總時間(最短)。

對于本案例,每個問題都是希望獲得最大利潤,目標(biāo)函數(shù)都是總利潤,問題是求目標(biāo)函數(shù)即總利潤的最大值。

3.約束條件是決策變量所要滿足的限制條件。

約束條件 3 種情況:

一是不等式約束,例如題目指出共有原料 60千克、工人 150名,因此生產(chǎn)計劃所用的原料、工人的需求不能大于題目中數(shù)值。

二是等式約束,本題沒有等式約束條件。

三是決策變量取值范圍的約束。

通常,題目隱含著決策變量大于等于 0 的條件,例如工人人數(shù)、原料數(shù)量都要大于等于 0。

另外,如果能通過分析前面的等式約束或不等式約束,得出決策變量的上限,將會極大的提高問題求解的速度和性能。后文將對此舉例說明。

3.2.2、模型構(gòu)建

模型構(gòu)建, 由問題描述建立數(shù)學(xué)方程,并轉(zhuǎn)化為標(biāo)準(zhǔn)形式的數(shù)學(xué)模型。

對于問題 1,目標(biāo)函數(shù)是生產(chǎn)甲、乙兩種飲料的總利潤,約束條件是原料總量、工人總數(shù)的約束,而且原料、工人都要大于等于 0。

進(jìn)一步分析決策變量取值范圍的約束條件,由原料數(shù)量、工人數(shù)量的不等式約束可以推出:

對于問題 2,可以通過增加投資來獲得更多的原料,投資額是一個新的變量。要注意的是,此時目標(biāo)函數(shù)雖然也是生產(chǎn)兩種飲料的總利潤,但總利潤不等于總收入,而是總收入減去總成本,在本例中就是要減去購買原料的投資。

對于問題 3 和問題 4,區(qū)別只是不允許散箱,明確提出了決策變量 x1、x2 的取值要取整數(shù)值,所以是整數(shù)規(guī)劃問題。
需要注意的是,問題 4 中對增加的投資額即購買的原料數(shù)量并沒有整數(shù)限制,因此 x1、x2 的取值范圍是正整數(shù),但 x3 的取值范圍是正數(shù),這是一個混合整數(shù)規(guī)劃問題。
還要說明的是,對于問題 1 和問題 2,雖然題目中沒有明確要求生產(chǎn)甲、乙飲料的工人人數(shù)為整數(shù),但是人數(shù)也不可能是小數(shù)的,那么這是不是也是整數(shù)規(guī)劃問題呢?
如果你能提出這個問題,那么恭喜你,你已經(jīng)從小白升級為菜鳥了。
我的理解是,這個問題怎么說都可以。如果要簡化問題,使用線性規(guī)劃模型,最好在問題假設(shè)中說一句,假設(shè)甲乙飲料在同一車間先后生產(chǎn),只要允許甲乙飲料散箱生產(chǎn),即使根據(jù)產(chǎn)量所求出的工人數(shù)是小數(shù),也可以解釋的通。如果你掌握了整數(shù)規(guī)劃問題的求解,那就先按線性規(guī)劃建模,再補充討論工人人數(shù)也必須是整數(shù)的條件,按整數(shù)規(guī)劃建模求解,這就是妥妥的獲獎?wù)撐牧恕?/p>

3.2.3、模型求解

模型求解,用標(biāo)準(zhǔn)模型的優(yōu)化算法對模型求解,得到優(yōu)化結(jié)果。

在線性規(guī)劃問題中已經(jīng)講過使用 PuLP 的求解步驟:

(0)導(dǎo)入 PuLP庫函數(shù)

import pulp

(1)定義一個規(guī)劃問題

ProbLP1 = pulp.LpProblem("ProbLP1", sense=pulp.LpMaximize)    # 定義問題 1,求最大值

pulp.LpProblem 用來定義問題的構(gòu)造函數(shù)。"ProbLP1"是用戶定義的問題名。
參數(shù) sense 指定問題求目標(biāo)函數(shù)的最小值/最大值 。本例求最大值,選擇 “pulp.LpMaximize” 。

(2)定義決策變量

對于問題 1:

x1 = pulp.LpVariable('x1', lowBound=0, upBound=15, cat='Continuous')  # 定義 x1
x2 = pulp.LpVariable('x2', lowBound=0, upBound=7.5, cat='Continuous')  # 定義 x2

pulp.LpVariable 用來定義決策變量的函數(shù)。'x1'、'x2' 是用戶定義的變量名。
參數(shù) lowBound、upBound 用來設(shè)定決策變量的下界、上界;可以不定義下界/上界,默認(rèn)的下界/上界是負(fù)無窮/正無窮。本例中 x1、x2 的取值區(qū)間分別為 [0,15]、[0,7.5]。
參數(shù) cat 用來設(shè)定變量類型,可選參數(shù)值:'Continuous' 表示連續(xù)變量(默認(rèn)值)、' Integer ' 表示離散變量(用于整數(shù)規(guī)劃問題)、' Binary ' 表示0/1變量(用于0/1規(guī)劃問題)。

對于問題 3, 甲乙飲料產(chǎn)量 x1、x2 必須取整數(shù),是整數(shù)規(guī)劃問題,因此要設(shè)置變量類型為離散變量(整數(shù)變量):

x1 = pulp.LpVariable('x1', lowBound=0, upBound=15, cat='Integer')  # 定義 x1,變量類型:整數(shù)
x2 = pulp.LpVariable('x2', lowBound=0, upBound=7.5, cat='Integer')  # 定義 x2,變量類型:整數(shù)

(3)添加目標(biāo)函數(shù)

ProbLP1 += (10*x1 + 9*x2)  # 設(shè)置目標(biāo)函數(shù) f(x)

添加目標(biāo)函數(shù)使用 "問題名 += 目標(biāo)函數(shù)式" 格式。

(4)添加約束條件

ProbLP1 += (6*x1 + 5*x2 = 60)  # 不等式約束
ProbLP1 += (10*x1 + 20*x2 = 150)  # 不等式約束

添加約束條件使用 "問題名 += 約束條件表達(dá)式" 格式。
約束條件可以是等式約束或不等式約束,不等式約束可以是 小于等于 或 大于等于,分別使用關(guān)鍵字">="、"="和"=="。

(5)求解

ProbLP1.solve()
print(ProbLP1.name)  # 輸出求解狀態(tài)
print("Status:", pulp.LpStatus[ProbLP1.status])  # 輸出求解狀態(tài)
for v in ProbLP1.variables():
    print(v.name, "=", v.varValue)  # 輸出每個變量的最優(yōu)值
print("F1(x) =", pulp.value(ProbLP1.objective))  # 輸出最優(yōu)解的目標(biāo)函數(shù)值

solve() 是求解函數(shù),可以對求解器、求解精度進(jìn)行設(shè)置。
PuLP默認(rèn)采用 CBC 求解器來求解優(yōu)化問題,也可以調(diào)用其它的優(yōu)化器來求解,但需要另外安裝?!?/p>

3.3、Python 例程

import pulp      # 導(dǎo)入 pulp 庫

# 主程序
def main():

    # 模型參數(shù)設(shè)置
    """
    問題描述:
        某廠生產(chǎn)甲乙兩種飲料,每百箱甲飲料需用原料6千克、工人10名,獲利10萬元;每百箱乙飲料需用原料5千克、工人20名,獲利9萬元。
        今工廠共有原料60千克、工人150名,又由于其他條件所限甲飲料產(chǎn)量不超過8百箱。
        (1)問如何安排生產(chǎn)計劃,即兩種飲料各生產(chǎn)多少使獲利最大?
        (2)若投資0.8萬元可增加原料1千克,是否應(yīng)作這項投資?投資多少合理?
        (3)若不允許散箱(按整百箱生產(chǎn)),如何安排生產(chǎn)計劃,即兩種飲料各生產(chǎn)多少使獲利最大?
        (4)若不允許散箱(按整百箱生產(chǎn)),若投資0.8萬元可增加原料1千克,是否應(yīng)作這項投資?投資多少合理?
    """

    # 問題 1:
    """
    問題建模:
        決策變量:
            x1:甲飲料產(chǎn)量(單位:百箱)
            x2:乙飲料產(chǎn)量(單位:百箱)
        目標(biāo)函數(shù):
            max fx = 10*x1 + 9*x2
        約束條件:
            6*x1 + 5*x2 = 60
            10*x1 + 20*x2 = 150            
            x1, x2 >= 0,x1 = 8
    此外,由 x1,x2>=0 和 10*x1+20*x2=150 可知 0=x2=7.5
    """
    ProbLP1 = pulp.LpProblem("ProbLP1", sense=pulp.LpMaximize)    # 定義問題 1,求最大值
    x1 = pulp.LpVariable('x1', lowBound=0, upBound=8, cat='Continuous')  # 定義 x1
    x2 = pulp.LpVariable('x2', lowBound=0, upBound=7.5, cat='Continuous')  # 定義 x2
    ProbLP1 += (10*x1 + 9*x2)  # 設(shè)置目標(biāo)函數(shù) f(x)
    ProbLP1 += (6*x1 + 5*x2 = 60)  # 不等式約束
    ProbLP1 += (10*x1 + 20*x2 = 150)  # 不等式約束
    ProbLP1.solve()
    print(ProbLP1.name)  # 輸出求解狀態(tài)
    print("Status youcans:", pulp.LpStatus[ProbLP1.status])  # 輸出求解狀態(tài)
    for v in ProbLP1.variables():
        print(v.name, "=", v.varValue)  # 輸出每個變量的最優(yōu)值
    print("F1(x) =", pulp.value(ProbLP1.objective))  # 輸出最優(yōu)解的目標(biāo)函數(shù)值


    # 問題 2:
    """
    問題建模:
        決策變量:
            x1:甲飲料產(chǎn)量(單位:百箱)
            x2:乙飲料產(chǎn)量(單位:百箱)
            x3:增加投資(單位:萬元)
        目標(biāo)函數(shù):
            max fx = 10*x1 + 9*x2 - x3
        約束條件:
            6*x1 + 5*x2 = 60 + x3/0.8
            10*x1 + 20*x2 = 150
            x1, x2, x3 >= 0,x1 = 8
    此外,由 x1,x2>=0 和 10*x1+20*x2=150 可知 0=x2=7.5
    """
    ProbLP2 = pulp.LpProblem("ProbLP2", sense=pulp.LpMaximize)    # 定義問題 2,求最大值
    x1 = pulp.LpVariable('x1', lowBound=0, upBound=8, cat='Continuous')  # 定義 x1
    x2 = pulp.LpVariable('x2', lowBound=0, upBound=7.5, cat='Continuous')  # 定義 x2
    x3 = pulp.LpVariable('x3', lowBound=0, cat='Continuous')  # 定義 x3
    ProbLP2 += (10*x1 + 9*x2 - x3)  # 設(shè)置目標(biāo)函數(shù) f(x)
    ProbLP2 += (6*x1 + 5*x2 - 1.25*x3 = 60)  # 不等式約束
    ProbLP2 += (10*x1 + 20*x2 = 150)  # 不等式約束
    ProbLP2.solve()
    print(ProbLP2.name)  # 輸出求解狀態(tài)
    print("Status  youcans:", pulp.LpStatus[ProbLP2.status])  # 輸出求解狀態(tài)
    for v in ProbLP2.variables():
        print(v.name, "=", v.varValue)  # 輸出每個變量的最優(yōu)值
    print("F2(x) =", pulp.value(ProbLP2.objective))  # 輸出最優(yōu)解的目標(biāo)函數(shù)值

    # 問題 3:整數(shù)規(guī)劃問題
    """
    問題建模:
        決策變量:
            x1:甲飲料產(chǎn)量,正整數(shù)(單位:百箱)
            x2:乙飲料產(chǎn)量,正整數(shù)(單位:百箱)
        目標(biāo)函數(shù):
            max fx = 10*x1 + 9*x2
        約束條件:
            6*x1 + 5*x2 = 60
            10*x1 + 20*x2 = 150
            x1, x2 >= 0,x1 = 8,x1, x2 為整數(shù)
    此外,由 x1,x2>=0 和 10*x1+20*x2=150 可知 0=x2=7.5
    """
    ProbLP3 = pulp.LpProblem("ProbLP3", sense=pulp.LpMaximize)  # 定義問題 3,求最大值
    print(ProbLP3.name)  # 輸出求解狀態(tài)
    x1 = pulp.LpVariable('x1', lowBound=0, upBound=8, cat='Integer')  # 定義 x1,變量類型:整數(shù)
    x2 = pulp.LpVariable('x2', lowBound=0, upBound=7.5, cat='Integer')  # 定義 x2,變量類型:整數(shù)
    ProbLP3 += (10 * x1 + 9 * x2)  # 設(shè)置目標(biāo)函數(shù) f(x)
    ProbLP3 += (6 * x1 + 5 * x2 = 60)  # 不等式約束
    ProbLP3 += (10 * x1 + 20 * x2 = 150)  # 不等式約束
    ProbLP3.solve()
    print("Shan Status:", pulp.LpStatus[ProbLP3.status])  # 輸出求解狀態(tài)
    for v in ProbLP3.variables():
        print(v.name, "=", v.varValue)  # 輸出每個變量的最優(yōu)值
    print("F3(x) =", pulp.value(ProbLP3.objective))  # 輸出最優(yōu)解的目標(biāo)函數(shù)值


    # 問題 4:
    """
    問題建模:
        決策變量:
            x1:甲飲料產(chǎn)量,正整數(shù)(單位:百箱)
            x2:乙飲料產(chǎn)量,正整數(shù)(單位:百箱)
            x3:增加投資(單位:萬元)
        目標(biāo)函數(shù):
            max fx = 10*x1 + 9*x2 - x3
        約束條件:
            6*x1 + 5*x2 = 60 + x3/0.8
            10*x1 + 20*x2 = 150
            x1, x2, x3 >= 0,x1 = 8,x1, x2 為整數(shù)
    此外,由 x1,x2>=0 和 10*x1+20*x2=150 可知 0=x2=7.5
    """
    ProbLP4 = pulp.LpProblem("ProbLP4", sense=pulp.LpMaximize)  # 定義問題 4,求最大值
    print(ProbLP4.name)  # 輸出求解狀態(tài)
    x1 = pulp.LpVariable('x1', lowBound=0, upBound=8, cat='Integer')  # 定義 x1,變量類型:整數(shù)
    x2 = pulp.LpVariable('x2', lowBound=0, upBound=7, cat='Integer')  # 定義 x2,變量類型:整數(shù)
    x3 = pulp.LpVariable('x3', lowBound=0, cat='Continuous')  # 定義 x3
    ProbLP4 += (10*x1 + 9*x2 - x3)  # 設(shè)置目標(biāo)函數(shù) f(x)
    ProbLP4 += (6*x1 + 5*x2 - 1.25*x3 = 60)  # 不等式約束
    ProbLP4 += (10*x1 + 20*x2 = 150)  # 不等式約束
    ProbLP4.solve()
    print("Shan Status:", pulp.LpStatus[ProbLP4.status])  # 輸出求解狀態(tài)
    for v in ProbLP4.variables():
        print(v.name, "=", v.varValue)  # 輸出每個變量的最優(yōu)值
    print("F4(x) =", pulp.value(ProbLP4.objective))  # 輸出最優(yōu)解的目標(biāo)函數(shù)值

    return

if __name__ == '__main__':  # Copyright 2021 YouCans, XUPT
    main()  

3.4、Python 例程運行結(jié)果

Welcome to the CBC MILP Solver 

Version: 2.9.0 

Build Date: Feb 12 2015 

ProbLP1

Status: Optimal

x1 = 6.4285714

x2 = 4.2857143

F1(x) = 102.8571427

ProbLP2

Status: Optimal

x1 = 8.0

x2 = 3.5

x3 = 4.4

F2(x) = 107.1

ProbLP3

Result - Optimal solution found

Status Shan: Optimal

Status: Optimal

x1 = 8.0

x2 = 2.0

F3(x) = 98.0

ProbLP4

Result - Optimal solution found

Status: Optimal

x1 = 8.0

x2 = 3.0

x3 = 2.4

F4(x) = 104.6

以上就是淺談Python數(shù)學(xué)建模之整數(shù)規(guī)劃的詳細(xì)內(nèi)容,更多關(guān)于Python 數(shù)學(xué)建模 整數(shù)規(guī)劃的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • 淺談Python數(shù)學(xué)建模之?dāng)?shù)據(jù)導(dǎo)入
  • 淺談Python數(shù)學(xué)建模之線性規(guī)劃
  • Python進(jìn)行統(tǒng)計建模
  • 利用python實現(xiàn)平穩(wěn)時間序列的建模方式
  • python實現(xiàn)數(shù)據(jù)分析與建模
  • 淺談Python數(shù)學(xué)建模之固定費用問題

標(biāo)簽:安慶 泉州 吉林 怒江 清遠(yuǎn) 岳陽 長春 洛陽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談Python數(shù)學(xué)建模之整數(shù)規(guī)劃》,本文關(guān)鍵詞  淺談,Python,數(shù)學(xué)建模,之,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺談Python數(shù)學(xué)建模之整數(shù)規(guī)劃》相關(guān)的同類信息!
  • 本頁收集關(guān)于淺談Python數(shù)學(xué)建模之整數(shù)規(guī)劃的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    巨野县| 柳江县| 广丰县| 兴安县| 宁波市| 靖州| 石渠县| 松溪县| 清河县| 个旧市| 木兰县| 灵石县| 乐清市| 贺兰县| 浙江省| 兴业县| 甘孜| 新绛县| 正蓝旗| 凤台县| 巢湖市| 郴州市| 尉氏县| 通山县| 青冈县| 崇礼县| 怀安县| 鄂温| 曲靖市| 确山县| 涿鹿县| 大姚县| 无棣县| 固镇县| 镇雄县| 远安县| 永昌县| 尼勒克县| 呼和浩特市| 云南省| 六枝特区|