阅界资讯

编程农场——入坑游玩第一天

阅阅界编辑部2阅读12分钟

《编程农场——入坑游玩第一天》是近期博客园技术区的好帖,信息密度大。下面分段讲清它的核心内容,看到结尾你就知道该怎么做了。

背景 编程农场又史低了,这个游戏在我愿望清单里面待挺久了,因为价格和其他原因,我一直没有购买,于是趁着steam编程游戏节,我直接买下了这款有意思的游戏。 游戏玩法 在购买这款游戏前,我就对这个游戏有所耳闻,这个游戏就是通过编写代码,驱动一个无人机实行自动化收割、种植等功能,而这种自动化生产链游戏,游戏的趣味就在于,通过自己的方式,最大化产线生成效率。

背景 编程农场又史低了,这个游戏在我愿望清单里面待挺久了,因为价格和其他原因,我一直没有购买,于是趁着steam编程游戏节,我直接买下了这款有意思的游戏。 游戏玩法 在购买这款游戏前,我就对这个游戏有所耳闻,这个游戏就是通过编写代码,驱动一个无人机实行自动化收割、种植等功能,而这种自动化生产链游戏,游戏的趣味就在于,通过自己的方式,最大化产线生成效率。 初期思路 这种最大化产线效率显然可以通过编程的方式完成,我们可以写一个程序完成这件事 第一次玩,还没有解锁太多作物,我想着先生产基础的资源,把初期要用到的东西都解锁了,并且防止后面基础资源短缺,于是,我想这先生产干草、木材和胡萝卜,我们需要将这三者的单位时间产量最大化,同时可以保证收支平衡,因为种植胡萝卜需要消耗其他两种作物,我的第一个简单粗暴的想法就是,枚举所有作物分布,同时对任意作物分布找到最优效率路径,但是在实现的过程中,我偷偷计算了一下复杂度,发现哪怕我进行了简化的操作,可能的作物分布依旧达到了可怕的 \(3^{n^2}\) ,这意味着使用暴力,会直接爆炸,同时,从复杂度,也可以看出这是一个np难问题,因此我们要采用一些启发性的方法来求最优解,对于启发式算法,我最擅长的就是模拟退火了,于是我就想使用SA来解决这个问题,模拟退火需要一个清晰的,对于最优解的评估方法,我们所求的最优解是三个产物的产出效率最高,但是因为这个状态考虑起来过于复杂,于是我在开始时想着,因为无人机飞行消耗时间较小,能不能先不考虑飞行的时序,只考虑图中有多少数量的不同作物,即每种作物各占多少格,这样可以大幅减少目标函数的构造难度,我直接统计了田中不同种类作物的数量,然后计算出他们单位时间产出作物数量并求和,但是我在完成之后,发现,如果不考虑无人机的飞行时间和顺序的话,所需要计算的部分全部都是简单的线性计算,那么我们其实可以直接通过线性规划的方式求出其最优解,但是因为写都写了,删除重构是不可能的,于是我决定先将假的SA写好,然后再把目标函数粘贴到另一个副本里面,然后再在已经完成的SA基础上,把目标函数改成考虑时序和移动的做法。

