利用python求解规划问题

规划问题分为两个大类:线性规划和非线性规划以及下面分支的小类,我们观看这个树状图来粗略的了解一下。

    

首先我们讲解最简单的线性规划模型,通常线性规划均属于凸规划,通常都是用python中的cvxpy进行求解。

线性规划

模型建立由三个部分组成:

(1)决策变量(问题中的未知量,用于表明规划问题中的用数量表示的方案,措施等)

(2)目标函数(是决策变量的函数,通常求该函数的最大值和最小值)

(3)约束条件(决策变量收到的约束和限制条件)

我们直接来看问题

max z=70x_{1}+20x_{2}+60x_{3}

\left\{\begin{matrix} 2x_{1}+4x_{2}+3x_{3} \leqslant 150& & & \\ 3x_{1}+x_{2}+5x_{3} \leqslant 160 & & & \\ 7x_{1}+3x_{2}+5x_{3} \leqslant 150& & & \\ x_{i}\geqslant 0 & & & \end{matrix}\right.

首先我们观察这个约束条件和目标函数,全部都是线性的,所以我们就放心大胆的使用cvxpy

import cvxpy as cp
import numpy as np
s=np.array([[2,4,3],[3,1,5],[7,3,5]])
b=np.array([150,160,200])
a=np.array([70,50,60])
x=cp.Variable(3,pos=True)
obj=cp.Maximize(a@x)
con=[s@x<=b]
prob=cp.Problem(obj,con)
prob.solve(solver='GLPK_MI')
print(x.value)#x的最优解
print(prob.value)#最优值

我们在cvxpy库里是利用Variable函数进行未知量的定义:

x=cp.Variable((m,n),pos=True)

通常我们会定义一个关于x未知量的m行n列的举证,我们在例子中的3也就相当于(1,3).对于后面的 pos=True,当我们对x没有特殊要求时进行这个定义,当我们要对x去整数时要将这个参数改变为 integer=True。当我们需要对定义的函数中的某一个具体函数进行引用时,我们可以用索引的方式将其引用例如 x_{1}+x_{2}=5

x[0]+x[1]==5

例子里的obj是我们要求的目标函数,这里我们要求目标函数的最大值所以我们引用函数Maximize(),里面的a@x对应了目标函数,这里的@是矩阵乘法。

而con里面对应的是约束条件,约束条件封装在列表中,每一个约束条件都是列表中的元素。

利用cvxpy求解线性问题我们需要对其封装,然后利用solve函数对其求解,利用Problem(obj,con)对目标函数和约束条件封装。

求解函数solve通常会伴有solver='GLPK_MI',这里参数的意义指的是不同的求解器,如果你利用这个代码进行求解时,提示'GLPK_MI'没有这个参数,那么说明你并未导入GLPK_MI这个求解器。

这个时候需要安装cvxopt这个库即可。对应不同的问题,我们需要使用不同的求解器。

下面将介绍整数规划

从整数规划的取值范围来看,整数规划通常非为三类:

(1)纯整数规划:所有决策变量都必须取整数值的整数规划模型

(2)混合整数规划:决策变量中一部分取整数值的整数规划值,另一部分可以不取整数值

(3)0-1整数规划:决策变量只能去0或者1的整数规划

前两种并没有的代码部分和上面的例题差不多,但是有0-1整数规划延伸出了一个整数规划的分支,商旅问题又称TSP.

有一个推销员,从城市v_{1}出发要访遍v_{2},v_{3}...v_{n}各一次,最后一次返回v_{1}。已知从v_{i}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

first青年危机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值