主頁(yè) > 知識(shí)庫(kù) > 淺談Python數(shù)學(xué)建模之固定費(fèi)用問(wèn)題

淺談Python數(shù)學(xué)建模之固定費(fèi)用問(wèn)題

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

一、固定費(fèi)用問(wèn)題案例解析

1.1、固定費(fèi)用問(wèn)題(Fixed cost problem)

固定費(fèi)用問(wèn)題,是指求解生產(chǎn)成本最小問(wèn)題時(shí),總成本包括固定成本和變動(dòng)成本,而選擇不同生產(chǎn)方式會(huì)有不同的固定成本,因此總成本與選擇的生產(chǎn)方式有關(guān)。

固定費(fèi)用問(wèn)題,實(shí)際上是互斥的目標(biāo)函數(shù)問(wèn)題,對(duì)于不同的生產(chǎn)方式具有多個(gè)互斥的目標(biāo)函數(shù),但只有一個(gè)起作用。固定費(fèi)用問(wèn)題不能用一般的線(xiàn)性規(guī)劃模型求解。

一般地,設(shè)有 m 種生產(chǎn)方式可供選擇,采用第 j 種方式時(shí)的固定成本為 \(K_j\)、變動(dòng)成本為 \(c_j\)、產(chǎn)量為 \(x_j\),則采用各種生產(chǎn)方式的總成本分別為:

該類(lèi)問(wèn)題的建模方法,為了構(gòu)造統(tǒng)一的目標(biāo)函數(shù),可以引入 m 個(gè) 0-1 變量 y_j 表示是否采用第 j 種生產(chǎn)方式:

于是可以構(gòu)造新的目標(biāo)函數(shù)和約束條件:

M 是一個(gè)充分大的常數(shù)。

1.2、案例問(wèn)題描述

例題 1:

某服裝廠(chǎng)可以生產(chǎn) A、B、C 三種服裝,生產(chǎn)不同種類(lèi)服裝需要租用不同設(shè)備,設(shè)備租金、生產(chǎn)成本、銷(xiāo)售價(jià)格等指標(biāo)如下表所示。

服裝種類(lèi) 設(shè)備租金 材料成本 銷(xiāo)售價(jià)格 人工工時(shí) 設(shè)備工時(shí) 設(shè)備可用工時(shí)
單位 (元) (元/件) (元/件) (小時(shí)/件) (小時(shí)/件) (小時(shí))
A 5000 280 400 5 3 300
B 2000 30 40 1 0.5 300
C 2000 200 300 4 2 300

如果各類(lèi)服裝的市場(chǎng)需求都足夠大,服裝廠(chǎng)每月可用人工時(shí)為 2000h,那么應(yīng)該如何安排生產(chǎn)計(jì)劃使利潤(rùn)最大?

1.3、建模過(guò)程分析

首先要理解生產(chǎn)某種服裝就會(huì)發(fā)生設(shè)備租金,租金只與是否生產(chǎn)該產(chǎn)品有關(guān),而與生產(chǎn)數(shù)量無(wú)關(guān),這就是固定成本。因此本題屬于固定費(fèi)用問(wèn)題。

有些同學(xué)下意識(shí)地認(rèn)為是從 3 種產(chǎn)品中選擇一種,但題目中并沒(méi)有限定必須或只能生產(chǎn)一種產(chǎn)品,因此決策結(jié)果可以是都不生產(chǎn)、選擇 1 種或 2 種產(chǎn)品、3 種都生產(chǎn)。

決策結(jié)果會(huì)是什么都不生產(chǎn)嗎?有可能的。

每種產(chǎn)品的利潤(rùn):(銷(xiāo)售價(jià)格 - 材料成本)× 生產(chǎn)數(shù)量 - 設(shè)備租金

本題中如果設(shè)備租金很高,決策結(jié)果就可能是什么都不做時(shí)利潤(rùn)最大,這是利潤(rùn)為 0,至少不虧。

現(xiàn)在可以用固定費(fèi)用問(wèn)題的數(shù)學(xué)模型來(lái)描述問(wèn)題了:

1.4、PuLP 求解固定費(fèi)用問(wèn)題的編程

