基础线性规划实现---python
目錄
一、問題
何為線性規劃問題:
二、python進行求解
1.通過觀察matlab解線性規劃步驟進行求解
?2.python求解步驟
1)求解用到的模塊(scipy 和? numpy):
2)對? max z=2x1+3x2-5x3??該問題確定c如下:
3) 對于不等式 2x1-5x2+x3>=10 ; x1+3x2+x3<=12
4)對于等式?x1+x2+x3=7 應該單寫為:
5)對于限條件? x1,x2,x3>0? 可寫為:
6)求解
7)求解過程遇到的問題
完整代碼如下:
求解結果如下:
總結:
一、問題
何為線性規劃問題:
線性規劃(Linear Programming,也稱為LP)是一種運籌學技術,當當所有的目標和約束都是線性的(在變量中)并且當所有的決策變量都是連續的時使用。線性規劃是最簡單的運籌學方法。
例如:
二、python進行求解
這個問題必須表述為一個最小化問題。不等式必須表示為≤ 。
1.通過觀察matlab解線性規劃步驟進行求解
線性規劃求解主要分?兩個部分,目標函數(max,min)和約束條件(s.t.),求解時一般要化為MATLAB標準形式:
?
x = linprog(f,A,b) 求解 min f'*x 約束條件為 A*x ≤ b. x = linprog(f,A,b,Aeq,beq) 求解上述問題,但是增加了約束條件,即將: Aeq*x = beq. 如果沒有等式存在可以用:A = [] and b = [] x = linprog(f,A,b,Aeq,beq,lb,ub) 定義變量x的下界lb和上街ub,使得x始終在該范圍內,即lb ≤ x ≤ ub。若沒有約束條件,則設: Aeq = [] and beq = []?2.python求解步驟
1)求解用到的模塊(scipy 和? numpy):
from scipy import optimize as opt import numpy as np#引用無窮符號 inf #from numpy import inf2)對? max z=2x1+3x2-5x3??該問題確定c如下:
c = [2, 3, -5]3) 對于不等式 2x1-5x2+x3>=10 ; x1+3x2+x3<=12
先將其化成? ?-2x1+5x2-x3<=10 ; x1+3x2+x3<=12
因為該不等式結構類似,所以寫成如下:
A = np.array([[-2,5,-1],[1,3,1]]) b = np.array([-10,12])4)對于等式?x1+x2+x3=7 應該單寫為:
Aeq = np.array([[1,1,1]]) beq = np.array([7])5)對于限條件? x1,x2,x3>0? 可寫為:
lim1=(0,inf) lim2=(0,inf) lim3=(0,inf) #如果沒有定義無窮 inf 則可寫成 # lim1=(0,None) # lim2=(0,None) # lim3=(0,None)6)求解
res = opt.linprog(-c,A,b,Aeq,beq,bounds=(lim1,lim2,lim3)) print(res)7)求解過程遇到的問題
笨小孩初始求解時i,所得結果總是科學計數法,如果還有小伙伴也遇到了如下情況可以試試這些
?解決方法:在導入庫后,求解前寫入如下代碼試試
import pandas as pd np.set_printoptions(suppress=True) pd.set_option('display.float_format', lambda x: '%.2f' % x)完整代碼如下:
#導入包 from scipy import optimize as opt import numpy as np from numpy import inf# #解決結果是科學計數法的問題 # import pandas as pd # np.set_printoptions(suppress=True) # pd.set_option('display.float_format', lambda x: '%.2f' % x)#確定c,A,b,Aeq,beq 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]) #限制 lim1=(0,None) lim2=(0,None) lim3=(0,None) #求解 res = opt.linprog(-c,A,b,Aeq,beq,bounds=(lim1,lim2,lim3)) #輸出結果 print(res)求解結果如下:
?重點關注的就是fun和最后一行了,fun是最優值,最后一行是每個x的最優解。
至于第一行為什么是負的呢?
原來這個函數其實是求最小值的,那么求最大值,怎么辦呢?
很簡單,仔細觀察的人應該發現,之前的函數里面,我寫的是-c,而不是c。
為什么這么寫?
這是由于python庫的設定。
因此這個函數的出來的結果其實就是-c的最小值,但很明顯這恰恰是c最大值的相反數。那么答案就是14.5714了
總結:
經過一段時間學習,不但鞏固了所學新知識,更是在實踐中發現了自己的不足,真心很感謝這次機會!如有不當之處,請大家多多指點,非常感謝!!!
本次博客緊隨建模學習打卡第一天_菜菜笨小孩的博客-CSDN博客
總結
以上是生活随笔為你收集整理的基础线性规划实现---python的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 给定4个数字组合的C语言算法,leetc
- 下一篇: 山东大学 2020级数据库系统 实验五