用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:如果有哪儿写的不太清楚欢迎留言,我会即使改进,如果哪儿写的有问题也欢迎指正

使用PuLP库实现线性规划也是一种常用的方法。下面是使用PuLP库解决线性规划问题的示例代码: ```python from pulp import LpMaximize, LpProblem, LpStatus, LpVariable # 创建线性规划问题 problem = LpProblem("Linear_Programming_Problem", LpMaximize) # 定义变量 x = LpVariable('x', lowBound=0) y = LpVariable('y', lowBound=0) # 定义目标函数 problem += -1 * x - 2 * y # 定义约束条件 problem += 3 * x + y <= 9 problem += x + 2 * y <= 8 # 求解线性规划问题 status = problem.solve() # 打印求解状态 print("求解状态:", LpStatus[status]) # 打印最优解 print("最优解:") print("x =", x.value()) print("y =", y.value()) # 打印目标函数的最大值 print("目标函数的最大值:", -1 * problem.objective.value()) ``` 在这个示例中,我们使用PuLP库创建了一个线性规划问题,并定义了两个变量x和y。我们使用`LpVariable`函数指定变量的取值范围为非负数。 然后,我们使用`LpProblem`函数创建一个线性规划问题,并使用`LpMaximize`指定问题的类型为最大化。 接下来,我们使用`+=`操作符定义了目标函数和约束条件。目标函数是`-x - 2*y`,约束条件分别为`3*x + y <= 9`和`x + 2*y <= 8`。 最后,我们使用`solve`方法求解线性规划问题,并使用`LpStatus`打印求解状态。我们还使用`.value()`方法获取变量的最优解以及目标函数的最大值。 希望这个示例可以帮助您使用PuLP库实现线性规划。如果您有其他问题,请随时提问!
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值