編程求解建立的數(shù)學(xué)模型,用標(biāo)準(zhǔn)模型的優(yōu)化算法對(duì)模型求解,得到優(yōu)化結(jié)果。

模型求解的編程步驟與之前的線(xiàn)性規(guī)劃、整數(shù)規(guī)劃問(wèn)題并沒(méi)有什么區(qū)別,這就是 PuLP工具包的優(yōu)勢(shì)。

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

import pulp

(1)定義一個(gè)規(guī)劃問(wèn)題

FixedCostP1 = pulp.LpProblem("Fixed_cost_problem", sense=pulp.LpMaximize)  # 定義問(wèn)題,求最大值

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

(2)定義決策變量

x1 = pulp.LpVariable('A', cat='Binary')  # 定義 x1,0-1變量,是否生產(chǎn) A 產(chǎn)品
x2 = pulp.LpVariable('B', cat='Binary')  # 定義 x2,0-1變量,是否生產(chǎn) B 產(chǎn)品
x3 = pulp.LpVariable('C', cat='Binary')  # 定義 x3,0-1變量,是否生產(chǎn) C 產(chǎn)品
y1 = pulp.LpVariable('yieldA', lowBound=0, upBound=100, cat='Integer')  # 定義 y1,整型變量
y2 = pulp.LpVariable('yieldB', lowBound=0, upBound=600, cat='Integer')  # 定義 y2,整型變量
y3 = pulp.LpVariable('youCans', lowBound=0, upBound=150, cat='Integer')  # 定義 y3,整型變量

pulp.LpVariable 用來(lái)定義決策變量的函數(shù)。參數(shù) cat 用來(lái)設(shè)定變量類(lèi)型,' Binary ' 表示0/1變量(用于0/1規(guī)劃問(wèn)題),' Integer ' 表示整數(shù)變量。'lowBound'、'upBound' 分別表示變量取值范圍的下限和上限。

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

FixedCostP1 += pulp.lpSum(-5000*x1-2000*x2-2000*x3+120*y1+10*y2+100*y3)  # 設(shè)置目標(biāo)函數(shù) f(x)

(4)添加約束條件

FixedCostP1 += (5*y1 + y2 + 4*y3 = 2000)  # 不等式約束
FixedCostP1 += (3*y1 - 300*x1 = 0)  # 不等式約束
FixedCostP1 += (0.5*y2 - 300*x2 = 0)  # 不等式約束
FixedCostP1 += (2*y3 - 300*x3 = 0)  # 不等式約束

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

(5)求解

FixedCostP1.solve()

solve() 是求解函數(shù),可以對(duì)求解器、求解精度進(jìn)行設(shè)置。

1.5、Python 例程:固定費(fèi)用問(wèn)題

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

