从零开始学电路基础问题

技术小站:
& 参加直播现场,与专家互动,学最新知识
& 学习业内最热门知识,还有好礼送
& 看视频,填问卷,拿好礼
& 热点行业全新解读,产品样品免费申请
张飞电子工程师速成全集
10天掌握PCB AD画板
教你高速PCB项目整体设计
如何设计STM32单片机系统?
物联网操作系统从写到用
讲师:华清远见
讲师:林超文
讲师:郑振宇
讲师:李述铜
移入鼠标可放大二维码
电路布线问题的几种动态规划算法
来源:网络整理 作者:日 16:09
[导读] 动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。
  一、什么是动态规划算法
  动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。
  动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。
  二、动态规划算法的实现
  动态规划的主要难点在于理论上的设计,也就是上面4个步骤的确定,一旦设计完成,实现部分就会非常简单。使用动态规划求解问题,最重要的就是确定动态规划三要素:
  (1)问题的阶段
  (2)每个阶段的状态
  (3)从前一个阶段转化到后一个阶段之间的递推关系。
  递推关系必须是从次小的问题开始到较大的问题之间的转化,从这个角度来说,动态规划往往可以用递归程序来实现,不过因为递推可以充分利用前面保存的子问题的解来减少重复计算,所以对于大规模问题来说,有递归不可比拟的优势,这也是动态规划算法的核心之处。
  确定了动态规划的这三要素,整个求解过程就可以用一个最优决策表来描述,最优决策表是一个二维表,其中行表示决策的阶段,列表示问题状态,表格需要填写的数据一般对应此问题的在某个阶段某个状态下的最优值(如最短路径,最长公共子序列,最大价值等),填表的过程就是根据递推关系,从1行1列开始,以行或者列优先的顺序,依次填写表格,最后根据整个表格的数据通过简单的取舍或者运算求得问题的最优解。f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}
  三、动态规划算法基本思想与策略
  编辑动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。
  由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。
  四、动态规划算法基本框架
  for(j=1; j《=m; j=j+1) // 第一个阶段
  xn[j] = 初始值;
  for(i=n-1; i》=1; i=i-1)// 其他n-1个阶段
  for(j=1; j》=f(i); j=j+1)//f(i)与i有关的表达式
  xi[j]=j=max(或min){g(xi-1[j1:j2]), 。。。。。。, g(xi-1[jk:jk+1])};
  t = g(x1[j1:j2]); // 由子问题的最优解求解整个问题的最优解的方案
  print(x1[j1]);
  for(i=2; i《=n-1; i=i+1)
  t = t-xi-1[ji];
  for(j=1; j》=f(i); j=j+1)
  if(t=xi[ji])
  五、电路布线问题的几种动态规划算法
  Name:
  Copyright:
  Author:巧若拙
  Date: 01-04-17 07:48
  Descripon: 电路布线
  【问题描述】
  在一块电路板的上、下两端分别有n个接线柱。根据电路设计,要求用导线(i,&(i))将上端接线柱i与下端接线柱&(i)相连。
  其中,&(i),1《=i《=n是{1,2,&,n}的一个排列。导线(i,&(i))称为该电路板上的第i条连线。对于任何1《=i &(j)。
  在制作电路板时,要求将这n条连线分布到若干绝缘层上。在同一层上的连线不相交。
  你的任务是要确定将哪些连线安排在第一层上,使得该层上有尽可能多的连线。
  换句话说,就是确定导线集Nets={ i,&(i),1《=i《=n}的最大不相交子集。
  【输入形式】
  输入文件第一行为整数n;第二行为用一个空格隔开的n个整数,表示&(i)。
  【输出形式】
  输出文件第一行为最多的连线数m,第2行到第m+1行输出这m条连线(i,&(i))。
  【输入样例】
  【输出样例】
  算法1:int MNS(int i, int j);//自顶向下的备忘录算法
  设置一个备忘录数组s[N+1][N+1],s[i][j]表示从上接线柱1-i发出的导线连接到下接线柱1-j,能生成的不相交导线的最大条数。
  利用原问题的递归关系,使用递归函数来求解。
  状态方程:当i=1时,s[1][j] = (j《c[1]) ? 0 : 1;
  当i》1时,若j《c[i],则s[i][j] = s[i-1][j]; 否则s[i][j] = max(s[i-1][c[i]-1]+1, s[i-1][j]);
  算法2:int MNS_2(int n);//自底向上的动态规划算法
  从i=1开始,依次记录每一个s[i][j],最后获得最优解s[N][N]。
  算法3:int MNS_3(int n);//优化的动态规划算法
  是对算法2的优化,算法2中用到的备忘录数组s[N+1][N+1]占空间较大,实际上下一行数据是利用上一行的数据生成的,
  与更早的数据没有关系,于是可以用两个一维数组pre[N+1]和cur[N+1]代替s[N+1][N+1]。
  最后写了一个函数void Traceback(int n); //输出满足条件的导线
  该函数需要用到备忘录数组s[N+1][N+1],故只能对算法1和算法2产生的结果有效。
  算法4:与算法2相似,但思路更清晰明了的一种算法。算法的逻辑,与最长公共子序列很相似。
  设a[i][j]为上端接线柱i与下端接线柱j前的最大不相交子集,则:
  若i与j相连,则a[i][j] = a[i-1][j-1] + 1
  若i与j不相连,则a[i][j] = max(a[i][j-1], a[i-1][j])
  说明:算法2虽然代码更复杂,但是它做了分类判断,减少了很多不必要的计算,效率更高。
  算法5:对算法4的改进:分阶段讨论,避免不必要的计算。
  与算法2相类似,对下端的接线柱j进行了分段讨论:分成j《c[i], j==c[i]和j》c[i]三个区间,分别求a[i][j]的值,效率更高。
  算法6:int MNS_4(int n);//将问题转化为求最长不下降序列
  注意到电线上端的接线柱已经按顺序排列,问题可以转化为求数组c[N+1]的最长不下降序列
  #include《iostream》
  #include《string》
  int MNS(int i, int j);//自顶向下的备忘录算法
  int MNS_2(int n);//自底向上的动态规划算法
  void Traceback_1(int n); //输出满足条件的导线
  void Traceback_2(int n); //输出满足条件的导线
  void Traceback_3(int n); //输出满足条件的导线
  int MNS_3(int n);//优化的动态规划算法
  int MNS_4(int n);//另一种思路的动态规划算法
  int MNS_5(int n);//对算法4的改进:分阶段讨论,避免不必要的计算
  int MNS_6(int n);//将问题转化为求最长不下降序列
  const int N = 10;
  int c[N+1] = {0,8,7,4,2,5,1,9,3,10,6};
  int s[N+1][N+1];
  int a[N+1][N+1];
  int b[N+1][N+1];
  int pre[N+1]; //上一行记录
  int cur[N+1]; //当前行记录
  int S[N+1]; //记录到元素i为止的最长上升子序列的长度
  int main()
  cout 《《 MNS(N, N) 《《
  cout 《《 MNS_2(N) 《《
  cout 《《 MNS_3(N) 《《
  cout 《《 MNS_4(N) 《《
  cout 《《 MNS_5(N) 《《
  cout 《《 MNS_6(N) 《《
  Traceback_1(N);
  Traceback_2(N);
  Traceback_3(N);
  return 0;
  int MNS(int i, int j)//自顶向下的备忘录算法
  if (s[i][j] 》 0)
  return s[i][j];
  if (i == 1) //处理第一根导线
  s[i][j] = (j 《 c[i]) ? 0 : 1;
  s[i][j] = MNS(i-1, j);
  if (j 》= c[i] && MNS(i-1, c[i]-1)+1 》 s[i][j])
  s[i][j] = s[i-1][c[i]-1] + 1; //s[i-1][c[i]-1]在if语句中记录过了
  return s[i][j];
  int MNS_2(int n)//自底向上的动态规划算法
  //先处理第一根导线
  for (int j=1; j《c[1]; j++)
  s[1][j] = 0;
  for (int j=c[1]; j《=n; j++)
  s[1][j] = 1;
  //然后处理中间的导线
  for (int i=2; i《n; i++)
  for (int j=1; j《c[i]; j++)
  s[i][j] = s[i-1][j];
  for (int j=c[i]; j《=n; j++)
  s[i][j] = (s[i-1][c[i]-1]+1 》 s[i-1][j]) ? s[i-1][c[i]-1]+1 : s[i-1][j];
  //再处理最后一根导线
  s[n][n] = (s[n-1][c[n]-1]+1 》 s[n-1][n]) ? s[n-1][c[n]-1]+1 : s[n-1][n];
  return s[n][n];
  void Traceback_1(int n) //输出满足条件的导线
  int j =
  for (int i=n; i》1; i--)
  if (s[i][j] 》 s[i-1][j])
  cout 《《 i 《《 & - & 《《 c[i] 《《
  j = c[i] - 1;
  if (j 》= c[1])
  cout 《《 1 《《 & - & 《《 c[1] 《《
  void Traceback_2(int n) //输出满足条件的导线
  int j =
  for (int i=n; i》1; i--)
  if (a[i][j] 》 a[i-1][j])
  cout 《《 i 《《 & - & 《《 c[i] 《《
  j = c[i] - 1;
  if (j 》= c[1])
  cout 《《 1 《《 & - & 《《 c[1] 《《
  void Traceback_3(int n) //输出满足条件的导线
  int j =
  for (int i=n; i》1; i--)
  if (b[i][j] 》 b[i-1][j])
  cout 《《 i 《《 & - & 《《 c[i] 《《
  j = c[i] - 1;
  if (j 》= c[1])
  cout 《《 1 《《 & - & 《《 c[1] 《《
  int MNS_3(int n)//优化的动态规划算法
  //先处理第一根导线
  for (int j=1; j《c[1]; j++)
  pre[j] = 0;
  for (int j=c[1]; j《=n; j++)
  pre[j] = 1;
  //然后处理中间的导线
  for (int i=2; i《n; i++)
  { //处理当前行cur
  for (int j=1; j《c[i]; j++)
  cur[j] = pre[j];
  for (int j=c[i]; j《=n; j++)
  cur[j] = (pre[c[i]-1]+1 》 pre[j]) ? pre[c[i]-1]+1 : pre[j];
  //复制当前行信息cur到pre
  for (int j=1; j《=n; j++)
  pre[j] = cur[j];
  //再处理最后一根导线
  cur[n] = (pre[n-1]+1 》 pre[n]) ? pre[n-1]+1 : pre[n];
  return cur[n];
  int MNS_4(int n)//另一种思路的动态规划算法,与最长公共子序列很相似
  for (int i=1; i《=n; i++)
  for (int j=1; j《=n; j++)
  if (j == c[i])
  a[i][j] = a[i-1][j-1] + 1;
  a[i][j] = max(a[i-1][j], a[i][j-1]);
  return a[n][n];
  int MNS_5(int n)//对算法4的改进:分阶段讨论,避免不必要的计算
  for (int i=1; i《=n; i++)
  for (int j=1; j《c[i]; j++)//在接线柱c[i]的左侧区域,最优解与不包含接线柱i的一致
  b[i][j] = b[i-1][j];
  b[i][c[i]] = b[i-1][c[i]-1] + 1;
  for (int j=c[i]+1; j《=n; j++)//在接线柱c[i]的右侧区域,最优解可能包含接线柱i,也可能不包含i
  b[i][j] = max(b[i-1][j], b[i][j-1]);
  return a[n][n];
  int MNS_6(int n)//将问题转化为求最长不下降序列
  S[1] = 1; //默认到元素i为止的最长上升子序列的长度为1
  for (int i=2; i《=n; i++)
  int m = 0;
  for (int j=i-1; j》0; j--)//逆序查找不大于A[i],且最长的元素
  if (c[i] 》 c[j] && S[j] 》 m)
  m = S[j];
  S[i] = m + 1;
  int len = S[n];
  for (int i=n-1; i》0; i--)
  if (S[i] 》 len)
  len = S[i];
关注电子发烧友微信
有趣有料的资讯及技术干货
下载发烧友APP
打造属于您的人脉电子圈
关注发烧友课堂
锁定最新课程活动及技术直播
声明:电子发烧友网转载作品均尽可能注明出处,该作品所有人的一切权利均不因本站而转移。
作者如不同意转载,既请通知本站予以删除或改正。转载的作品可能在标题或内容上或许有所改动。
动态规划算法相关文章
动态规划算法相关下载
电路布线相关文章
电路布线相关下载
论坛精华干货
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司
电信与信息服务业务经营许可证:粤B2-10大原则7大步骤搞定电路简化问题
电路问题是初中物理比较难的知识,也是中考很重要的一部分,占中考物理分数的40%。很多同学遇到电路类的题目,摆在面前的第一个问题就是不会简化电路图。
电路简化的基本原则
初中物理电学中的复杂电路可以通过如下原则进行简化:
第一:不计导线电阻,认定R线≈0。有电流流过的导线两端电压为零,断开时开关两端可以测得电压(电路中没有其他断点)。
第二:开关闭合时等效于一根导线;开关断开时等效于断路,可从电路两节点间去掉。开关闭合有电流流过时,开关两端电压为零,断开时开关两端可以测得电压(电路中没有其他断点)。
第三:电流表内阻很小,在分析电路的连接方式时,有电流表的地方可看作一根导线。
第四:电压表内阻很大,在分析电路的连接方式时,有电压表的地方可视作断路,从电路两节点间去掉.
第五:用电器(电阻)短路:用电器(电阻)和导线(开关、电流表)并联时,用电器中无电流通过(如下图示),可以把用电器从电路的两节点间拆除(去掉)。
第六:滑动变阻器Pa段被导线(金属杆)短接不工作,去掉Pa段后,下图a变为图b。
第七:根据串、并联电路电流和电压规律“串联分压、并联分流”分析总电流、总电压和分电流、分电压的关系。
第八:电流表和哪个用电器串联就测哪个用电器的电流,电压表和哪个用电器并联就测哪个用电器的电压。判断电压表所测量的电压可用滑移法和去源法。
第九:电压表原则上要求并联在电路中,单独测量电源电压时,可直接在电源两端。
一般情况下,如果电压表串联在电路中,测得的电压是电源两端电压(具体情况见笔记)。电流表直接接在电源两端会被烧坏,且让电源短路,烧坏电源。
第十:如果导线上(节点之间)没有用电器(开关,电流表除外),那么导线上的各点可以看做是一个点,可以任意合并、分开、增减。(此法又称节点法)例如:
电路简化步骤
第一步:按照题目要求将断开的开关去掉,将闭合的开关变成导线。
第二步:将电流表变成导线(视具体情况也可保留)。
第三步:去掉电压表。
第四步:合并(或者换位)导线上的节点。(此步骤在电路中用电器比较多,且相互纠结时,采用)
第五步:画出等效电路图,判断各用电器是串联还是并联。
第六步:在原电路中利用原则七、八判断电流表和电压表各测量哪个用电器的电流和电压。
第七步:将电压表和电流表添加到等效电路图中,分析各电流表和电压表示数之间的关系。(利用原则七)
经典例题选讲
例1:在如下电路图中,开关S闭合后,电压表V1的示数是2.5V,V2的示数是1V,如果A2的示数是0.2A,那么A1的示数是多少?试求两只灯泡两端的电压。
分析:第一步:将开关变成导线;
第二步:将电流表变成导线;
第三步将电压表去掉。
第四步(略)
第五步:判断用电器连接方式
很显然,电路中两个灯泡是串联的。
第六步:根据原则四,知道电压表V2处断开,所以没有电流从A1流过,示数为零;根据滑移法知道V1和电源并联,测电源两端电压。V2和L2并联,测L2两端电压。
第七步:等效电路图如下:
根据等效电路图,可知所求I1=I2=0.2A
U1=2.5V-1V=1.5V U2=1V
例2 :如图示,开关s闭合后下列各电压表示数的关系是,各电流表示数之间的关系是___。
分析:第一步:把开关变成导线;
第二步:把电流表变成导线;
第三步:去掉电压表;第四步(略);
第五步:判断各用电器的连接方式:
第六步:根据原则七和原则八以及滑移法或去源法判断电流表和电压表各自所测量的对象。
①在原电路中,去掉电压表,可以发现电流表A1和A2都与灯泡串联,所以电流表示数相等;
②用滑移法可以判断出V1测L1两端的电压,V2测电源两端的电压;V3测L2两端的电压。
第七步:等效电路图如下
例3:如图所示,已知两只灯泡L1和L2是串联的,则在①、②和③三个电表中(电流表或电压表)判断正确的是( )
A、①是电流表,②和③是电压表
B、 ①和③是电压表,②是电流表
C、①和②是电流表,③是电压表
D、①②和③都是电流表
分析:本题可用排除法解答。将A答案的各表填入
三个位置中,根据“十原则,七步骤”电路图简化为:
很明显,不符合题意。
将B答案各表填入图中,电路可简化为:
这种填法符合题意。
把C答案各表填入电路中,电路L1被断路,简化后的电路图和A答案相同,不合题意。把D答案各表填入图中,电源短路,两个灯泡没有电流流过,不合题意。所以选择答案B。
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点关于基尔霍夫定律的问题(电路基础)两组蓄电池并联,求(1)各支路电流;(2)两个电源的输出功率麻烦能不能 把具体的算法列出来下 谢谢了
分类:物理
先把一个电源(如90V的电源)看成导线,计算另一电源(120V的)单独作用于此电路时此电路时各路的电流;然后再把120V的电源看成导线,单独计算90v作用于此电路的各路电流.将以上两电流叠加就可以了.接下来根据流过各个电源的电流求电源功率.主要就是考叠加定理
a大于0开口向上 反之向下 b大于0顶点在Y轴左边
5(3x的平方y-xy的平方)-(xy的平方+3x的平方y) =1
怎样在计算器上求标准差
若y=根号下1-2x +根号下2x-1 +根号下(x-1)的平方
由题意得 1-2x≥0,x=1/2 所以 x=1/2 此时y=0+0+|x-1|=1/
已知x是最大的负整数,y是绝对值最小的有理数,则
x是最大的负整数 则x=-1 y是绝对值最小的有理数
其他相关问题陈洪亮老师主编的电路基础的习题答案解析
想看解析 没有解析的题目做了也没什么成效
&必修5答案及解析...百度文库里有大量的题材,搜集一下吧,,能找得到的......
病情分析:
平常一定注意保养,少讲话,注意防止受凉。建议你一定要禁辛辣食物。关键是平常一定要多次,经常,喝水。可以使用金银花泡水喝,关键是平常保养防止复发。这个...
焦耳(简称焦,英文缩写为J)是热量、能量和功的国际单位。焦耳的定义是1牛顿力使物体移动1米的功。1焦耳=1牛顿米=瓦特秒=0.24卡
答: 嗅探TCP/IP与以太网以太网和TCP/IP可以说是相辅相成的,可以说两者的关系几乎是密不可分,以太网在一二层提供物理上的连线,而TCP/IP工作在上层,使用3...
答: 唉~········无语
答: Internet发展史 国际互联网是美国高科技发展的结果,同时也是美国政府出于军事目的不得已而为之的产物。为了分散因遭遇外国核武器打击本国军事指挥控制系统所带来...
大家还关注
Copyright &
Corporation, All Rights Reserved
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:1234567891011121314152被浏览204分享邀请回答0添加评论分享收藏感谢收起写回答

我要回帖

更多关于 电路基础 的文章

 

随机推荐