一.题目要求
基于回溯算法的计算机机箱线路板排列问题:对于给定线路板连接条件(连接块),确定线路板的最佳排列,使其具有最小的密度。
初始线路板及连接块为:
二.设计思路
问题分析:
从排列问题的角度出发,在8个位置插入8块线路板,共有8!种方法,将问题转化为排列树的问题。根节点为空,第一层为空的根节点,共有8个儿子节点;第二层共8个节点,每个节点有7个儿子节点;第三层每个节点有6个儿子节点。。。。
解决思路:
将每个节点抽象出共性,用一个Board类表示,该类具有的属性有now代表到当前点为止已排好的里含有个Nj的板数,cd代表当前部分排列密度,x代表排列方式,s代表已确定电路板排列数。用Board类创造出一个空的根节点,从根节点出发,不断扩展密度最小的活节点,每扩展一次活节点,就产生该活节点所有儿子节点,根据分支限界法的思想,删去密度已大于bestd的子树。
该程序还采用了优先队列的思想,用potentiallist存储活节点,potentiallistcd存储活节点中每个节点的部分排列密度cd。每次用index及min函数从中取出最小密度对应的活节点。
当扩展至排列树的最后第二层时,检查是否需要更新最优密度:若新的密度小于最优密度,则更新最优密度及最优排列;若新的最小密度大于最优密度,说明活节点potentiallist中已没有更好的排列方案,搜索结束,输出最佳方案。
三.程序主体
# -*-coding:gbk -*-
from numpy import *
class Board():
def __init__(self,n):
self.now=zeros(n)#到当前点为止,已排好的里含有个Nj的板数
self.cd=0#当前部分排列密度
self.x=[]#排列方式,即在机箱的第i 个插槽中插入线路板x[i]
self.s=0#已确定电路板排列数
def init_data(b,total,n1,n2,n3,n4,n5):
for i in n1:#初始化b,存储电路板和连接块的关系
b[i-1][1-1