# 主程序
def main():
    # 固定費(fèi)用問(wèn)題(Fixed cost problem)
    print("固定費(fèi)用問(wèn)題(Fixed cost problem)")
    # 問(wèn)題建模:
    """
        決策變量:
            y(i) = 0, 不生產(chǎn)第 i 種產(chǎn)品
            y(i) = 1, 生產(chǎn)第 i 種產(chǎn)品            
            x(i), 生產(chǎn)第 i 種產(chǎn)品的數(shù)量, i>=0 整數(shù)
            i=1,2,3
        目標(biāo)函數(shù):
            min profit = 120x1 + 10x2+ 100x3 - 5000y1 - 2000y2 - 2000y3
        約束條件:
            5x1 + x2 + 4x3 = 2000
            3x1 = 300y1
            0.5x2 = 300y2
            2x3 = 300y3
        變量取值范圍:Youcans XUPT
            0=x1=100, 0=x2=600, 0=x3=150, 整數(shù)變量
            y1, y2 ,y3 為 0/1 變量 
    """
    # 1. 固定費(fèi)用問(wèn)題(Fixed cost problem), 使用 PuLP 工具包求解
    # (1) 建立優(yōu)化問(wèn)題 FixedCostP1: 求最大值(LpMaximize)
    FixedCostP1 = pulp.LpProblem("Fixed_cost_problem_1", sense=pulp.LpMaximize)  # 定義問(wèn)題,求最大值
    # (2) 建立變量
    x1 = pulp.LpVariable('A', cat='Binary')  # 定義 x1,0-1變量,是否生產(chǎn) A 產(chǎn)品
    x2 = pulp.LpVariable('B', cat='Binary')  # 定義 x2,0-1變量,是否生產(chǎn) B 產(chǎn)品
    x3 = pulp.LpVariable('C', cat='Binary')  # 定義 x3,0-1變量,是否生產(chǎn) C 產(chǎn)品
    y1 = pulp.LpVariable('yieldA', lowBound=0, upBound=100, cat='Integer')  # 定義 y1,整型變量
    y2 = pulp.LpVariable('yieldB', lowBound=0, upBound=600, cat='Integer')  # 定義 y2,整型變量
    y3 = pulp.LpVariable('yieldC', lowBound=0, upBound=150, cat='Integer')  # 定義 y3,整型變量
    # (3) 設(shè)置目標(biāo)函數(shù)
    FixedCostP1 += pulp.lpSum(-5000*x1-2000*x2-2000*x3+120*y1+10*y2+100*y3)  # 設(shè)置目標(biāo)函數(shù) f(x)
    # (4) 設(shè)置約束條件
    FixedCostP1 += (5*y1 + y2 + 4*y3 = 2000)  # 不等式約束
    FixedCostP1 += (3*y1 - 300*x1 = 0)  # 不等式約束
    FixedCostP1 += (0.5*y2 - 300*x2 = 0)  # 不等式約束
    FixedCostP1 += (2*y3 - 300*x3 = 0)  # 不等式約束
    # (5) 求解 youcans
    FixedCostP1.solve()
    # (6) 打印結(jié)果
    print(FixedCostP1.name)
    if pulp.LpStatus[FixedCostP1.status] == "Optimal":  # 獲得最優(yōu)解
        for v in FixedCostP1.variables():  # youcans
            print(v.name, "=", v.varValue)  # 輸出每個(gè)變量的最優(yōu)值
        print("Youcans F(x) = ", pulp.value(FixedCostP1.objective))  # 輸出最優(yōu)解的目標(biāo)函數(shù)值
    return

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

1.6、Python 例程運(yùn)行結(jié)果

Welcome to the CBC MILP Solver 

Version: 2.9.0 

Build Date: Feb 12 2015 

Result - Optimal solution found

Fixed_cost_problem_1

A = 1.0

B = 1.0

C = 1.0

yieldA = 100.0

yieldB = 600.0

yieldC = 150.0

Max F(x) =  24000.0

從固定費(fèi)用問(wèn)題模型的求解結(jié)果可知,A、B、C 三種服裝都生產(chǎn),產(chǎn)量分別為 A/100、B/600、C/150 時(shí)獲得最大利潤(rùn)為:24000。

二、PuLP 求解規(guī)劃問(wèn)題的快捷方法

2.1、PuLP 求解固定費(fèi)用問(wèn)題的編程

通過(guò)從線(xiàn)性規(guī)劃、整數(shù)規(guī)劃、0-1規(guī)劃到上例中的混合0-1規(guī)劃問(wèn)題,我們已經(jīng)充分體會(huì)到 PuLP 使用相同的步驟和參數(shù)處理不同問(wèn)題所帶來(lái)的便利。

但是,如果問(wèn)題非常復(fù)雜,例如變量數(shù)量很多,約束條件復(fù)雜,逐個(gè)定義變量、逐項(xiàng)編寫(xiě)目標(biāo)函數(shù)與約束條件的表達(dá)式,不僅顯得重復(fù)冗長(zhǎng),不方便修改對(duì)變量和參數(shù)的定義,而且在輸入過(guò)程中容易發(fā)生錯(cuò)誤。因此,我們希望用字典、列表、循環(huán)等快捷方法來(lái)進(jìn)行變量定義、目標(biāo)函數(shù)和約束條件設(shè)置。

PuLP 提供了快捷建模的編程方案,下面我們?nèi)砸陨瞎?jié)中的固定費(fèi)用問(wèn)題為例進(jìn)行介紹。本例中的問(wèn)題、條件和參數(shù)都與上節(jié)完全相同,以便讀者進(jìn)行對(duì)照比較快捷方法的具體內(nèi)容。

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

