biweekly-contest-16

好久没刷 leetcode,现在居然出了夜喵专场。比赛结束的时候已经凌晨 12 点了。这一场主要的用到的知识有动态规划,BFS。

torch.distributed 中 Collective functions 的使用方式

使用 pytorch 中的分布式包可以轻松的实现并行计算,但是在官方文档中没有 Collective functions 的示例代码,而且网络上对这方面的介绍也比较少。对并行计算不熟悉的人使用起来可能会有点小问题,因此这里通过简单的代码展示了如何去使用 Collective functions。

[论文笔记] Gossip Learning

提出 Gossip Learning,与 Federated Learning 做比较,实验表明使用 Gossip Learning 训练的模型在一定时间过后与Federated Learning 表现相当。

分布式机器学习: 通信机制

分布式机器学习单机版的机器学习最大区别在于,它利用了多个工作节点同时训练、相互合作来加速学习过程。既然需要相互合作,那么通信就成为必不可少的环节。不过,分布式系统中的网络传输速度往往受限,导致通信常常成为分布式系统的瓶颈。举一个简单的例子:如果某个任务中计算与通信的时间占比为 1:1, 那么根据阿姆达尔定律(Amdahl's law),无论使用多少台机器做并行运算,其加速比都不会超过两倍。因此,分布式机器学习的关键是设计通信机制,从而降低通信与计算的时间比例,更加高效地训练出高精度的模型。

贪吃蛇小游戏--SFML实现

经典游戏 —- 贪吃蛇。游戏的实现很简单,只要理清需要用什么数据结构表示蛇以及更新逻辑就好。这里使用 SFML 实现。

一、蛇的表示

我们可以将蛇身体每一部分存储起来,这里只需要储存每一部分的坐标值。如下

1
2
3
4
5
6
7
8
9
struct SnakeSegment {
int x, y;

SnakeSegment(int xx, int yy): x(xx), y(yy) {}

bool operator == (const SnakeSegment& other) {
return this->x == other.x && this->y == other.y;
}
};

二、更新逻辑

这里的话,我们需要考虑的逻辑有:

  • 在每一步的更新中,蛇的每一部分的坐标都在变化
  • 如果撞到自身,那么游戏重新开始
  • 判断是否吃到了食物
  • 边界处理

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void update() {
int n = snake.size();

for (int i = 0; i < n-1; i++)
snake[i] = snake[i+1];

if (dir == 0) snake[n-1].x--; if (dir == 1) snake[n-1].y++;
if (dir == 2) snake[n-1].x++; if (dir == 3) snake[n-1].y--;

if (std::find(snake.begin(), snake.end()-1, snake[n-1]) != snake.end()-1)
init();

if (snake[n-1].x == fruit.x && snake[n-1].y == fruit.y) {
fruit.x = rand() % (windowWidth-2)+1;
fruit.y = rand() % (windowHeight-2)+1;
snake.push_back(snake[n-1]);
}

if (snake[n-1].x >= windowWidth-1) snake[n-1].x = 1;
if (snake[n-1].x < 1) snake[n-1].x = windowWidth-2;

if (snake[n-1].y >= windowHeight-1) snake[n-1].y = 1;
if (snake[n-1].y < 1) snake[n-1].y = windowHeight-2;
}

三、其他东西

剩下的就是世界的绘制键盘事件的处理,这两部分实现比较简单,这里就不贴代码了。完整代码可以参见这里

游戏展示:


四、后续

作为展示,贪吃蛇游戏的代码实现过程较为简单,很多小细节没有去处理。例如,吃到食物之后蛇的身体没有立马更新、食物的随机生成没有考虑与蛇冲突、没有分数的展示等等,感兴趣的小伙伴可以动手去实现自己的贪吃蛇小游戏。😃