优化模型
数学规划模型
整数线性规划
在线性规划模型中,规划中的变量限制为整数时称为整数线性规划。
1. 变量全部限制为整数,称为(完全)整数线性规划
2. 变量部分限制为整数,称为混合整数线性规划
R 包:Rsymphony
主函数:
Rsymphony_solve_LP(obj, mat, dir, rhs, bounds = NULL, types = NULL, max = FALSE, verbosity = -2, time_limit = -1, node_limit = -1, gap_limit = -1, first_feasible = FALSE, write_lp = FALSE, write_mps = FALSE)
主函数参数:
| 主要参数 | 作用 |
| :------: | ---------------------------------------------- |
| obj | 规划目标系数 |
| mat | 约束向量矩阵 |
| dir | 约束方向向量,'<','>' |
| rhs | 约束值 |
| bounds | 上下限的约束,默认0~INF |
| type | 限定目标变量额类型,‘B’:01规划,‘C’代表连续值 |
| max | 逻辑值。T 求最大值,F 求最小值 |
example:
``` R
library(Rsymphony)
obj <- c(3, 1, 3)
mat <- matrix(c(3, 2, 1, 4, 1, 3, 2, 1, 2), nrow = 3)
dir <- c("<=", "<=", "<=")
rhs <- c(60, 40, 80)
max <- F
Rsymphony_solve_LP(obj, mat, dir, rhs, max = max)
非线性规划
非线性规划 (non-linear programming) 问题不要求目标函数、约束条件都为线性形式,较之线性
规划问题以及由其发展出来的整数规划、目标规划,非线性规划的应用更加广泛,一般的线性规划仅仅是非线性规划的特例而已。
对于无约束或者约束条件相对简单的非线性优化问题,stats 包中的 optim()、optimize()、constrOptim()、nlm()、nlminb()等函数可以完美地解决,并且它们的使用方法相当简单。
R包: Rdonlp2
安装方法: install.packages("Rdonlp2", repos="http://R-Forge.R-project.org")
Solve constrained nonlinear minimization problem. 最大值形式需要变形
``` R
donlp2(par,fn, par.upper=rep(+Inf,length(par)), par.lower=rep(+Inf,length(par)), A=NULL, lin.upper=rep(+Inf,length(par)),
lin.lower=rep(-Inf,length(par)), nlin=list(),nlin.upper=rep(+Inf,length(nlin)), nlin.lower=rep(-Inf,length(nlin)),
control=donlp2.control(), control.fun=function(lst){return(TRUE)},env=.GlobalEnv, name="Rdonlp2" )
```
对该函数众多参数进行解释:
> par : 初始迭代向量
> fn : 连续型函数
> par.upper、par.lower : 自变量的上下限
> A:线性约束矩阵
> lin.upper、lin.lower : 线性约束条件的上下界
> nlin : 非线性约束条件函数列表
> nlin.upper、nlin.lower : 非线性约束条件的上下界
> 其余参数可忽略。
```R
library(Rdonlp2)
p = c(10,10) #迭代初始值
par.l = c(-100,-100); par.u = c(100,100) ## 目标值域
# 目标
fn = function(x){ x[1]^2*sin(x[2])+x[2]^2*cos(x[1])}
# 行构成线性约束
A = matrix(c(1,1,3,-1),2,byrow=TRUE)
lin.l = c(2,1); lin.u = c(+Inf,3)
# 构成非线性约束
nlcon1 = function(x){ x[1]*x[2]}
nlcon2 = function(x){ sin(x[1])*cos(x[2])}
nlin.l = c(2,-Inf)
nlin.u = c(2,0.6) #图片的上界好像错了,应该是0.6
# 求解
ret = donlp2(p, fn, par.u=par.u, par.l=par.l, A, lin.l=lin.l, lin.u=lin.u,nlin = list(nlcon1,nlcon2),nlin.u = nlin.u, nlin.l = nlin.l)
# 输出结果
ret$par
# [1] 1.403076 1.425440
```
目标规划
目标规划建立模型的步骤为:
用**EXCEL**解似乎更方便。老师上课讲过
有个包叫**goalprog**可以做目标规划,但是我不会装,网上没找到教程。
---
动态规划
手解或根据实际情况编程求解。
参考网站数学建模动态规划的小案例之R代码实现——生产计划问题
微分方程组模型
1. 人口增长模型(种群增长模型)
简单模型
x{k}为第k年人数,r为增长率
Malthus模型
Logistic模型(阻滞增长模型)
人口相对增长率随人口的增加而线性减少。
r(N) = r - s * N r(N(t)) = r - r/N[max] * N
Malthus模型和Logistic模型都是确定性模型,只考虑人口总数的连续时间模型。在研究过程中还发展了随机性模型,考虑人口年龄分布的模型等。
人口模型的推广
放射性元素的衰变规律(检验名画的真伪,考古年代的判断)
经济领域(通货膨胀,利率,新产品的销售,广告宣传等)
动植物生长规律(96年的全国大学生数学建模竞赛题)
浓度的扩散(人体内药物的吸收,传染病的传播与流行等)
2. 传染病模型
考虑**易感人群**、**潜伏期人群**、**感染者**、**健康有免疫者** 四者之间的转化,建立模型。
3. 药物在体内的分布与排除 、捕食系统Volterra模型
图论与网络优化模型
R包:igraph
1. 最短路径问题
shortest_paths()
```R
distance_table(graph, directed = TRUE)
mean_distance(graph, directed = TRUE, unconnected = TRUE)
distances(graph, v = V(graph), to = V(graph),
mode = c("all", "out","in"), weights = NULL, algorithm = c("automatic", "unweighted",
"dijkstra", "bellman-ford", "johnson"))
shortest_paths(graph, from, to = V(graph), mode = c("out", "all","in"), weights = NULL, output = c("vpath", "epath", "both"),predecessors = FALSE, inbound.edges = FALSE)
all_shortest_paths(graph, from, to = V(graph), mode = c("out", "all","in"), weights = NULL)
```
2. 网络最大流问题
max_flow()
```
#Usage
max_flow(graph, source, target, capacity = NULL)
#Arguments
graph The input graph.
source The id of the source vertex.
target The id of the target vertex (sometimes also called sink).
capacity Vector giving the capacity of the edges. If this is NULL (the default) then the capacity edge attribute is used. Note that the weight edge attribute is not used by this function.
```
3. 最小费用最大流问题
4. 最小生成树(MST)
```
#Usage
mst(graph, weights = NULL, algorithm = NULL, ...)
#Arguments
graph The graph object to analyze.
weights Numeric algorithm giving the weights of the edges in the graph. The order is determined by the edge ids. This is ignored if the unweighted algorithm is chosen. Edge weights are interpreted as distances.
algorithm The algorithm to use for calculation. unweighted can be used for unwieghted graphs, and prim runs Prim's algorithm for weighted graphs. If this is NULL then igraph tries to select the algorithm automatically: if the graph has an edge attribute called weight of the weights argument is not NULL then Prim's algorithm is chosen, otherwise the unwweighted algorithm is performed.
... Additional arguments, unused.
5. 旅行商问题(TSP)
TSP(Traveling Salesman Problem)即旅行商问题,是数学领域中著名问题之一。这个问题是这样的:假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径长度为所有路径之中的最小值。
目前比较主流的方法是采用一些随机的、启发式的搜索算法,比如遗传算法、蚁群算法、模拟退货算法、粒子群算法等。
R包:tspmeta
```R
coords.df <- data.frame(`####data######)
# Numeric matrix of city coordinates, rows denote cities.
coords.mx <- as.matrix(coords.df)
# Compute distance matrix
dist.mx <- dist(coords.mx)
# Construct a TSP object
tsp.ins <- tsp_instance(coords.mx, dist.mx )
#
tour <- run_solver(tsp.ins, method="2-opt")
#Plot
autoplot(tsp.ins, tour)
```
概率模型
决策树(运筹学课本)
随机存储模型
1.确定设计变量和目标变量
2.确定目标函数的表达式
寻找设计变量和目标变量之间的关系,构建目标函数
3.寻求约束条件
随机人口问题
把人口当作离散变量看待,初始人群为n0设全人群出生率λ和全人群死亡率μ,把出生与死亡当作相互独立的事件。根据全概率公式、微分方程等:
E(t)与指数模型形式上一致,D(t)表示人口Z(t)在E(t)附近波动的范围(方差)。
Markov链模型
对于一个系统,由一个状态转至另一个状态的转换过程中,存在着转移概率,并且这种转移概率可以依据其紧接的前一种状态推算出来,与该系统的原始状态和此次转移前的马尔可夫过程无关。马尔可夫链理论与方法已经被广泛应用于自然科学、工程技术和公用事业中。
组合优化模型
多维背包问题(MKP)
python代码参考网址1
python代码参考网址2
二维指派问题(QAP)
R package: lpSolve
lp.assign()解决指派问题
#Description
Interface to lp\_solve linear/integer programming system specifically for solving assignment problems
#Usage
lp.assign (cost.mat, direction = "min", presolve = 0, compute.sens = 0)
lp.transport()解决运输问题
>Description
>Interface to lp\_solve linear/integer programming system specifically for solving transportation problems
>
>Usage
>lp.transport (cost.mat, direction="min", row.signs, row.rhs, col.signs, col.rhs, presolve=0, compute.sens=0, integers = 1:(nc*nr) )
车辆路径问题(VRP)
车辆路径问题(Vehicle Routing Problem,VRP)是组合优化和运筹学领域研究的热点问题之一,其主要研究满足约束条件的最优车辆使用方案以及最优的车辆路径方案。基于基本车辆路径问题的框架,研究满足生产经营和运作需要的各种车辆路径问题.
知网论文:《车辆路径问题的模型及算法研究综述》
车间作业调度问题(JSP)
JSP问题描述:一个加工系统有M台机器,要求加工N个作业,其中,作业i包含工序数为Li。令,则L为任务集的总工序数。其中,各工序的加工时间已确定,并且每个作业必须按照工序的先后顺序加工。调度的任务是安排所有作业的加工调度排序,约束条件被满足的同时,使性能指标得到优化。
知网论文:《车间生产调度问题研究》
R优化常用函数
nls(formula, data, start, control, algorithm,trace, subset, weights, na.action, model,lower, upper, ...)
用于拟合非线性模型.用summary(nls object)返回结果.
| Arguments | Descriptions |
| --------- | ------------------------------------------------------------ |
| formula | a nonlinear model formula including variables and parameters.用'~'符号把两者隔开 |
| data | an optional data frame in which to evaluate the variables in formula and weights. Can also be a list or an environment, but not a matrix. |
| start | a named list or named numeric vector of starting estimates. |
| trace | logical value indicating if a trace of the iteration progress should be printed. Default is FALSE. |
optim(par, fn, gr = NULL, ..., method,lower = -Inf, upper = Inf, control = list(), hessian = FALSE)
| arguments | Descriptions |
| --------- | ------------------------------------------------------- |
| par | Initial values for the parameters to be optimized over. |
| fn | A function to be minimized (or maximized) |