This commit is contained in:
yinkanglong_lab
2021-04-01 23:05:52 +08:00
parent 3926b604c9
commit 8ec32f0d25
8 changed files with 105 additions and 30 deletions

View File

@@ -2,6 +2,6 @@
> 每日计划包括三方面的内容:数据结构与算法、基础知识与项目经历、联邦学习与恶意软件
- [ ] 数据结构预算法——回溯剪枝和分支限界整理完成
- [x] 数据结构预算法——回溯剪枝和分支限界整理完成
- [ ] 基础知识与项目经历——计算机网络整理完成
- [ ] 联邦学习与恶意软件——TensorFlow federated学习开始part1

View File

@@ -0,0 +1,32 @@
## 矩阵连乘问题
### 问题描述
给定n个矩阵A1,A2,…,An其中Ai与Ai+1是可乘的i=12…n-1。如何确定计算矩阵连乘积的计算次序使得依此次序计算矩阵连乘积需要的数乘次数最少。例如给定三个连乘矩阵{A1A2A3}的维数分别是`10*100100*5``5*50`采用A1A2A3乘法次数为`10*100*5+10*5*50=7500`而采用A1A2A3乘法次数为`100*5*50+10*100*50=75000`次乘法显然最好的次序是A1A2)A3乘法次数为7500次。
### 问题分析
矩阵链乘法问题描述给定由n个矩阵构成的序列A1A2...An}对乘积A1A2...An找到最小化乘法次数的加括号方法。
### 策略选择
* 算法思想:动态规划
### 算法设计
* 问题分解划分阶段相邻连乘的个数。相邻连乘的个数为1的时候0次乘法。两个相邻连乘的次数固定。三个相邻连乘的时候分两次讨论。规模增长的方向主要由两个一个是k表示矩阵连乘的个数第二个是i表示矩阵的个数。
* 确定状态变量dp[k][i]。表示连乘为k的时候第i个矩阵开始的最优的乘积方式。
* 确定状态转移方程每一个分k-1总情况讨论。
$$
dp[k][i]=min\{dp[1][i]+dp[k-1][i+1]+time[i+1],dp[2][i]+dp[k-2][i+2]+time[i+2],...\}
$$
* 确定边界实现过程从1开始。矩阵连成为1的时候。乘法次数都为0.
![](image/2021-04-01-22-33-51.png)
### 算法分析
* 时间复杂度O(n^3)
### 算法实现
```
```

View File

@@ -1,6 +1,6 @@
# n个骰子的点数
> 生成幂集的循环方法。完全一致,也是动态规划问题。
## 1 n个骰子的点数

View File

@@ -0,0 +1,27 @@
## 作业调度问题
> 参考文献
> * [https://zhuanlan.zhihu.com/p/30705914](https://zhuanlan.zhihu.com/p/30705914)
### 问题描述
有n个作业需要在2台机器M1 和M2组成的流水线上完成加工。每个作业都必须先在 M1 上加工,然后在 M2 上加工。M1和M2加工作业i所需的时间分别记作 a_i和b_i每台机器同一时间最多只能执行一个作业。
请确定这n个作业的最优加工顺序使得从第一个作业在机器上开始加工到最后一个作业在机器上加工完成所需的时间最少。
### 问题分析
### 算法设计
* johnson不等式。满足min{bi,aj}>= min{bj,ai}则表示i和j满足johnson不等式。则意味着i在j前执行不会使的结果变坏。
* 查参考文献。
### 算法分析
* 时间复杂度O(nlogn)按json不等式排序的时间复杂度。
### 算法实现

View File

@@ -19,43 +19,45 @@
* **解空间**
对于一个实例,解向量满足显示约束条件的所有多元组,构成了该实例的一个解空间。
### 基本方法
* 明确定义问题的解空间,将问题的解空间组织成树的结构,通过采用系统的方法隐含搜索解空间树,从而得到问题解。回溯法的基本做法是搜索,是一种组织的井井有条的,能避免不必要搜索的穷举式搜索。搜索策略主要有:深度优先、广度优先、函数优先、广度深度结合。
**节点分支判定条件:**
* 满足约束条件:分支扩展解向量。
* 不满足约束条件:回溯到当前节点的父结点。
**结点状态:**
* 白结点:尚未访问的节点
* 灰节点:正在访问以该节点为跟的子树。
* 黑节点:以该节点为根的子树遍历完成。
**存储当前索索路径**
**搜索策略(避免无效搜索)**
* **约束函数**:在扩展节点处减去不满足约束条件的子树。
* **界限函数**:在扩展节点处减去得不到最优解的子树。
### 回溯法的适用条件
* 适用于搜索问题和优化问题
必要条件
* **多米诺性质**:叶子节点的解一定满足其父节点。叶子结点为真则父节点一定为真。同理父节点为假则叶子结点一定为假(逆否命题)。用父节点为假的情况进行剪枝操作。
* 设P(x1,x2,…,xi)是关于向量<x1,x2,…,xi>的某个性质那么P(x1,x2,…,xi+1)真蕴含P(x1,x2,…,xi) 为真即P(x1,x2,…,xi+1) → P(x1,x2,…,xi) (0<i<n) (n为向量维数)
## 2 求解过程
### 基本方法
1. 明确定义问题的解空间。
* 将问题的解空间组织成树的结构,通过采用系统的方法隐含搜索解空间树,从而得到问题解。回溯法的基本做法是搜索,是一种组织的井井有条的,能避免不必要搜索的穷举式搜索。搜索策略主要有:深度优先、广度优先、函数优先、广度深度结合。
2. 节点分支判定条件:
* 满足约束条件:分支扩展解向量。
* 不满足约束条件:回溯到当前节点的父结点。
3. 结点状态:
* 白结点:尚未访问的节点
* 灰节点:正在访问以该节点为跟的子树。
* 黑节点:以该节点为根的子树遍历完成。
4. 存储当前索索路径
5. 搜索策略(避免无效搜索)
* **约束函数**:在扩展节点处减去不满足约束条件的子树。
* **界限函数**:在扩展节点处减去得不到最优解的子树。
### 具体的步骤
1. 针对问题定义解空间
> 判断问题是否满足多米诺性质
1. **定义解空间**
* 问题解向量
* 解向量分量取值集合
* 构造解空间树
2. 判断问题是否满足多米诺性质
3. 搜索解空间树,确定**剪枝函数**
4. 确定存储搜索路径的数据结构
2. **确定剪枝函数**
3. **搜索解空间树**
4. **存储搜索路径**,确定存储的数据结构
### 两种典型的解空间树
* **子集树**当所给的问题是从n个元素的集合S中找出满足某种性质的子集时相应的解空间树称为子集树。
@@ -112,6 +114,10 @@ void iterativeBacktrack ()
* 求解目标不同:回溯法的求解目标是找出解空间树中满足约束条件的所有解。而分支限界的求解目标是找出满足约束条件的一个解。这个解可能是最优解。
* 搜索方式不同:回溯法以深度优先的方式搜索解空间。而分支限界法则以广度优先或以最小消耗优先的方式搜索解空间。
## 2 常见问题
## 3 常见问题
### 着色问题
### m着色问题
### 装载问题
### 批作业调度问题

View File

@@ -30,4 +30,14 @@
### 分支限界法的程序结构
* 队列+循环的方法
* 队列+循环的方法
## 2 分治限界实现
## 3 常见问题
1. 01背包问题
2. 旅行商问题
3. 装载问题

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 KiB