规划问题分为两个大类:线性规划和非线性规划以及下面分支的小类,我们观看这个树状图来粗略的了解一下。
首先我们讲解最简单的线性规划模型,通常线性规划均属于凸规划,通常都是用python中的cvxpy进行求解。
线性规划
模型建立由三个部分组成:
(1)决策变量(问题中的未知量,用于表明规划问题中的用数量表示的方案,措施等)
(2)目标函数(是决策变量的函数,通常求该函数的最大值和最小值)
(3)约束条件(决策变量收到的约束和限制条件)
我们直接来看问题
首先我们观察这个约束条件和目标函数,全部都是线性的,所以我们就放心大胆的使用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[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.
有一个推销员,从城市出发要访遍
各一次,最后一次返回
。已知从
到