Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在海军交战中寻找目标舰艇的最佳解决方案_Algorithm_Optimization - Fatal编程技术网

Algorithm 在海军交战中寻找目标舰艇的最佳解决方案

Algorithm 在海军交战中寻找目标舰艇的最佳解决方案,algorithm,optimization,Algorithm,Optimization,我在两个n舰和m舰舰队之间交战,友军舰队中的每艘船都有自己的齐射伤害,敌方舰队中的每艘船都有自己的生命值。该算法的目标是找到最佳解决方案(如果存在此类解决方案),以确定如何将目标分配给您的舰艇(例如:我的舰队中的1号舰艇将目标分配给您的舰队中的3号舰艇),从而使齐射对敌方舰队造成的伤害最大化 重要的。所谓伤害,我指的是被摧毁的敌舰的伤害/生命值。如果一艘敌舰的生命值为100,并能处理20 dmg,则其“值”为100/20=5。所以摧毁那艘船得5分。最后,只考虑被毁船只的分数。如果单次齐射无法摧毁

我在两个n舰和m舰舰队之间交战,友军舰队中的每艘船都有自己的齐射伤害,敌方舰队中的每艘船都有自己的生命值。该算法的目标是找到最佳解决方案(如果存在此类解决方案),以确定如何将目标分配给您的舰艇(例如:我的舰队中的1号舰艇将目标分配给您的舰队中的3号舰艇),从而使齐射对敌方舰队造成的伤害最大化

重要的。所谓伤害,我指的是被摧毁的敌舰的伤害/生命值。如果一艘敌舰的生命值为100,并能处理20 dmg,则其“值”为100/20=5。所以摧毁那艘船得5分。最后,只考虑被毁船只的分数。如果单次齐射无法摧毁任何船只,那么分数将包括受损船只

我尝试过贪婪法、迭代改进法和爬山法,但它们都不能达到最优解。我还尝试了另一种方法,即制作大量随机目标选择集,并对其进行评估,然后从所有目标选择集中选出最好的一个。这是一个已经产生了最好的结果,但它是难以置信的效率,几乎从来没有产生最佳的结果

我相信必须有一种计算最优解决方案的方法,不需要检查每一个可能的目标选择,但我找不到这样做的方法。看起来这个问题就像是一个奇怪的多重背包问题。背包是敌人的生命池,物品是射击的dmg值。除了这一次,最后放入背包的物品可能会超过背包的尺寸限制,但只有适合背包的物品价值的一部分是有用的


即使这不是问题的解决方案,任何想法或帮助都非常感谢

必须与深度优先算法非常相似,该算法将尝试找到最佳路线,然后返回每艘船的最佳路线并返回。每艘飞船应该瞄准的一系列目标将在这里完美地完成任务。在本例中,决策变量是整数,因此我们要处理。
下面是一个关于如何将问题建模为线性规划的小说明

Data:
F_dmg[n] // an array containing the damage of friendly ships
E_hp[m]  // an array containing the hp points of the ennemy ships
M        // constant, the highest hp among all ships
V[m]     // the 'value' of ennemy ships


Decision variables:
X[n][m]     // a matrix of booleans (0 or 1)
            // X[i][j] = 1 if the ship i attacks the ship j, 0 otherwise
Dmg[m]      // an array of integer, representing the total damage taken by each ennemy ship
IsAlive[m]  // an array of booleans, representing the fact that the ship is destroyed or not (0 if dead, 1 if alive)


Constraints:
// a friend ship can attack at most one ennemy ship
for all i in 1..n, sum(j in 1..m) X[i][j] <= 1
// the damage sustained by a ship cannot exceed its hp
for all j in 1..m, sum(i in 1..n) Dmg[m] <= E_hp[j]
// the damage sustained by a ship has to be coherent with the attacks it receives
for all j in 1..m, sum(i in 1..n) Dmg[j] <= X[i][j] * F_dmg[i]
// a ship is destroyed if the damage sustained is equal to its hp
for all j in 1..m, M * IsAlive[j] >= E_hp[j] - Dmg[j] 


Objective function
maximize sum(j in 1..m) (1 - IsAlive[j]) * V[j]
数据:
F_dmg[n]//包含友军船只伤害的数组
E_hp[m]//一个数组,包含九艘飞船的hp点数
M//constant,所有船舶中的最高马力
V[m]//ennemy船舶的“价值”
决策变量:
X[n][m]//布尔矩阵(0或1)
//X[i][j]=1如果飞船i攻击飞船j,则为0
Dmg[m]//一个整数数组,表示每艘ennemy飞船遭受的总伤害
IsAlive[m]//一个布尔数组,表示船是否被摧毁(如果死了0,如果活了1)
限制条件:
//一艘友舰最多可以攻击一艘友舰

对于1..n中的所有i,sum(j in 1..m)X[i][j]这要么是,要么非常类似于


不幸的是,这个问题是NP难的,根据2003年的论文,即使是小到20件武器和20个目标的例子也不能被证明是最优性的。(我只看了摘要。)

我们在谈论多少n和m?最大生命值和最大伤害是多少?他想要优化的不是伤害,而是分数。只有当一艘船受到的伤害超过或等于它的HP时,你才会得到分数,编辑答案。谢谢你的通知:)没问题。根据约束条件的不同,我们也会提出同样的建议,布尔值使其成为整数LP,对吗?否则看起来很好:)谢谢,我可以从描述中“嗅到”问题的NP难度,但我永远也猜不到它的名字。@m.raynal:我记得几年前听说过一些以武器为主题的NP难问题,然后当这个问题出现在武器上时。。。“我不知道这是不是同一个问题……”旁注:我不知道它是否只在我的机器上,但看起来LaTeX编译器确实背叛了论文的作者。。。总和符号在纸上飞来飞去,堆积在一起:-)@m.raynal:这里也是,我想也许我可怜的笔记本电脑需要重新启动!