背景 编程农场又史低了,这个游戏在我愿望清单里面待挺久了,因为价格和其他原因,我一直没有购买,于是趁着steam编程游戏节,我直接买下了这款有意思的游戏。 游戏玩法 在购买这款游戏前,我就对这个游戏有所耳闻,这个游戏就是通过编写代码,驱动一个无人机实行自动化收割、种植等功能,而这种自动化生产链游戏,游戏的趣味就在于,通过自己的方式,最大化产线生成效率。 初期思路 这种最大化产线效率显然可以通过编程的方式完成,我们可以写一个程序完成这件事 第一次玩,还没有解锁太多作物,我想着先生产基础的资源,把初期要用到的东西都解锁了,并且防止后面基础资源短缺,于是,我想这先生产干草、木材和胡萝卜,我们需要将这三者的单位时间产量最大化,同时可以保证收支平衡,因为种植胡萝卜需要消耗其他两种作物,我的第一个简单粗暴的想法就是,枚举所有作物分布,同时对任意作物分布找到最优效率路径,但是在实现的过程中,我偷偷计算了一下复杂度,发现哪怕我进行了简化的操作,可能的作物分布依旧达到了可怕的 \(3^{n^2}\) ,这意味着使用暴力,会直接爆炸,同时,从复杂度,也可以看出这是一个np难问题,因此我们要采用一些启发性的方法来求最优解,对于启发式算法,我最擅长的就是模拟退火了,于是我就想使用SA来解决这个问题,模拟退火需要一个清晰的,对于最优解的评估方法,我们所求的最优解是三个产物的产出效率最高,但是因为这个状态考虑起来过于复杂,于是我在开始时想着,因为无人机飞行消耗时间较小,能不能先不考虑飞行的时序,只考虑图中有多少数量的不同作物,即每种作物各占多少格,这样可以大幅减少目标函数的构造难度,我直接统计了田中不同种类作物的数量,然后计算出他们单位时间产出作物数量并求和,但是我在完成之后,发现,如果不考虑无人机的飞行时间和顺序的话,所需要计算的部分全部都是简单的线性计算,那么我们其实可以直接通过线性规划的方式求出其最优解,但是因为写都写了,删除重构是不可能的,于是我决定先将假的SA写好,然后再把目标函数粘贴到另一个副本里面,然后再在已经完成的SA基础上,把目标函数改成考虑时序和移动的做法。 第一版代码 [代码示例略] 显然在仅考虑不同种类作物数量的情况下,这一方法不是最优的,应该采用线性规划的方式求解最优解。

背景 编程农场又史低了,这个游戏在我愿望清单里面待挺久了,因为价格和其他原因,我一直没有购买,于是趁着steam编程游戏节,我直接买下了这款有意思的游戏。 游戏玩法 在购买这款游戏前,我就对这个游戏有所耳闻,这个游戏就是通过编写代码,驱动一个无人机实行自动化收割、种植等功能,而这种自动化生产链游戏,游戏的趣味就在于,通过自己的方式,最大化产线生成效率。 初期思路 这种最大化产线效率显然可以通过编程的方式完成,我们可以写一个程序完成这件事 第一次玩,还没有解锁太多作物,我想着先生产基础的资源,把初期要用到的东西都解锁了,并且防止后面基础资源短缺,于是,我想这先生产干草、木材和胡萝卜,我们需要将这三者的单位时间产量最大化,同时可以保证收支平衡,因为种植胡萝卜需要消耗其他两种作物,我的第一个简单粗暴的想法就是,枚举所有作物分布,同时对任意作物分布找到最优效率路径,但是在实现的过程中,我偷偷计算了一下复杂度,发现哪怕我进行了简化的操作,可能的作物分布依旧达到了可怕的 \(3^{n^2}\) ,这意味着使用暴力,会直接爆炸,同时,从复杂度,也可以看出这是一个np难问题,因此我们要采用一些启发性的方法来求最优解,对于启发式算法,我最擅长的就是模拟退火了,于是我就想使用SA来解决这个问题,模拟退火需要一个清晰的,对于最优解的评估方法,我们所求的最优解是三个产物的产出效率最高,但是因为这个状态考虑起来过于复杂,于是我在开始时想着,因为无人机飞行消耗时间较小,能不能先不考虑飞行的时序,只考虑图中有多少数量的不同作物,即每种作物各占多少格,这样可以大幅减少目标函数的构造难度,我直接统计了田中不同种类作物的数量,然后计算出他们单位时间产出作物数量并求和,但是我在完成之后,发现,如果不考虑无人机的飞行时间和顺序的话,所需要计算的部分全部都是简单的线性计算,那么我们其实可以直接通过线性规划的方式求出其最优解,但是因为写都写了,删除重构是不可能的,于是我决定先将假的SA写好,然后再把目标函数粘贴到另一个副本里面,然后再在已经完成的SA基础上,把目标函数改成考虑时序和移动的做法。 第一版代码 [代码示例略] 显然在仅考虑不同种类作物数量的情况下,这一方法不是最优的,应该采用线性规划的方式求解最优解。 第二版代码-基于线性规划 [代码示例略] 这样我们就得到了基于线性规划的最优解求解代码了,不过这个游戏里面,有一个因素也影响着效率,只不过之前简化时忽略了而已,这个因素就是无人机移动消耗的时间、无人机操作的时间还有时序问题,这个因素其实在游戏中是比较重要的,因为只有一架无人机,移动操作时消耗的时间确实会很多,而如果导入了这个因素,那么这版线性规划的代码就难以解决了。