import pulp

(1)定義一個(gè)規(guī)劃問(wèn)題

FixedCostP2 = pulp.LpProblem("Fixed_cost_problem", sense=pulp.LpMaximize)  # 定義問(wèn)題,求最大值

(2)定義決策變量

types = ['A', 'B', 'C']  # 定義產(chǎn)品種類(lèi)
status = pulp.LpVariable.dicts("生產(chǎn)決策", types, cat='Binary')  # 定義 0/1 變量,是否生產(chǎn)該產(chǎn)品
yields = pulp.LpVariable.dicts("生產(chǎn)數(shù)量", types, lowBound=0, upBound=600, cat='Integer')  # 定義整型變量

本例中的快捷方法使用列表 types 定義 0/1 變量 status 和 整型變量 yields,不論產(chǎn)品的品種有多少,都只有以上幾句,從而使程序大為簡(jiǎn)化。

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

fixedCost = {'A':5000, 'B':2000, 'C':2000}  # 各產(chǎn)品的 固定費(fèi)用
unitProfit = {'A':120, 'B':10, 'C':100}  # 各產(chǎn)品的 單位利潤(rùn)
FixedCostP2 += pulp.lpSum([(yields[i]*unitProfit[i]- status[i]*fixedCost[i]) for i in types])

雖然看起來(lái)本例中定義目標(biāo)函數(shù)的程序語(yǔ)句較長(zhǎng),但由于使用字典定義參數(shù)、使用 for 循環(huán)定義目標(biāo)函數(shù),因此程序更加清晰、簡(jiǎn)明、便于修改參數(shù)、不容易輸入錯(cuò)誤。

(4)添加約束條件

humanHours = {'A':5, 'B':1, 'C':4}  # 各產(chǎn)品的 單位人工工時(shí)
machineHours = {'A':3.0, 'B':0.5, 'C':2.0}  # 各產(chǎn)品的 單位設(shè)備工時(shí)
maxHours = {'A':300, 'B':300, 'C':300}  # 各產(chǎn)品的 最大設(shè)備工時(shí)
FixedCostP2 += pulp.lpSum([humanHours[i] * yields[i] for i in types]) = 2000  # 不等式約束
for i in types:
    FixedCostP2 += (yields[i]*machineHours[i] - status[i]*maxHours[i] = 0)  # 不等式約束

快捷方法對(duì)于約束條件的定義與對(duì)目標(biāo)函數(shù)的定義相似,使用字典定義參數(shù),使用循環(huán)定義約束條件,使程序簡(jiǎn)單、結(jié)構(gòu)清楚。

注意本例使用了兩種不同的循環(huán)表達(dá)方式:語(yǔ)句內(nèi)使用 for 循環(huán)遍歷列表實(shí)現(xiàn)所有變量的線(xiàn)性組合,標(biāo)準(zhǔn)的 for 循環(huán)結(jié)構(gòu)實(shí)現(xiàn)多組具有相似結(jié)構(gòu)的約束條件。讀者可以對(duì)照數(shù)學(xué)模型及上例的例程,理解這兩種定義約束條件的快捷方法。

(5)求解和結(jié)果的輸出

# (5) 求解
FixedCostP2.solve()
# (6) 打印結(jié)果
print(FixedCostP2.name)
temple = "品種 %(type)s 的決策是:%(status)s,生產(chǎn)數(shù)量為:%(yields)d"
if pulp.LpStatus[FixedCostP2.status] == "Optimal":  # 獲得最優(yōu)解
    for i in types:
        output = {'type': i,
                    'status': '同意' if status[i].varValue else '否決',
                    'yields': yields[i].varValue}
        print(temple % output) # youcans@qq.com
    print("最大利潤(rùn) = ", pulp.value(FixedCostP2.objective))  # 輸出最優(yōu)解的目標(biāo)函數(shù)值

由于快捷方法使用列表或字典定義變量,對(duì)求解的優(yōu)化結(jié)果也便于實(shí)現(xiàn)結(jié)構(gòu)化的輸出。

2.2、Python 例程:PuLP 快捷方法

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


