【CCCC】L3-023 计算图 (30分),dfs搜索+偏导数计算
problem
L3-023 计算图 (30分)
“计算图”(computational graph)是现代深度学习系统的基础执行引擎,提供了一种表示任意数学表达式的方法,例如用有向无环图表示的神经网络。 图中的节点表示基本操作或输入变量,边表示节点之间的中间值的依赖性。 例如,下图就是一个函数 f(x
1
,x
2
)=lnx
1
+x
1
x
2
−sinx
2
的计算图。
figure.png
现在给定一个计算图,请你根据所有输入变量计算函数值及其偏导数(即梯度)。 例如,给定输入x
1
=2,x
2
=5,上述计算图获得函数值 f(2,5)=ln(2)+2×5−sin(5)=11.652;并且根据微分链式法则,上图得到的梯度 ∇f=[∂f/∂x
1
,∂f/∂x
2
]=[1/x
1
+x
2
,x
1
−cosx
2
]=[5.500,1.716]。
知道你已经把微积分忘了,所以这里只要求你处理几个简单的算子:加法、减法、乘法、指数(e
x
,即编程语言中的 exp(x) 函数)、对数(lnx,即编程语言中的 log(x) 函数)和正弦函数(sinx,即编程语言中的 sin(x) 函数)。
友情提醒:
常数的导数是 0;x 的导数是 1;e
x
的导数还是 e
x
;lnx 的导数是 1/x;sinx 的导数是 cosx。
回顾一下什么是偏导数:在数学中,一个多变量的函数的偏导数,就是它关于其中一个变量的导数而保持其他变量恒定。在上面的例子中,当我们对 x
1
求偏导数 ∂f/∂x
1
时,就将 x
2
当成常数,所以得到 lnx
1
的导数是 1/x
1
,x
1
x
2
的导数是 x
2
,sinx
2
的导数是 0。
回顾一下链式法则:复合函数的导数是构成复合这有限个函数在相应点的导数的乘积,即若有 u=f(y),y=g(x),则 du/dx=du/dy⋅dy/dx。例如对 sin(lnx) 求导,就得到 cos(lnx)⋅(1/x)。
如果你注意观察,可以发现在计算图中,计算函数值是一个从左向右进行的计算,而计算偏导数则正好相反。
输入格式:
输入在第一行给出正整数 N(≤5×10
4
),为计算图中的顶点数。
以下 N 行,第 i 行给出第 i 个顶点的信息,其中 i=0,1,⋯,N−1。第一个值是顶点的类型编号,分别为:
0 代表输入变量
1 代表加法,对应 x
1
+x
2
2 代表减法,对应 x
1
−x
2
3 代表乘法,对应 x
1
×x
2
4 代表指数,对应 e
x
5 代表对数,对应 lnx
6 代表正弦函数,对应 sinx
对于输入变量,后面会跟它的双精度浮点数值;对于单目算子,后面会跟它对应的单个变量的顶点编号(编号从 0 开始);对于双目算子,后面会跟它对应两个变量的顶点编号。
题目保证只有一个输出顶点(即没有出边的顶点,例如上图最右边的 -),且计算过程不会超过双精度浮点数的计算精度范围。
输出格式:
首先在第一行输出给定计算图的函数值。在第二行顺序输出函数对于每个变量的偏导数的值,其间以一个空格分隔,行首尾不得有多余空格。偏导数的输出顺序与输入变量的出现顺序相同。输出小数点后 3 位。
输入样例:
7
0 2.0
0 5.0
5 0
3 0 1
6 1
1 2 3
2 5 4
输出样例:
11.652
5.500 1.716
- 给出一张图(AOV网?)
- 计算汇点的值
solution
- 考虑直接搜索+记忆化
- 结果节点编号不一定为n-1,否则会WA3,4,5
- 微积分没学,计算公式不太会,参考了一下别人的
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e4+10;struct node{int op, left, right; //运算符和数值double val; //当前节点的值int post; //后继节点的
}a[maxn];
map<int,map<int,map<int,double>>>f;//记忆化数组//第一个参数为结点,第二个参数决定是否求导,第三个参数是对谁求导
double calc(int nd, int key, int p){if(f[nd][key][p])return f[nd][key][p];int id = a[nd].op;if(id==0)return f[nd][key][p] = (key == 0 ? a[nd].val : (nd == p ? 1 : 0)); if(id==1)return f[nd][key][p] = calc(a[nd].left, key, p) + calc(a[nd].right, key, p); if(id==2)return f[nd][key][p]= calc(a[nd].left, key, p) - calc(a[nd].right, key, p); if(id==3)return f[nd][key][p] = (key ? calc(a[nd].left, key, p) * calc(a[nd].right, 0, p) + calc(a[nd].left, 0, p) * calc(a[nd].right, key, p) : calc(a[nd].left, key, p) * calc(a[nd].right, key, p)); if(id==4)return f[nd][key][p]=(key ? exp(calc(a[nd].left, 0, p)) * calc(a[nd].left, key, p) : exp(calc(a[nd].left, key, p)));if(id==5)return f[nd][key][p] = (key ? 1 / (calc(a[nd].left, 0, p)) * (calc(a[nd].left, key, p)) : log(calc(a[nd].left, key, p)));if(id==6)return f[nd][key][p] = (key ? cos(calc(a[nd].left, 0, p)) * calc(a[nd].left, key, p) : sin(calc(a[nd].left, key, p)));
}int main(){int n; cin>>n;for(int i = 0; i < n; i++){cin>>a[i].op;if(a[i].op==0){cin>>a[i].val;}else if(a[i].op<=3){cin>>a[i].left>>a[i].right;a[a[i].left].post = 1;a[a[i].right].post = 1;}else{cin>>a[i].left;a[a[i].left].post = 1;}}int ed = 0, ok=0;while(a[ed].post)ed++;printf("%0.3lf\n",calc(ed,0,-1));for(int i = 0; i < n; i++){if(a[i].op==0){if(ok)cout<<" ";printf("%0.3lf",calc(ed,1,i));ok = 1;}}return 0;
}
【CCCC】L3-023 计算图 (30分),dfs搜索+偏导数计算相关推荐
- 【CCCC】L3-014 周游世界 (30分),,DFS搜索最短路,路径打印
problem L3-014 周游世界 (30分) 周游世界是件浪漫事,但规划旅行路线就不一定了-- 全世界有成千上万条航线.铁路线.大巴线,令人眼花缭乱.所以旅行社会选择部分运输公司组成联盟,每家公 ...
- 【CCCC】L3-015 球队“食物链” (30分),搜索排列
problem L3-015 球队"食物链" (30分) 某国的足球联赛中有N支参赛球队,编号从1至N.联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场. 联赛战罢,结 ...
- 重返天梯-L3-014 周游世界 (30 分)(dfs)
题目描述 周游世界是件浪漫事,但规划旅行路线就不一定了-- 全世界有成千上万条航线.铁路线.大巴线,令人眼花缭乱.所以旅行社会选择部分运输公司组成联盟,每家公司提供一条线路,然后帮助客户规划由联盟内企 ...
- 【CCCC】L3-009 长城 (30分),计算几何+凸包,极角排序
problem L3-009 长城 (30分) 正如我们所知,中国古代长城的建造是为了抵御外敌入侵.在长城上,建造了许多烽火台.每个烽火台都监视着一个特定的地区范围.一旦某个地区有外敌入侵,值守在对应 ...
- 【CCCC】L3-021 神坛 (30分)计算几何+求三角形面积(极角排序)
problem L3-021 神坛 (30分) 在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如 ...
- 【CCCC】L3-011 直捣黄龙 (30分),Dijkstra维护点权,节点数,路径条数等+路径打印
problem L3-011 直捣黄龙 (30分) 本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营 ...
- L3-023 计算图 (30 分)--PAT 团体程序设计天梯赛 GPLT
"计算图"(computational graph)是现代深度学习系统的基础执行引擎,提供了一种表示任意数学表达式的方法,例如用有向无环图表示的神经网络. 图中的节点表示基本操作或 ...
- 地下迷宫探索 30分 dfs
地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...
- 【CCCC】L3-026 传送门 (30分),splay(待复盘)
problem 7-14 传送门 平面上有 2n 个点,它们的坐标分别是 (1,0),(2,0),⋯(n,0) 和 (1,10 9 ),(2,10 9 ),⋯,(n,10 9 ...
最新文章
- 组策略 从入门到精通(十)通过组策略进行软件分发和卸载
- [转载] 晓说——第16期:古代科举那些事——由来
- 【深度学习入门到精通系列】阿里云人工智能平台的使用方法
- AndroidOrientation Sensor(方向传感器),新的替代方法详解(安卓官方提供)
- VTK:libvtkGUISupportQt-6.3.so.1: cannot open shared object
- bundle传递对象与Serializable、Parcelable接口理解和思考
- 汇编语言程序设计,计算比赛成绩
- 什么时候可以升级HarmonyOS,华为鸿蒙OS即将迎来升级 手机版本或仍需时间
- BugkuCTF-Reverse题NoString
- C语言(CED)递归实现汉诺塔问题
- mybatis3.1-[topic-16-17]-映射文件_增删改查_insert_获取自增主键的值
- nodejs 最简单的文件接收
- azure_Azure Analysis Services中的动态分区(表格)
- 在macOS Big Sur上如何重置蓝牙?
- bat 暂停一段时间_BAT面试问是否具备3年工作经验,这么回答绝了!
- woocommerce产品选项描述修改_WooCommerce微信小程序直播功能接入指引
- 关于软件开发的那些事(三):聊聊软件项目管理及成本核算
- 超简单的HIDPI设置
- mysql特殊字符转义_MYSQL特殊字符转义
- 微信分享网页时自定义标题描述和图片
热门文章
- WinEdt LaTex(一)—— hello world!
- Python 数据结构与算法 —— 插入排序
- Tricks(二十四)—— python 复合(嵌套)数据结构
- numpy 常用api(二)
- C++基础:: struct vs class
- 帖子如何实现显示浏览次数_我是如何一步步的在并行编程中将lock锁次数降到最低实现无锁编程...
- python optimize_python多元拟合问题
- python从入门到精通需要多久-Python从入门到精通
- python零基础自学教材-Python3零基础教材电子书合集
- python最适合做什么-python能做什么,适不适合新手学?