假设我们正在设计像 minecraft 的游戏,我们有大量的项目 $ i_1,i_2,i_n \ In i $ < / span>和一堆食谱 $ r_1,r_2,...,r_m \在r $ 。食谱是 $ r :( i \ times \ mathbb {n})^ n \ lightarrow i \ times \ mathbb {n} $ ,这是他们拿一些项目具有非负整数权重,并生成另一个项目的整数数量。

例如,在 minecraft 中的蛋糕配方是:

3牛奶+ 3小麦+ 2糖+ 1鸡蛋<跨越类=“数学集装箱”> $ \ lightarrow $ 1克莱克

......以及火炬的配方是:

1棒+ 1煤层<跨度类=“数学集装箱”> $ \ lightarrow $ 4火炬

一些食谱甚至可以是可逆的,例如: 9钻石<跨度级=“数学集装箱”> $ \ Leftrightarrow $ 1钻石块

如果有一些食谱组合,我们可以反复使用,以便获得我们开始的更多项目,然后游戏均衡差,这可以由玩家利用。 我们更希望我们使用食谱设计游戏,这些食谱可以保护物品或可能丢失一些物品(现实世界中的热力学熵 - 你不能轻易造成烤面包)。

是否有一种有效的算法,可以决定是否有一组配方将:

  • 保存物品?
  • 丢失物品效率低下?
  • 获得物品?

是否有一种有效的算法,可以找到问题的食谱,如果游戏是不平衡的?

我的第一个想法是这里有一个图形结构/最大流量问题,但它非常复杂,并且它类似于背包问题。或者也许它可以被制定为SAT问题 - 这就是我现在正在考虑到它的代码,但更有效的东西可能存在。

我们可以编码矩阵 $ \ mathbf {r} ^ {m \ time n} $ 其中,其中行对应于配方和列对应于项目。如果物品由食谱消耗,则列条目是否定的,如果它由配方产生的阳性,并且如果未使用,则为零。类似于众所周知的图形循环检测矩阵方法,我们可以将 $ \ mathbf {r} $ 升级为一些高功率并获取每行的总和以查看项目总计继续上升,保持平衡或走消极。但是,我并不相信这总是有效。

任何讨论,代码或推荐的读数都非常欣赏。

有帮助吗?

解决方案

这应该是用线性编程可解决。

背景和设置

让状态矢量是您拥有的每个项目数量的矢量。如果可能的物品是牛奶,小麦,糖,鸡蛋,蛋糕,钻石,那么规则

3牛奶+ 3小麦+ 2糖+ 1鸡蛋<跨越类=“数学集装箱”> $ \ lightarrow $ 1克莱克

通过添加 $( - 3,-3,-2,-1,1,0)$ 来影响状态向量。所以,让 $ a_i $ 表示 $ i $ th规则的更改向量。

获得项目

我声称存在一种方法来获得没有绑定IFF的物品的物品,存在线性程序的可行解决方案

$$ a_1 x_1 + \ dots + a_n x_n \ ge(0,0,\ dots,0),x_1 \ ge 0,\ dots,x_n \ ge 0 $$

使得<跨度类=“math-container”> $ a_1 x_1 + \ dots + a_n x_n>(0,0,\ dots,0)$ 。这里 $ \ ge $ 在向量上定义在向量上(即 $ u \ ge v $ iff $ u_i \ ge v_i $ 保存所有 $ i $ ),类似于 $> $ 。这可以表示为线性程序:最大化 $ a_1 x_1 + \ dots + a_n x_n $ 的坐标的总和,受上述不平等。因此,您可以使用线性编程求解器在多项式时间中解决。这告诉了你是否有一种没有绑定的物品的方法。

为什么索赔是真的?嗯,如果有一个可行的线性程序的解决方案,那么它提供了一种在没有绑定的情况下延长一些项目的数量。特别是,如果您从每个项目中开始,则应用规则1 $ x_1 $ times,规则2 $ x_2 $ times等,您将最终与您开始的新状态矢量 $ a_1 x_1 + \ dots + a_n x_n $ < /跨度>至少在每个组件中至少大并且至少一个组件中的严格更大。此外,如果您从足够大量的项目开始,您将永远不会在任何中间应用规则的中间步骤中的“消极”。注意如果存在该线性程序的解决方案,则在理性中存在解决方案,其在整数中产生一个解决方案(乘以适当的常数,以透明分母)。

相反,如果有一种方法来增长某些项目的数量而无限制,则存在线性程序的解决方案:只是让 $ x_i $ count在该方法中应用了次数 $ i $ 的次数,并且您将看到这会对线性程序产生有效的解决方案。

丢失物品

我相信存在类似的等价:在没有绑定IFF的情况下丢失物品的方法存在可行的解决方案

$$ a_1 x_1 + \ dots + a_n x_n \ le(0,0,\ dots,0),x_1 \ ge 0,\ dots,x_n \ ge 0 $$

使<跨度类=“math-container”> $ a_1 x_1 + \ dots + a_n x_n <(0,0,\ dots,0)$ 。你应该检查我的推理,因为我没有仔细检查。

保护

最后,如果没有没有绑定或丢失物品的没有绑定的物品没有办法,那么我认为它遵循该值是节省的。

其他提示

您的问题相当于询问来自您 $ \ mathbb r ^ {m \ times n} $ 矩阵的一些线性组合系数正面和总和到其中(a)每个元素 $ \ ge 0 $ 和(b)至少一个元素是 $> 0 $

(请注意,操作的命令无关紧要:在某些顺序中运行它们可能会导致某些项目的数量达到零,但我们只能寻找低水-Mark并假设我们至少有许多项目中的许多才能开始。)

我认为这可以通过线性编程来解决:为每个系数制作一个变量,为输出向量中的每个元素添加 $ \ ge 0 $ 约束(每个元素)元素是系数变量的点乘积和来自食谱的恒定系数),对于每个系数变量,更多 $ \ ge 0 $ 约束,并设置最大化的功能所有元素的总和。为了使其界定,将系数变量的总和设置为某些常量,例如, 1. IFF解决方案值是 $> 0 $ ,您有非保护!

注意,分数值不是问题:它们必须是合理的,因此您可以始终通过所有分母乘以纯整数解决方案。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top