1

我正在用 Java 制作一个小游戏来练习编程,并遇到了这个我似乎无法自己解决的小问题。

在这个游戏中,我想建立一个可以买卖物品的虚拟商店。

大多数物品只能通过按照我所谓的“食谱”从其他物品中创建出来才能在游戏中获得。配方基本上只是创建新项目所需的一组项目。一个项目可以有多个配方。配方的结果可以是新数量的多个实例。我将像这样 [item, item, ..., item](结果数量)表示食谱。

所以有基础物品,不能创造,必须通过其他方式获得,有创造物品,只能通过其配方之一获得。

我想尝试模拟供求关系,我想出了这个属性,我称之为“交易金额”,每个项目都初始化为 0。交易金额表示正在出售或购买的商品数量。如果我卖出 X 数量的物品,它的交易量增加 X,如果我购买 Y 数量的物品,它的交易量减少 Y。

现在我需要确定我的物品的价格。

所有基础项目都被分配了一个统一的值。然后将价值和交易金额插入到函数 f(v, t) 中,该函数会输出价格。这个价格总是 >= 0。这个函数的一个属性是,如果交易量 t 为 0,那么结果价格等于输入值 v。所以如果一个玩家购买了一定数量的物品,那么交易量就会变为下降 x,价格接近 0。如果另一个玩家出售相同数量的相同物品,交易量回到 0,价格跳回原始值。

现在所有基础项目都有一个值,我需要计算所有创建项目的值,以便能够使用 f 计算它们的价格。我希望它们的价值基于创建它们所需的最便宜的配方。所以我必须解析所有食谱,将每个食谱中使用的所有项目的价格相加,并确定一个食谱的最低价格。那就是所创建项目的价值。

我可以在一个图中对这个设置进行建模,其中顶点表示可以在商店中交易的商品,并且有向边将一个商品连接到另一个可以从源商品创建的商品。所以我有一个有向边('source -> destination'),其中源是目标食谱之一中的成分。因此,从这个前提出发,我创建了一个包含 600 个左右顶点的随机有向图。每次游戏加载时,此图表都会有所不同,并且生成器应特别允许图表内的循环。

这是一个例子:

项目 A 和 B 是基础项目,其值分别为 10 和 2。它们的交易金额最初为 0,因此它们的价格等于它们的值 10 和 2。

项目 C 是具有两个配方 R1 = A、A、B 和 R2 = B、B、B 的已创建项目。现在我确定 R1 的价格为 22,R2 的价格为 6,这是最低配方价格。因此项目 C 的值为 6(最初交易量为 0,因此价格也是 6)。

在这种情况下,图表看起来像 (A) --> (C) <-- (B)

到目前为止,一切都完美无缺。

现在,当价格-价值依赖关系是循环的时,我遇到的问题就出现了。

以下是我需要帮助的 3 类案例:

(1) - 0 顶点循环

简单地说,物品 A 有一个固定的价格,物品 B 可以从配方 [A, B] 中创建。如果 B 的价格发生变化,则 B 创建的所有项目都必须重新计算。在这种情况下,B 是由 A 和 B 组成的,所以我也必须重新计算 B 的价格。这再次触发了 B 的重新计算等等……我知道前提很奇怪,但把它想象成重新粉刷一扇门(B)。它由相同的门 (B) 加上油漆 (A) 制成。我称其为 0 顶点循环,因为在遍历循环时,您通过 0 个顶点返回到您开始的位置。

(2) - 1 个顶点循环

如果我们从第一个示例中获取相同的项目 A 和 B,并添加具有配方 R1=A、B 和 R2=D、D、D 的项目 C 和具有配方 R3=C 的项目 D。所以C可以“分解”成3个D,3个D可以组合成一个C但既然 C 也可以由 D 制成,并且假设 R2 变得比 R1 便宜,那么我也必须降低 C 的价格,从而再次触发 D 的价格降低等等。这将一直持续到价值收敛到某个地方,具体取决于所涉及配方的成分。我称它为 1 个顶点循环,因为在遍历循环时,您只通过一个顶点。

(3) - n个顶点循环

这是一般情况,我想如果我解决了这个问题,上面的两个具体情况也将得到解决。如果商品 A 由 B 组成,B 由 C 组成,C 由 D 组成,以此类推,直到由 A 组成的商品 Z,那么改变一个的价格将触发下一个的价格变化,这将触发价格下等等等等。这条链实际上可以任意长。**

我正在寻找一种可以解决我的问题的算法。我希望能够计算初始交易金额为 0 的所有物品的所有价值和价格。当玩家买卖物品时,价格变化应该通过图表传播。我考虑过修改 Dijkstra 算法、A*、Bellman-Ford 算法和 Floyd-Warshall 算法,但都无法得到令人满意的结果。

有人可以指出我正确的方向吗?

4

0 回答 0