# 主程序
def main():
    # 2. 問(wèn)題同上,PuLP 快捷方法示例
    # (1) 建立優(yōu)化問(wèn)題 FixedCostP2: 求最大值(LpMaximize)
    FixedCostP2 = pulp.LpProblem("Fixed_cost_problem_2", sense=pulp.LpMaximize)  # 定義問(wèn)題,求最大值
    # (2) 建立變量
    types = ['A', 'B', 'C']  # 定義產(chǎn)品種類(lèi)
    status = pulp.LpVariable.dicts("生產(chǎn)決策", types, cat='Binary')  # 定義 0/1 變量,是否生產(chǎn)該產(chǎn)品
    yields = pulp.LpVariable.dicts("生產(chǎn)數(shù)量", types, lowBound=0, upBound=600, cat='Integer')  # 定義整型變量
    # (3) 設(shè)置目標(biāo)函數(shù)
    fixedCost = {'A':5000, 'B':2000, 'C':2000}  # 各產(chǎn)品的 固定費(fèi)用
    unitProfit = {'A':120, 'B':10, 'C':100}  # 各產(chǎn)品的 單位利潤(rùn)
    FixedCostP2 += pulp.lpSum([(yields[i]*unitProfit[i]- status[i]*fixedCost[i]) for i in types])
    # (4) 設(shè)置約束條件
    humanHours = {'A':5, 'B':1, 'C':4}  # 各產(chǎn)品的 單位人工工時(shí)
    machineHours = {'A':3.0, 'B':0.5, 'C':2.0}  # 各產(chǎn)品的 單位設(shè)備工時(shí)
    maxHours = {'A':300, 'B':300, 'C':300}  # 各產(chǎn)品的 最大設(shè)備工時(shí)
    FixedCostP2 += pulp.lpSum([humanHours[i] * yields[i] for i in types]) = 2000  # 不等式約束
    for i in types:
        FixedCostP2 += (yields[i]*machineHours[i] - status[i]*maxHours[i] = 0)  # 不等式約束
    # (5) 求解 youcans
    FixedCostP2.solve()
    # (6) 打印結(jié)果
    print(FixedCostP2.name)
    temple = "品種 %(type)s 的決策是:%(status)s,生產(chǎn)數(shù)量為:%(yields)d"
    if pulp.LpStatus[FixedCostP2.status] == "Optimal":  # 獲得最優(yōu)解
        for i in types:
            output = {'type': i,
                      'status': '同意' if status[i].varValue else '否決',
                      'yields': yields[i].varValue}
            print(temple % output)
        print("最大利潤(rùn) = ", pulp.value(FixedCostP2.objective))  # 輸出最優(yōu)解的目標(biāo)函數(shù)值

    return

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

2.3、Python 例程運(yùn)行結(jié)果

Welcome to the CBC MILP Solver 

Version: 2.9.0 

Build Date: Feb 12 2015 

Result - Optimal solution found

Fixed_cost_problem_2

品種 A 的決策是:同意,生產(chǎn)數(shù)量為:100

品種 B 的決策是:同意,生產(chǎn)數(shù)量為:600

品種 C 的決策是:同意,生產(chǎn)數(shù)量為:150

最大利潤(rùn) =  24000.0

本例的問(wèn)題、條件和參數(shù)都與上節(jié)完全相同,只是采用 PuLP 提供的快捷建模的編程方案,優(yōu)化結(jié)果也與 PuLP 標(biāo)準(zhǔn)方法完全相同,但本例使用了結(jié)構(gòu)化的輸出顯示,使輸出結(jié)果更為直觀。

以上就是淺談Python數(shù)學(xué)建模之固定費(fèi)用問(wèn)題的詳細(xì)內(nèi)容,更多關(guān)于Python 數(shù)學(xué)建模 固定費(fèi)用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談Python數(shù)學(xué)建模之固定費(fèi)用問(wèn)題》,本文關(guān)鍵詞  淺談,Python,數(shù)學(xué)建模,之,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺談Python數(shù)學(xué)建模之固定費(fèi)用問(wèn)題》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于淺談Python數(shù)學(xué)建模之固定費(fèi)用問(wèn)題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章