SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 5084|回复: 1
打印 上一主题 下一主题

[ai] AI如何选择“最优”目标

[复制链接]

21

主题

36

帖子

334

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
334
跳转到指定楼层
楼主
发表于 2020-8-24 16:43:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
  • 攻击分数必须>0才会执行该次攻击;
  • 有多个分数>0时,选择最大分数的攻击;
  • 存在多个节拍时,最后分数不是简单的各节拍分数乘;像chance_to_hit是累加;
  • 初始形成的可攻击部队vector不能决定节拍序。例如有三个只或攻击部队:司马懿、张辽、乐进。

#1:以司马懿为第一部队为各个排列;
#2:司马懿被压回,改为以张辽为第一部队的各个排列;
#3:张辽被压回,改为以乐进为第一部队的各个排列;


程序发现当前团队是AI,它首先进入战斗阶段,即判断是否有单位可以对敌对单位执行攻击。

这个攻击就要使用特定算法,找到一个“最优”目标。为了找到个目标,一般分为几个步骤:

1、分析出当前AI集团能攻击到的所有目标,{UNIT_MY, UNIT_E}。
UNIT_MY:本团队中的所有单位;
UNIT_E:能到达的目标

2、在{UNIT_M, UNIT_E}中找到一个“最优”目标。
以rating来表示这个,rating越大,则移动到这一目标进行攻击的能获得的利益越大。

(1):rating = chance_to_kill*target_value - avg_losses*(1.0-aggression)
主要体现在花费的金的成本上。change_to_kill*target_value:此次攻击能造成对方损失多少金,avg_losses*(1.0-aggression)此次攻击能造成已方损失多少金。

(2):rating /= (resources_used + 2*terrain_quality) / 3;
把得到的优处分摊到每一单位钱上。resources_used是此次攻击使用了多少$,
回复

使用道具 举报

21

主题

36

帖子

334

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
334
沙发
 楼主| 发表于 2020-8-24 16:44:41 | 只看该作者

分数

计算分数,商品交易来说,利润=收益-成本;在这当中同一利润要是不同成本,其结果也是不同,因而往往采用利润率:利润率=(收益-成本)/成本。把这概念扩展到此中的AI攻击中,利润率就是我们要计算的目标:分数;收益是攻击给我方带来的好处,相应地就是给对方造成的损失;成本是攻击时我方需付出的代价,像哪只部队HP降低多少。以下是计算分数采用的公式。
  1. 分数 = (攻击获得收益 - 攻击需付出代价) / 攻击需付出代价
复制代码
公式修正一:侵略指数(aggression)
aggression指示AI侵略程度,或叫冒险程度。aggression和某次攻击无关,它是全局参数,取值范围[0, 1]。当是1时,会“完全”顾虑攻已会给已方造成的损失,为0时一点都不顾给已方造成的损失。由于AI和玩家打时,往往都是以低素质部队对抗强素质,设1时往往AI都不进攻了(成本大于收收益,分数是负值),默认侵略指数是0.5(也是当前正在用的指数值)。修正后的公式。

  1. 分数 = (攻击带来收益 - (1 - aggression) * 攻击需付出代价) / ((攻击需付出代价 + 2 * 地形品质) / 3)
复制代码
公式修正二:地形品质(terrain_quality)、地形品质指数
要是此次攻击我方会城站城墙、深水,在这两种地形上结果那是差别很大的。由于城墙防御、攻击都比深水高,这在收益、代价中或多或少已有体现,但这种体现往往是不够的。在公式中多加一个称做地形品质的参数,值越大表示品质越差,相应地结果计算出分数越低。地形品质融入公式是以着修正分母方式,去影响分母中“攻击需付出代价”,但不影响分子中那个代价。品质指数是1时,没加成也没减少,此时地形品质等于付出代价。修正后的公式。
  1. 分数 = (攻击带来收益 - (1 - aggression) * 攻击需付出代价) / ((攻击需付出代价 + 2 * 地形品质) / 3)
复制代码
或攻击带来的好处、或攻击需付出的代价,代们需要统一用一个标准去计算,这个标准是什么:金。

攻击带来收益
攻击会让对方部队损失HP,甚至有可能消灭部队,招募部队是要钱的,这等于让对方损失金。在设计MOD时,某兵种需更多金时往往意味着该兵种越重要,这使得可以用金去衡量攻击带来的好处。当然,收益中只兵种成本是不够的,像一只多XP部队往往要比少XP部队重要,因为它花费了对方更多的战斗时间,此时就要把部队已有XP换算到以金为单位,换算采用2点xp等于1金。除了HP、XP这种“正常”收益,还要有额外部分,像攻灭一只部队,攻必灭往往要攻击时要追求目标,依据这条件原则,只要灭掉一只部队,要给好处加成。

攻击付出代价
攻击会让已方部队损失HP,甚至有可能因为对方反击被灭部队,招募部队是要钱的,这等于让已方损失金,类似衡量收益,这使得可以用金去衡量攻击需付出的代价。当然,代价中只兵种成本是不够的,像一只多XP部队往往要比少XP部队重要,因为它花费了已方更多的战斗时间,此时就要把部队已有XP换算到以金为单位,换算采用2点xp等于1金。除了HP、XP这种“正常”损失,还要有额外部队,像被灭一只部队,被灭部队加重代价。

有了衡量标准,接下是具体参数。

归属变量名语义公式注释
收益target_value防御部队成本、XP价值(1 + 0.5 * double(experience()) / double(max_experience())) * cost()
收益chance_to_kill防御部队被杀死机率(注1) 累积值。杀掉HP占当前HP的百分比
成本resources_used攻击部队成本、XP价值(1 + 0.5 * double(experience()) / double(max_experience())) * cost()要表示的语义上类同target_value
成本avg_losses攻击需付出兵种成本、XP代价 要表示的语义上类同chance_to_kill * target_value
成本terrain_quality地形品质,它是包含地形因素的“防御部队造价+xp”所有“节拍攻击部队成本、XP * 节拍地形品质指数”和累积值,品质指数为1时等于resources_used

注:
1:兵种中设定的成本是满HP时造价,攻击只是造成损失一部分HP,因而不能以满HP时的造价作为攻击收益。杀死防御部队机率指的是杀死防御部队可能性,但我们知道要是此次攻击造成的最多只能48HP,而防御部队当前有67点,那无论怎么杀也不可能杀死,即杀死防御部队可能性就是零。处此机率不是指这个可能性,而是杀掉HP占当前HP的百分比,有了这个百分比、加上总造价,就能计算出此次攻击能带来的好处。

chance_to_kill * target_value就可形成攻击带来好处一个主要部分。它计算了部队造价、部队XP给带来收益。

为加深理解,以韩嵩攻击诸葛亮例说明各参数的计算过程。

韩嵩攻击诸葛亮反击
3x83x9


参数说明
target_value34.2073(1 + 0.5 * double(1) / double(82)) * 34
chance_to_kill0.2621
resources_used50.263(1 + 0.5 * double(2) / double(190)) * 50
avg_losses12.897
target_starting_damage0
avg_damage_inflicted27
avg_damage_taken20
terrain_quality10.052韩嵩站城墙上,地形品质等于0.2 * (110 / 100) * resources_used
value0.1802
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-5-2 05:07 , Processed in 0.063934 second(s), 23 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表