python应用——基于回溯算法的计算机机箱线路板排列问题

本文介绍了使用回溯算法解决计算机机箱线路板排列问题,以达到最小密度。通过建立Board类表示排列状态,并利用优先队列存储活节点,逐步扩展找到最优解。程序最终给出了排列结果和分析。
摘要由CSDN通过智能技术生成

一.题目要求

基于回溯算法的计算机机箱线路板排列问题:对于给定线路板连接条件(连接块),确定线路板的最佳排列,使其具有最小的密度。

初始线路板及连接块为:

 

 

二.设计思路

问题分析:

    从排列问题的角度出发,在8个位置插入8块线路板,共有8!种方法,将问题转化为排列树的问题。根节点为空,第一层为空的根节点,共有8个儿子节点;第二层共8个节点,每个节点有7个儿子节点;第三层每个节点有6个儿子节点。。。。

 

解决思路:

将每个节点抽象出共性,用一个Board类表示,该类具有的属性有now代表到当前点为止已排好的里含有个Nj的板数cd代表当前部分排列密度x代表排列方式s代表已确定电路板排列数。用Board类创造出一个空的根节点,从根节点出发,不断扩展密度最小的活节点,每扩展一次活节点,就产生该活节点所有儿子节点,根据分支限界法的思想,删去密度已大于bestd的子树。

该程序还采用了优先队列的思想,用potentiallist存储活节点,potentiallistcd存储活节点中每个节点的部分排列密度cd。每次用indexmin函数从中取出最小密度对应的活节点。

当扩展至排列树的最后第二层时,检查是否需要更新最优密度:若新的密度小于最优密度,则更新最优密度及最优排列;若新的最小密度大于最优密度,说明活节点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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值