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

          規(guī)劃問題之線性規(guī)劃【筆記】

          共 2760字,需瀏覽 6分鐘

           ·

          2021-08-27 20:42

          例題

          以下面線性規(guī)劃為例,求最小值

          方法一:使用scipy庫(kù)

          預(yù)備知識(shí)

          scipy.optimize.linprog

          語法

          scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='interior-point', callback=None, options=None, x0=None)

          常用參數(shù):

          • c:所求目標(biāo)函數(shù)未知數(shù)的系數(shù)集合

          • A_ub:不等式左邊未知數(shù)的系數(shù)集合

          • B_up,不等式右邊數(shù)值集合

          • A_eq,等式左邊未知數(shù)的系數(shù)集合

          • B_eq ,等式右邊的數(shù)值集合

          • bounds:每個(gè)未知數(shù)的限制集合 ,默認(rèn)每個(gè)未知數(shù)限制條件為(0,None)

          • method:用于解決標(biāo)準(zhǔn)形式問題的算法。默認(rèn)為interior-point

          常用返回值:

          • fun:float,目標(biāo)函數(shù)的最優(yōu)值。(求解目標(biāo)函數(shù)的 最小值

          • x:一維數(shù)組,在滿足約束條件的同時(shí)使目標(biāo)函數(shù)最小化的決策變量的值。

          • status:int,表示算法退出狀態(tài)的整數(shù)。

            • 0:優(yōu)化成功終止。
            • 1:迭代極限達(dá)到。
            • 2:這個(gè)問題似乎不可行。
            • 3:問題似乎是無界的。
            • 4:遇到數(shù)值困難。
          • nit:int,在所有階段中執(zhí)行的迭代的總數(shù)。

          • message:str,表示算法退出狀態(tài)的字符串描述符。

          API官方解釋:

          https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linprog.html

          解答

          首先,將約束修改為標(biāo)準(zhǔn)模式:不等式只能含有 小于等于

          編寫代碼

          from scipy import optimize
          import numpy as np

          # 目標(biāo)函數(shù)未知數(shù)的系數(shù)
          c = np.array([2,3,-5])

          # 不等式左邊未知數(shù)的系數(shù)集合(二維數(shù)組,因?yàn)椴恢挂粋€(gè)不等式)
          # 第一個(gè)不等式的系數(shù)是【-2,5,-1】 
          # 第二個(gè)不等式的系數(shù)是【1,3,1】
          A_ub = np.array([[-2,5,-1],[1,3,1]])
          # 不等式右邊數(shù)值的集合(一維數(shù)組)
          # 第一個(gè)不等式右邊數(shù)值是-10 
          # 第二個(gè)不等式右邊數(shù)值是12
          b_ub = np.array([-10,12])

          # 等式左邊的系數(shù)集合(二維數(shù)組)
          A_eq = np.array([[1,1,1]])
          # 等式右邊的數(shù)值(一維)
          b_eq = np.array([7])

          # 使用optimize.linprog進(jìn)行求解
          res = optimize.linprog(c,A_ub,b_ub,A_eq,b_eq)
          res

          運(yùn)行結(jié)果

          • 最優(yōu)解(最小值):-14.000000657683234
          • 最優(yōu)解對(duì)應(yīng)的: array([2.99999979e+00, 1.04988686e-08, 4.00000005e+00])

          補(bǔ)充 - 1

          倘若需要求 的最大值 ?

          scipy.optimize.linprog 只能求目標(biāo)函數(shù)最小值

          若需要求目標(biāo)函數(shù)最大值 ,只需要將函數(shù)中參數(shù)改為 -c

          ?

          因?yàn)樵谇笠粋€(gè)函數(shù)的最大值時(shí),我們可以求取反(乘以-1)后目標(biāo)函數(shù)的最小值

          對(duì)最小值再乘以-1 即可得到最大值

          比如函數(shù) x1 + x2 的最大值是2(事先不知道)

          我們可以先求 -(x1 + x2) 的最小值

          通過求解找出-(x1 + x2) 的最小值為 -2

          那么最大值就是 -2 * -1 = 2

          Demo代碼

          from scipy import optimize
          import numpy as np

          c = np.array([2,3,-5])

          A_ub = np.array([[-2,5,-1],[1,3,1]])
          b_ub = np.array([-10,12])

          A_eq = np.array([[1,1,1]])
          b_eq = np.array([7])

          res = optimize.linprog(-c,A_ub,b_ub,A_eq,b_eq)
          res

          運(yùn)行結(jié)果:

          • 最優(yōu)解,最大值是:14.571428565645032(我們求的是-c的最小值,為-14.571428565645032,那么c的最大值就是 14.571428565645032)
          • 對(duì)應(yīng)最優(yōu)解: array([6.42857143e+00, 5.71428571e-01, 2.35900788e-10])

          補(bǔ)充 - 2

          可以發(fā)現(xiàn)最后結(jié)果中數(shù)據(jù)是以科學(xué)記數(shù)法表示的

          倘若不需要科學(xué)技術(shù)法進(jìn)行表示

          添加代碼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_ub = np.array([[-2,5,-1],[1,3,1]])
          b_ub = np.array([-10,12])

          A_eq = np.array([[1,1,1]])
          b_eq = np.array([7])

          res = optimize.linprog(-c,A_ub,b_ub,A_eq,b_eq)
          res

          運(yùn)行結(jié)果

          在這里插入圖片描述

          補(bǔ)充 - 3

          在前面的例子中,的范圍為 x >= 0 ,  屬于scipy.optimize.linprog中參數(shù) bounds 的默認(rèn)值(0, None)

          None:表示無限制

          那么如果 有范圍限制該如何求解呢?

          瀏覽 112
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  亚洲A网站 | 中文字幕性爱电影 | 殴美肏屄视频 | 麻豆成人传媒网,一区二区三区四区 | 色综合99|