背景 编程农场又史低了,这个游戏在我愿望清单里面待挺久了,因为价格和其他原因,我一直没有购买,于是趁着steam编程游戏节,我直接买下了这款有意思的游戏。 游戏玩法 在购买这款游戏前,我就对这个游戏有所耳闻,这个游戏就是通过编写代码,驱动一个无人机实行自动化收割、种植等功能,而这种自动化生产链游戏,游戏的趣味就在于,通过自己的方式,最大化产线生成效率。 初期思路 这种最大化产线效率显然可以通过编程的方式完成,我们可以写一个程序完成这件事 第一次玩,还没有解锁太多作物,我想着先生产基础的资源,把初期要用到的东西都解锁了,并且防止后面基础资源短缺,于是,我想这先生产干草、木材和胡萝卜,我们需要将这三者的单位时间产量最大化,同时可以保证收支平衡,因为种植胡萝卜需要消耗其他两种作物,我的第一个简单粗暴的想法就是,枚举所有作物分布,同时对任意作物分布找到最优效率路径,但是在实现的过程中,我偷偷计算了一下复杂度,发现哪怕我进行了简化的操作,可能的作物分布依旧达到了可怕的 \(3^{n^2}\) ,这意味着使用暴力,会直接爆炸,同时,从复杂度,也可以看出这是一个np难问题,因此我们要采用一些启发性的方法来求最优解,对于启发式算法,我最擅长的就是模拟退火了,于是我就想使用SA来解决这个问题,模拟退火需要一个清晰的,对于最优解的评估方法,我们所求的最优解是三个产物的产出效率最高,但是因为这个状态考虑起来过于复杂,于是我在开始时想着,因为无人机飞行消耗时间较小,能不能先不考虑飞行的时序,只考虑图中有多少数量的不同作物,即每种作物各占多少格,这样可以大幅减少目标函数的构造难度,我直接统计了田中不同种类作物的数量,然后计算出他们单位时间产出作物数量并求和,但是我在完成之后,发现,如果不考虑无人机的飞行时间和顺序的话,所需要计算的部分全部都是简单的线性计算,那么我们其实可以直接通过线性规划的方式求出其最优解,但是因为写都写了,删除重构是不可能的,于是我决定先将假的SA写好,然后再把目标函数粘贴到另一个副本里面,然后再在已经完成的SA基础上,把目标函数改成考虑时序和移动的做法。 第一版代码 [代码示例略] 显然在仅考虑不同种类作物数量的情况下,这一方法不是最优的,应该采用线性规划的方式求解最优解。 第二版代码-基于线性规划 [代码示例略] 这样我们就得到了基于线性规划的最优解求解代码了,不过这个游戏里面,有一个因素也影响着效率,只不过之前简化时忽略了而已,这个因素就是无人机移动消耗的时间、无人机操作的时间还有时序问题,这个因素其实在游戏中是比较重要的,因为只有一架无人机,移动操作时消耗的时间确实会很多,而如果导入了这个因素,那么这版线性规划的代码就难以解决了。 第三版代码-添加移动以及时序处理功能的SA 为了解决之前提到的问题,我们又回到了启发性算法上,我们需要重新设计一下SA的目标函数,让他能够处理时序问题,我们可以注意到,无人机对于每个操作的时间是固定的,并且我们只有一台无人机,因此我们可以通过离散化的方式处理时序问题,由于一下子就考虑时序的优化过于困难,我们可以先假定无人机按照固定周期遍历全图,累加全局时间,逐格判断成熟并执行操作,最后统计净产出。

行动建议:收藏这篇,下次碰到同类问题先翻出来对照做一遍。好经验的价值,在于用起来。你最近被这类问题卡过吗? 来源|博客园《编程农场——入坑游玩第一天》,https://www.cnblogs.com/reasa/p/22955697.html

工具方法工具实践

评论(0)

暂无评论,来抢第一条。