3.8 电路布线

article/2023/9/24 22:14:31

 


  •  博主简介:一个爱打游戏的计算机专业学生
  • 博主主页: @夏驰和徐策
  • 所属专栏:算法设计与分析

 1.最优子结构的证明:

我的理解:

对于电路布线问题的最优子结构性质,我们可以通过数学推导进行证明。下面是对证明的逐步解释:

假设对于前i条连线,我们已经找到了一个最大不相交连线子集MNS(i, D),其中D表示第i条连线连接的接线柱。

我们要证明的是,当我们考虑第i+1条连线时,能够得到一个最大不相交连线子集MNS(i+1, D'),其中D'表示第i+1条连线连接的接线柱。

根据电路布线问题的定义,第i+1条连线和任何其他连线相交的充分必要条件是D和D'都是0。

我们可以进行如下的推导:

1. 当i = 0时,即只有一条连线时,MNS(0, D) = K,其中K表示满足条件D ≤ T(1)的连线的数量。这是基本情况。

2. 当i > 0时,我们可以考虑第i+1条连线是否连接到接线柱D'上:
   a. 若第i+1条连线不连接到接线柱D'上,那么MNS(i+1, D') = MNS(i, D'),即前i条连线在接线柱D'上的最大不相交连线子集。
   b. 若第i+1条连线连接到接线柱D'上,那么我们需要找到不与第i+1条连线相交的最大不相交连线子集。
      这个子集可以表示为MNS(i, T(i+1)),即前i条连线在接线柱T(i+1)上的最大不相交连线子集。
      因此,MNS(i+1, D') = 1 + MNS(i, T(i+1))。

综上所述,我们得到了递归的最优子结构关系,即MNS(i+1, D')的最优解可以通过MNS(i, D')和MNS(i, T(i+1))的最优解来获得。

通过这种递归的方式,我们可以构建一个动态规划算法来解决电路布线问题,其中每个子问题的最优解可以由更小规模的子问题的最优解推导出来,最终得到整体问题的最优解。这证明了电路布线问题具有最优子结构性质。

2.递归计算最优值

为了推导出电路布线问题在动态规划下的递归计算最优值,我们可以定义一个状态转移方程来表示最优解的递归关系。

设MNS(i, D)表示前i条连线在接线柱D上的最大不相交连线子集的大小。

我们可以考虑第i条连线连接到接线柱D上和不连接到接线柱D上两种情况:

1. 如果第i条连线不连接到接线柱D上,那么MNS(i, D)等于前i-1条连线在接线柱D上的最大不相交连线子集的大小,即MNS(i-1, D)。

2. 如果第i条连线连接到接线柱D上,那么我们需要找到不与第i条连线相交的最大不相交连线子集。这个子集可以表示为前i-1条连线在接线柱T(i)上的最大不相交连线子集的大小加上1,即MNS(i-1, T(i)) + 1。

因此,我们可以得到状态转移方程:

MNS(i, D) = max{MNS(i-1, D), MNS(i-1, T(i)) + 1}

其中,max表示取两者中的较大值。

通过这个状态转移方程,我们可以从较小规模的子问题开始,逐步计算出更大规模的子问题的最优解。最终,我们可以得到整体问题的最优解MNS(n, D),其中n表示总连线数,D表示第n条连线连接的接线柱。

这样,我们就推导出了电路布线问题在动态规划下的递归计算最优值的方法。

 

3.构造最优解

要构造电路布线问题的最优解,可以使用回溯法来追踪最优解的路径。回溯法通过从最优解的最后一个状态开始,逐步回溯到初始状态,记录每个状态的选择,从而构造出最优解的具体方案。

以下是一个简单的算法框架:

1. 定义一个数组或列表best_solution,用于存储最优解的连线方案。

2. 从最后一个状态开始,即MNS(n, D),其中n表示总连线数,D表示第n条连线连接的接线柱。

3. 根据状态转移方程MNS(i, D) = max{MNS(i-1, D), MNS(i-1, T(i)) + 1},选择使得MNS(i, D)最大的连线方案。

4. 如果选择了第i条连线不连接到接线柱D上,则继续回溯到MNS(i-1, D)。

5. 如果选择了第i条连线连接到接线柱D上,则将第i条连线加入到best_solution中,并继续回溯到MNS(i-1, T(i))。

6. 重复步骤3-5,直到回溯到初始状态MNS(0, 0)。

7. 此时,best_solution中存储的就是构造出的最优解,其中连线的顺序即为回溯的顺序。

通过这个回溯过程,我们可以得到电路布线问题的最优解方案,即将哪些连线安排在第一层上,使得第一层上有尽可能多的连线。

4.计算复杂性

MNS算法需要O(n^2)计算时间和O(n^2)的空间。Traceback需要O(n)计算时间

总结:

电路布线问题是动态规划中的一个经典问题,其重点、难点和易错点如下:

重点:
1. 定义状态:在电路布线问题中,需要定义状态来表示问题的子结构和最优解的特征。
2. 状态转移方程:需要找到递推关系,将问题划分为更小的子问题,并通过状态转移方程来计算子问题的最优解。
3. 最优子结构性质:需要证明电路布线问题满足最优子结构,即全局最优解可以通过局部最优解得到。

难点:
1. 状态的设计:选择合适的状态来表示问题的子结构,使得状态转移方程能够描述问题的特征和关系。
2. 状态转移方程的推导:推导出准确且有效的状态转移方程,需要对问题进行深入分析和思考。
3. 问题规模的控制:电路布线问题的规模较大,需要设计合适的算法和数据结构来处理大规模的问题。

易错点:
1. 数组越界:在动态规划的过程中,需要注意数组的索引范围,避免越界访问。
2. 边界条件处理:对于边界情况,如初始状态和递归的终止条件,需要仔细处理,确保算法的正确性。
3. 状态转移方程的实现:在实现状态转移方程时,需要注意计算顺序和辅助变量的更新,确保结果的准确性。

综上所述,电路布线问题在动态规划中具有一定的复杂性,需要仔细分析问题特点,设计合适的状态和状态转移方程,同时注意处理边界情况和避免常见的易错点,才能得到正确的解答。

 


http://www.ngui.cc/article/show-1202711.html

相关文章

tinkerCAD入门操作(2):移动、旋转和缩放对象

tinkerCAD入门操作:移动、旋转和缩放对象 介绍 现在您已经学会了如何在工作平面上旋转,是时候真正开始处理对象了。 在本课中,您将了解有关对象物理属性的更多信息。 放置一个盒子 我们需要一个对象来操作。让我们从一个盒子开始。在提示…

实验篇(7.2) 06. 通过安全隧道访问远端内网服务器 (SSL) ❀ 远程访问

【简介】直接映射服务器到公网,没有验证不安全;通过Web浏览器访问远程内网服务器,有验证也安全,但是支持的协议太少。那有没有即安全,又能支持所有协议的访问方法呢?我们来看看SSL VPN的隧道模式。 实验要求…

为何要用分布式锁Redis实现分布式锁

为何要用分布式锁 一、为什么要使用分布式锁 为了保证一个方法在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLcok或synchronized)进行互斥控制。但是,随着业务…

手撕数据结构—单链表

✅作者:简单^不简单 🔥系列专栏:C语言数据结构 💖如果文章有错误,时刻欢迎大家的指正。当然觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝 💬格言:希望我…

C/C++动态内存管理 ,new和delete

目录 C动态内存管理 内置类型的动态内存管理 自定义类型的动态内存管理 new和delete的实现原理 new和malloc、delete和free的异同 new的其他用法&#xff1a;定位new C语言动态内存管理<-点这里 C动态内存管理 因为C语言中的管理方式使用起来不方便而且有些情况下无…

2023 华为 Datacom-HCIE 真题题库 09/12--含解析

单项选择题 1.[试题编号&#xff1a;190485] &#xff08;单选题&#xff09;华为交换机MAC地址表的老化时间默认是多少秒? A、500 B、5 C、300 D、400 答案&#xff1a;C 解析&#xff1a;无 2.[试题编号&#xff1a;190484] &#xff08;单选题&#xff09;如图所示&#…

【计算机组成原理与体系结构】硬件系统概述

目录 一、计算机的发展 二、计算机的硬件系统 三、硬件的工作原理 四、计算机系统的层次结构 五、计算机的性能指标 一、计算机的发展 第一代计算机&#xff1a;电子管计算机 第一台电子计算机&#xff1a;ENIAC&#xff08;1946&#xff09; 设计目的&#xff1a;计算导弹…

Ajax请求与浏览器缓存

在现代Web应用程序中&#xff0c;前端代码充斥着大量的Ajax请求&#xff0c;如果对于Ajax请求可以使用浏览器缓存&#xff0c;那么可以显著地减少网络请求&#xff0c;提高程序响应速度。 1. Ajax Request 使用jQuery框架可以很方便的进行Ajax请求&#xff0c;示例代码如下&a…

基础学习——关于list、numpy、torch在float和int等数据类型转换方面的总结

系列文章目录 Numpy学习——创建数组及常规操作&#xff08;数组创建、切片、维度变换、索引、筛选、判断、广播&#xff09; Tensor学习——创建张量及常规操作&#xff08;创建、切片、索引、转换、维度变换、拼接&#xff09; 基础学习——numpy与tensor张量的转换 基础学习…

构建sysbench的镜像

方式1&#xff1a;先docker run一个镜像&#xff0c;手动安装好commit docker run -it --name mycentos arm64v8/centos:7 /bin/bash docker commit -a "PX Bai" mycentos mycentos1 docker run -it -d --namemycentos1 mycentos1 /bin/bash docker exec -it mycent…