DFS
数据结构
class Node(object): def __init__(self): self.way= None self.node= None
步骤
- 构建一个栈S,栈中初始状态只含有初始节点0的节点类(Node(0,[])).
- 每次从栈顶弹出一个节点 i。
- 当节点i的编号为0,回到出发节点,而且i.way符合要求(每个节点只经过一次,最后回到初始点0),输出路径。如果i.way不符合要求,舍弃不操作。
- 当节点i的编号不为0,如果i.way符合要求(每个节点经过一次),则将i的孩子节点以及路径压入栈中。如果i.way不符合要求,舍弃不操作。
- 重复2的操作,当栈为空时候,说明没有可行解,程序终止。
BFS
数据结构
class Node(object): def init(self): self.way= None self.node= None
步骤:
- 构建一个队列Q,队列中初始状态只含有初始节点0的节点类(Node(0,[])).
- 每次取队头的第一个节点 i。
- 当节点i的编号为0,回到出发节点,而且i.way符合要求(每个节点只经过一次,最后回到初始点 0),输出路径。如果i.way不符合要求,舍弃不操作。
- 当节点i的编号不为0,如果i.way符合要求(每个节点经过一次),则将i的孩子节点以及路径压入队列Q中。如果i.way不符合要求,舍弃不操作。
- 重复2的操作,当队列为空时候,说明没有可行解,程序终止。
爬山法
数据结构
class Node(object): def init(self): self.way= None self.cost = 0 self.node= None
步骤
- 构建一个栈S,栈中初始状态只含有初始节点0的节点类(Node(0,[])).
- 每次从栈顶弹出一个节点 i。
- 当节点i的编号为0,回到出发节点,而且i.way符合要求(每个节点只经过一次,最后回到初始点0),输出路径。如果i.way不符合要求,舍弃不操作。
- 当节点i的编号不为0,如果i.way符合要求(每个节点经过一次),将i的孩子节点按照路径加权距离大到小排序,然后依次将i的孩子节点压入栈中。如果i.way不符合要求,舍弃不操作。
- 重复2的操作,当栈为空时候,说明没有可行解,程序终止。
最小哈密顿环
分支界限法
- 分支界限法可以用于求解优化问题。 特点:利用已经得到的可行解,剪除不能得到优化解的分支。
- 两个要素:
- 产生可行解的策略:使用采用爬山法得到第一个可行解,整个过程采用最佳优先策略。
- 剪除分支的策略: 判断以x为根节点可行解代价是否大于已知可行解的最小代