当前位置:首页 > 模拟 > 模拟
[导读]1、问题描述:在一块电路板的上、下两端分别有n个接线柱。根据电路设计,要求用导线(i,π(i)) 将上端接线柱i与下端接线柱π(i)相连,如下图。其中,π(i),1≤ i ≤n,是{1,2,…,n}的一个排列。导线(

1、问题描述:

在一块电路板的上、下两端分别有n个接线柱。根据电路设计,要求用导线(i,π(i)) 将上端接线柱i与下端接线柱π(i)相连,如下图。其中,π(i),1≤ i ≤n,是{1,2,…,n}的一个排列。导线(I, π(i))称为该电路板上的第i条连线。对于任何1 ≤ i ≤ j ≤n,第i条连线和第j条连线相交的充要条件是π(i)> π(j).

π(i)={8,7,4,2,5,1,9,3,10,6}

在制作电路板时,要求将这n条连线分布到若干绝缘层上。在同一层上的连线不相交。电路布线问题要确定将哪些连线安排在第一层上,使得该层上有尽可能多的连线。换句话说,该问题要求确定导线集Nets = {i,π(i),1 ≤ i ≤ n}的最大不相交子集。

2、最优子结构性质:

记N(i,j) = {t|(t, π(t)) ∈ Nets,t ≤ i, π(t) ≤ j }. N(i,j)的最大不相交子集为MNS(i,j)Size(i,j)=|MNS(i,j)|。

(1)当i = 1时

(2)当i >1时

① j <π(i)。此时,(i,π(i)) 不属于N(i,j)。故在这种情况下,N(i,j) = N(i-1,j),从而Size(i,j)=Size(i-1,j)。

② j ≥π(i)。此时,若(i, π(i))∈MNS(i,j),则对任意(t, π(t))∈MNS(i,j)有t < i且π(t)< π(i);否则,(t, π(t))与(i, π(i))相交。在这种情况下MNS(i,j)-{(i, π(i))}是N(i-1, π(i)-1)的最大不相交子集。否则,子集MNS(i-1, π(i)-1)∪{(i, π(i))}包含于N(i,j)是比MNS(i,j)更大的N(i,j)的不相交子集。这与MNS(i,j)的定义相矛盾。

若(i, π(i))不属于MNS(i,j),则对任意(t, π(t))∈MNS(i,j),有t

另一方面,MNS(i-1,j)包含于N(i,j),故又有Size(i,j) ≥Size(i-1,j),从而Size(i,j)= Size(i-1,j)。

3、递推关系

电路布线问题的最优值为Size(n,n)。由该问题的最优子结构性质可知,子问题最优值的递归关系如下:

自底向上,先算上排接线柱只有1个,2个的最优布线,然后求上排接线柱有多个的最优布线。具体代码如下:

//3d8 动态规划 电路布线问题
#include "stdafx.h"
#include <iostream>
using namespace std;

const int N = 10;

void MNS(int C[],int n,int **size);
void Traceback(int C[],int **size,int n,int Net[],int& m);

int main()
{
 int c[] = {0,8,7,4,2,5,1,9,3,10,6};//下标从1开始
 int **size = new int *[N+1];

 for(int i=0; i<=N; i++)
 {
  size[i] = new int[N+1];
 }

 MNS(c,N,size);

 cout<<"电路布线最大不相交连线数目为:"<<size[N][N]<<endl;

 int Net[N],m;
 Traceback(c,size,N,Net,m);

 cout<<"最大不相交连线分别为:"<<endl;
 for(int i=m-1; i>=0; i--)
 {
  cout<<"("<<Net[i]<<","<<c[Net[i]]<<") ";
 }
 cout<<endl;
 return 0;
}

void MNS(int C[],int n,int **size)
{
 for(int j=0;j<C[1];j++)
 {
  size[1][j]=0;
 }

 for(int j=C[1]; j<=n; j++)
 {
  size[1][j]=1;
 }

 for(int i=2; i<n; i++)
 {
  for(int j=0; j<C[i]; j++)
  {
   size[i][j]=size[i-1][j];//当i<c[i]的情形
  }
  for(int j=C[i]; j<=n; j++)
  {
   //当j>=c[i]时,考虑(i,c[i])是否属于MNS(i,j)的两种情况
   size[i][j]=max(size[i-1][j],size[i-1][C[i]-1]+1);
  }
 }
 size[n][n]=max(size[n-1][n],size[n-1][C[n]-1]+1);
}

void Traceback(int C[],int **size,int n,int Net[],int& m)
{
 int j=n;
 m=0;
 for(int i=n;i>1;i--)
 {
  if(size[i][j]!=size[i-1][j])//此时,(i,c[i])是最大不相交子集的一条边
  {
   Net[m++]=i;
   j=C[i]-1;//更新扩展连线柱区间
  }
 }
 if(j>=C[1])//处理i=1的情形
 {
  Net[m++]=1;
 }
}

算法MNS时间和空间复杂度为O(n^2)。Traceback时间复杂度为O(n)。程序运行结果如下:

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

随着科技的飞速进步,人工智能(AI)已经逐渐成为了引领新一轮科技革命和产业变革的核心驱动力。AI不仅在改变着我们的日常生活,还在推动各行各业的创新发展。展望未来,人工智能的发展将呈现出哪些趋势呢?本文将从技术、应用、伦理...

关键字: 人工智能 算法 AI技术

机器学习算法不会要求一个问题被 100%求解,取而代之的是把问题转化为最优化的问题,用不同的算法优化问题,从而比较得到尽量好的结果。

关键字: 机器学习 算法 最优化

据数据类型的不同,对一个问题的建模有不同的方式。在机器学习或者人工智能领域,人们首先会考虑算法的学习方式。在机器学习领域,有几种主要的学习方式。

关键字: 机器学习 人工智能 算法

NVIDIA 量子模拟平台将通过各大云提供商提供,帮助科学家推进量子计算和算法研究

关键字: 量子计算 算法 量子云

随着科技的飞速发展,人工智能(AI)已经成为当今科技研究的热点和前沿。AI的快速发展不仅带来了许多新的应用场景和商业模式,也在推动科技进步的同时,引发了一系列关于其未来发展方向和潜在影响的深入讨论。本文将对人工智能的科技...

关键字: 人工智能 AI技术 算法

机器学习算法:机器学习是一种让计算机通过学习数据和模式来改进自身算法的技术。这些算法包括监督学习、无监督学习和强化学习。

关键字: 人工智能 机器学习 算法

随着信息技术的快速发展,机器学习作为人工智能的核心技术之一,正逐渐渗透到各个领域,引领着一场前所未有的科技变革。在机器学习的实际应用中,有三大重点至关重要,它们分别是数据质量、算法选择与模型评估。本文将深入探讨这三大重点...

关键字: 机器学习 数据质量 算法

在人工智能的浪潮中,机器学习已逐渐成为推动科技进步的核心动力。机器学习技术的广泛应用,从图像识别到自然语言处理,从智能推荐到自动驾驶,都离不开其三个基本要素:数据、算法和模型。本文将深入探讨这三个基本要素在机器学习中的作...

关键字: 机器学习 算法 人工智能

随着信息技术的迅猛发展,机器学习作为人工智能的核心技术之一,已经深入到了各个领域,为我们的生活和工作带来了翻天覆地的变化。无论是智能语音助手、自动驾驶汽车,还是个性化推荐、疾病预测,这些令人惊叹的应用背后,都离不开机器学...

关键字: 机器学习 人工智能 算法

机器学习的方法是指利用统计学方法和算法让计算机自动学习模式和规律,并通过数据进行预测和决策的一门学科。机器学习的主要目标是让计算机能够从数据中自我学习,通过训练模型来提高自身的性能。机器学习的方法可以从高层次上分为监督学...

关键字: 机器学习 算法
关闭
关闭