<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python數學建模系列(一):規(guī)劃問題之線性規(guī)劃

          共 4370字,需瀏覽 9分鐘

           ·

          2021-08-27 20:42

          線性規(guī)劃

          線性規(guī)劃求解需要清晰兩部分,目標函數(max, min) 和 約束條件 ,求解前應轉化為標準形式:

          在這里插入圖片描述

          樣例1:求解下列線性規(guī)劃問題

          scipy庫求解

          涉及知識點

          • optimize.linprog

          Demo代碼

          from scipy import optimize
          import numpy as np
          c = np.array([2,3,-5])
          A = np.array([[-2,5,-1],[1,3,1]])
          B = np.array([-10,12])
          Aeq = np.array([[1,1,1]])
          Beq = np.array([7])
          res = optimize.linprog(-c,A,B,Aeq,Beq)
          res

          運行結果

          image.png

          注:x結果為array數組,從左到右依次表示x1 x2 x3....

          對很大/小的數不使用科學計數法 np.set_printoptions(suppress=True)

          Demo代碼

          from scipy import optimize
          import numpy as np
          np.set_printoptions(suppress=True)
          c = np.array([2,3,-5])
          A = np.array([[-2,5,-1],[1,3,1]])
          B = np.array([-10,12])
          Aeq = np.array([[1,1,1]])
          Beq = np.array([7])
          res = optimize.linprog(-c,A,B,Aeq,Beq)
          res

          運行結果

          image.png

          樣例2:求解下列線性規(guī)劃問題

          image.png

          pulp庫求解

          涉及知識點

          • LpProblem(name='NoName', sense=LpMinimize)
          • solve(solver=None, **kwargs)
          • LpVariable(name, lowBound=None, upBound=None, cat='Continuous', e=None)

          Demo代碼

          import pulp as pp

          # 目標函數的系數
          z = [231]
          a = [[142], [320]]
          b = [8,6]
          aeq = [[1,2,4]]
          beq = [101]

          # 確定最大最小化問題,當前確定的是最大化問題
          m = pp.LpProblem(sense=pp.LpMaximize)

          # 定義三個變量放到列表中
          x = [pp.LpVariable(f'x{i}', lowBound=0for i in [123]]

          # 定義目標函數,并將目標函數加入求解的問題中
          m += pp.lpDot(z, x) # lpDot 用于計算點積

          # 設置比較條件
          for i in range(len(a)):
              m += (pp.lpDot(a[i], x) >= b[i])

          # 設置相等條件
          for i in range(len(aeq)):
              m += (pp.lpDot(aeq[i], x) == beq[i])

          # 求解
          m.solve()
          # 輸出結果
          print(f'優(yōu)化結果:{pp.value(m.objective)}')
          print(f'參數取值:{[pp.value(var) for var in x]}')

          運行結果:

          image.png

          注:

          • 最優(yōu)結果為202
          • x1 = 101 x2=0 x3=0

          樣例3.運輸問題

          image.png

          Demo代碼

          import pulp
          import numpy as np
          from pprint import pprint

          def transportation_problem(costs, x_max, y_max):
              row = len(costs)
              col = len(costs[0])
              prob = pulp.LpProblem('Transportation Proble',sense=pulp.LpMaximize)
              var = [[pulp.LpVariable(f'x{i}{j}',lowBound=0,cat=pulp.LpInteger) for j in range(col)] for i in range(row)]
              # 轉為一維
              flatten = lambda x:[y for l in x for y in flatten(l)] if type(x) is list else [x]
              prob += pulp.lpDot(flatten(var),costs.flatten())
              for i in range(row):
                  prob += (pulp.lpSum(var[i]) <= x_max[i])
              for j in range(col):
                  prob += (pulp.lpSum([var[i][j] for i in range(row)]) <= y_max[j])
              prob.solve()
              return {'objective':pulp.value(prob.objective),'var':[[pulp.value(var[i][j]) for j in range(col)] for i in range(row)]}

          costs = np.array([[500,550,630,1000,800,700],
                          [800,700,600,950,900,930],
                          [1000,960,840,650,600,700],
                          [1200,1040,980,860,880,780]])
          max_plant = [76,88,96,40]
          max_cultivation = [42,56,44,39,60,59]
          res = transportation_problem(costs, max_plant, max_cultivation)
          print(f'最大值為{res["objective"]}')
          print("各個變量的取值為:")
          pprint(res['var'])

          運行結果:

          image.png

          結語

          學習來源:B站及其課堂PPT,對其中代碼進行了復現

          https://www.bilibili.com/video/BV12h411d7Dm? from=search&seid=5685064698782810720
          瀏覽 102
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲免费黄色网 | 青娱乐亚洲日韩 | 无码AV免费观看 | 91电影在线 亚洲精品 | 在线毛毛片免费观看 |