程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

用python解決線性規劃

編輯:Python

這是線性規劃的標准型:

這麼看未免有些抽象,我們將在代碼中逐步了解

1.我們先來看一個題目:

 先導入庫函數:

 from scipy import optimize

import numpy as np

 之後,范圍限定,注意,系統默認是小於等於且求最小值,所以一切大於等於的不等式都要在兩邊同時乘以-1:

c = np.array([4,-1])      #導入向量,因為是4x-y,所以是【4,-1】

A = np.array([[-1,1],[-1,-1]])    #不等式變為小於等於後,不等式左邊的向量

b = np.array([5,0])          #將系數移至右邊時,右邊的向量

x=(None,3)                 #規定x的范圍

y=(None,None)         #規定y的范圍

 最後就是求解啦:

res = optimize.linprog(c,A,b,bounds=(x,y))       #這裡就是直接按照引用函數的標准來啦

print(res)

 綜上,完整代碼如下:

from scipy import optimize
import numpy as np
c = np.array([4, -1])
A = np.array([[-1, 1], [-1, -1]])
b = np.array([5, 0])
x = (None, 3)
y = (None, None)
res = optimize.linprog(c, A, b, bounds=(x, y))
print(res)

我們可以得到結果:

fun就是所求結果,而x:array()就是x的取值

2.我們再來看一個更復雜的題目,這裡的限制條件多了等式:

有了之前的基礎,這次直接放完整代碼,題目中等式的約束對應的就是代碼中的Aeq,beq:

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])
x1 = (0,None)
x2 = (0,None)
x3 = (0,None)
res=optimize.linprog(-c,A,b,Aeq,beq,bounds=(x1,x2,x3))
print(res)

 可以得到結果:

 一定要注意,系統默認的都是小於等於的條件和求最小值,所以最後求最大值的時候輸出的是-c

3.在數學建模解線性規劃問題時,更常用到的方法是調包pulp庫,大多數人認為它更方便且功能更強大,我們來看看如何使用吧:

仍然是這一個題

 首先,導入pulp庫並定義線性規劃問題:

import pulp
Myproblem = pulp.LpProblem(sense=pulp.LpMaximize)

之後,定義變量:

x1 = pulp.LpVariable('x1',lowBound=0,upBound=None,cat='Continuous')
x2 = pulp.LpVariable('x2',lowBound=0,upBound=None,cat='Continuous')
x3 = pulp.LpVariable('x3',lowBound=0,upBound=None,cat='Continuous')

lowBound定義下界,upBound定義上界,cat設定變量類型,Continuous是連續型,Integer是離散型,Binary表示0/1變量

接下來,定義變量的范圍,標准格式是‘問題名 += 約束條件表達式’:

Myproblem += 2*x1+3*x2-5*x3
Myproblem +=(x1+x2+x3==7)
Myproblem +=(2*x1-5*x2+x3>=10)
Myproblem +=(x1+3*x2+x3<=12)

最後就是求解啦~:

Myproblem.solve()
for i in Myproblem.variables():
print(i.name,'=',i.varValue)
print('F(x)=',pulp.value(Myproblem.objective))

完整的代碼:

import pulp
Myproblem = pulp.LpProblem(sense=pulp.LpMaximize)
x1 = pulp.LpVariable('x1',lowBound=0,upBound=None,cat='Continuous')
x2 = pulp.LpVariable('x2',lowBound=0,upBound=None,cat='Continuous')
x3 = pulp.LpVariable('x3',lowBound=0,upBound=None,cat='Continuous')
Myproblem += 2*x1+3*x2-5*x3
Myproblem +=(x1+x2+x3==7)
Myproblem +=(2*x1-5*x2+x3>=10)
Myproblem +=(x1+3*x2+x3<=12)
Myproblem.solve()
for i in Myproblem.variables():
print(i.name,'=',i.varValue)
print('F(x)=',pulp.value(Myproblem.objective))

得到的結果是:

結果的表示是不是非常清晰,非常明了哈哈~ 

ps:如果有哪兒寫的不太清楚歡迎留言,我會即使改進,如果哪兒寫的有問題也歡迎指正


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved