离散优化模型的进阶课程笔记 week1-1 如何修改模型

简介:

title: 离散优化模型的进阶 week1-1
tags:

notebook: 6- 英文课程-16-Advanced modeling for discrete optimization

离散优化模型的进阶 week1

对于解的丢失问题

我们在进行离散优化建模的时候,经常会出现建模错误的情况,minizinc对于建模也提供了很多有效的调试工具。

Screenshot from 2018-11-30 10-35-13

问题是这样的:
关羽想要从左上角的节点跑到右下角的节点,中间有很多红色的小兵挡路,关羽想要找到一条挡路的小兵人数最少的线路。

我们首先建立了下面的模型:

首先是数据:
Screenshot from 2018-11-30 10-41-17

这个模型中,
gif.latex?n表示节点的数量。
gif.latex?guard表示每个节点中敌军的数量,其中有些节点是没有敌军的。
gif.latex?m表示节点间的边的数量。
gif.latex?edge描述了边。
gif.latex?rest是休息次数。
gif.latex?start是起始的节点。
gif.latex?dest是结束的节点。
gif.latex?maxstep是可以走的最大的步数。

然后是数据的抽象描述:

Screenshot from 2018-11-30 10-47-39

上面是对数据的描述,
其中定义了一个节点的集合,一个边的集合。
通过这两个集合

然后是决策变量:
定义了一个可变的决策变量step,
并且定义了每一步走的节点STEP

在这里还要介绍一个新的全局约束:

gif.latex?table()

table这个函数有两个输入,一个输入是变量,一个是表格,表明变量必须满足表格中的某一行。

如:

Screenshot from 2018-11-30 10-56-33

那么约束条件就可以这样描述

Screenshot from 2018-11-30 10-58-41

第一个公式描述初始点为start
第二个公式描述路径中的前后两点一定存在一条边链接。

在这样的问题描述上,需要设定一个路程的猜测值,如果值设的过大会让问题变得很难解。

并且特意加入了一个selfedge来解决设定的边的数量过长的问题。也就是说我们允许节点在终点重复。

比如说一个解是这样的:

gif.latex?path%20=%20[1,2,3,11,14,15,9,9

最后重复的节点就是终点。

另一个有用的全局约束函数是,slding_sum 函数,这是一个约束,描述为

Screenshot from 2018-11-30 12-35-54

第一个是序列相加的最小值,第二个是序列相加的最大值。第三个是序列的窗口大小。
举一个使用的例子如下:

Screenshot from 2018-11-30 12-47-37

例子中上面的那个序列是满足约束的,下面的那个序列是不满足约束的。
如何在本文模型中使用呢,

Screenshot from 2018-11-30 12-49-49

这样就可以来约束休息的次数。

整个的模型我们写在下面

int: n;
set of int: NODE = 1..n;
array[NODE] of int: guard;
int: m; % number of edges
set of int: EDGE = 1..m;
array[EDGE,1..2] of NODE: edge;
NODE: start;
NODE: dest;
int: rest; % resting every rest junctions
  
int: maxstep;
set of int: STEP = 1..maxstep;
var STEP: step;
array[STEP] of var NODE: path;
  
include "table.mzn";
include "sliding_sum.mzn";
constraint path[1] = start;
constraint forall(i in STEP)(i >= step -> path[i] = dest);
constraint forall(i in 1..maxstep-1)
       (
%      trace("table([\(path[i]),\(path[i+1])],edge)\n",
             table([path[i],path[i+1]],edge))
%      )
       ;
constraint sliding_sum(1,rest,rest,
            [guard[path[i]] = 0| i in STEP]); 
  
solve minimize sum(i in STEP)(guard[path[i]]);
  
% path = [1,10,6,11,14,15,9,9,9,9];
% step = 7;
  

模型遇到了经常出现的一种情况,那就是找不到合理的解。

一般出现这种问题的时候,有这样的几种可能,

  1. 你所建立的模型使用太长的时间。
  2. 找不到任何一个解。
    当你的模型需要太多时间的时候,你可以进行这两项操作:
  3. 给模型加入初始解,
  4. 或者对约束进行松弛。

尝试将一个解加入该模型,重新求解,然后你就会发现你哪里建模出现了错误。

松弛约束

尝试一个接着一个的去松弛你的约束,缩小有问题的约束的条数。

比如这个问题,我们加入下面的设定值。

path = [1,10,6,11,14,15,9,9,9,9];
step = 7;

再次尝试,我们没有错误信息,还是无解。

然后尝试去掉一些约束。
使用trace函数进行分析:

Screenshot from 2018-11-30 14-20-46

加上trace 后,会打印出路径的路线:

可以看到,

Screenshot from 2018-11-30 14-32-15

得到的输入如上,加重的两个是不存在的边,因此问题出在这里。

因此将模型进行修正,如下

int: n;
set of int: NODE = 1..n;
array[NODE] of int: guard;
int: m; % number of edges
set of int: EDGE = 1..m;
array[EDGE,1..2] of NODE: edge;
  
array[1..2*m, 1..2] of NODE: uedge =
     array2d(1..2*m,1..2, [ edge[i,j]   | i in EDGE, j in 1..2 ] ++
                          [ edge[i,3-j] | i in EDGE, j in 1..2 ]);
  
NODE: start;
NODE: dest;
int: rest; % resting every rest junctions
  
int: maxstep;
set of int: STEP = 1..maxstep;
var STEP: step;
array[STEP] of var NODE: path;
  
include "table.mzn";
include "sliding_sum.mzn";
constraint path[1] = start;
constraint forall(i in STEP)(i >= step -> path[i] = dest);
constraint forall(i in 1..maxstep-1)
      (table([path[i],path[i+1]],uedge));
constraint sliding_sum(1,rest,rest,
            [guard[path[i]] = 0| i in STEP]); 
  
solve minimize sum(i in STEP)(guard[path[i]]);
  
相关文章
|
3月前
|
数据挖掘
【SPSS】回归分析详细操作教程(附案例实战)(下)
【SPSS】回归分析详细操作教程(附案例实战)
107 0
|
8月前
|
存储 安全 编译器
C基础知识(存储类别)
C基础知识(存储类别)
110 1
|
12天前
|
人工智能 API Python
ChatGPT系统课程 - 提示词的基本原则和使用场景之问答、提供样例、推理
ChatGPT系统课程 - 提示词的基本原则和使用场景之问答、提供样例、推理
|
3月前
|
数据挖掘
【SPSS】回归分析详细操作教程(附案例实战)(上)
【SPSS】回归分析详细操作教程(附案例实战)
464 0
|
5月前
|
存储 Windows
R 语言数值实验中常见技巧整理
R 语言数值实验中常见技巧整理
59 0
R 语言数值实验中常见技巧整理
|
9月前
|
机器学习/深度学习 算法 数据可视化
【机器学习实战】10分钟学会Python怎么用DT决策树模型进行分类预测(六)
【机器学习实战】10分钟学会Python怎么用DT决策树模型进行分类预测(六)
209 0
|
9月前
|
机器学习/深度学习 搜索推荐 数据挖掘
经典机器学习系列(十二)【学习排序】
经典机器学习系列(十二)【学习排序】
|
11月前
|
机器学习/深度学习 人工智能 算法
强化学习从基础到进阶-案例与实践[3]:表格型方法:Sarsa、Qlearning;蒙特卡洛策略、时序差分等以及Qlearning项目实战
强化学习从基础到进阶-案例与实践[3]:表格型方法:Sarsa、Qlearning;蒙特卡洛策略、时序差分等以及Qlearning项目实战
强化学习从基础到进阶-案例与实践[3]:表格型方法:Sarsa、Qlearning;蒙特卡洛策略、时序差分等以及Qlearning项目实战
|
11月前
|
机器学习/深度学习 人工智能 算法
强化学习从基础到进阶-常见问题和面试必知必答[3]:表格型方法:Sarsa、Qlearning;蒙特卡洛策略、时序差分等以及Qlearning项目实战
强化学习从基础到进阶-常见问题和面试必知必答[3]:表格型方法:Sarsa、Qlearning;蒙特卡洛策略、时序差分等以及Qlearning项目实战
|
11月前
|
机器学习/深度学习 人工智能 算法
强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验
强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验