Algorithm 如何有效地为一场8球比赛准备台球?
由于8球游戏中的台球摆架可以在多种规则下进行,因此我指的摆架是: i、 e.8球必须位于中心,沿侧面条纹和实体必须交替。剩下的两个球(条纹球和实心球)无关紧要 假设你刚刚完成一场比赛,收集球,把它们放在架子上,然后继续安排它们开始一场新的比赛。它们现在是随机排列的。你如何进行 免责声明:绘画艺术如下 一个简单的方法是按顺序开始,顶部->底部和左侧->右侧 例如,我们假设Algorithm 如何有效地为一场8球比赛准备台球?,algorithm,optimization,language-agnostic,Algorithm,Optimization,Language Agnostic,由于8球游戏中的台球摆架可以在多种规则下进行,因此我指的摆架是: i、 e.8球必须位于中心,沿侧面条纹和实体必须交替。剩下的两个球(条纹球和实心球)无关紧要 假设你刚刚完成一场比赛,收集球,把它们放在架子上,然后继续安排它们开始一场新的比赛。它们现在是随机排列的。你如何进行 免责声明:绘画艺术如下 一个简单的方法是按顺序开始,顶部->底部和左侧->右侧 例如,我们假设1位于正确的位置5不是,我们用2交换它,然后用3交换4(或者用8),但这已经是低效的,因为我们要么把4移到中心,要么把8移到
1
位于正确的位置<代码>5不是,我们用2
交换它,然后用3
交换4
(或者用8
),但这已经是低效的,因为我们要么把4
移到中心,要么把8
移到4
的位置,也就是说,它不必在最后的位置
还有一个决定,我们想在角落里打出哪种类型的球。你是如何预先决定的?你应该考虑有多少球已经到位了吗?在我的例子中,如果你想让灰色的球出现在角落里,你已经有了3个球(球1,10,14)。如果你想把白色的放在角落里,你只有两个(2,11)。这有关系吗
为了使这一点正式化,我们可以假设我们可以执行两个或三个操作:
- 交换两个相邻的球
- 交换两个不相邻的球
- 旋转机架
编辑:根据现有的(或以前的答案)-你可能会假设在角落里有比实体更多的条纹,这意味着跨步会更喜欢角落-不是说这不是真的,但是如果你做出这样的假设,请证明它。注意!这个答案写在轮换要求之前。请谨慎行事:) 这是我对这个问题的初步看法 要做的第一件事是计算外部奇偶性-+1,如果它适合“角中的条纹”,如果它适合“角中的实体”,则为-1,如果它是8球,则为+0。这给了我们一个从+12到-12的范围,我们的目标是接近极限。(如果为+0,则选择+12或随机选择) 例如,这是+1+1+1-1-1+1-1-1-1+1+0-1,因此它是-1个倾斜的角点实体:
x o x x o
x o x o
8 x o
o x
o
8 o o o x
o o o x
o x x
x x
x
x x o o x
o o x o
o o 8
x x
x
下一步要做的是把8号球移到中心。如果你可以用它做两个相邻的交换,将两个球移动到位,而不是一个相邻的交换,只将一个球移动到位(或者一个非相邻的交换,如果球在一个角),那么就这样做
当我们移动8个球时,两个相邻的掉头共享球的所有组合可以由非相邻的交换产生相同的,所以我们必须同时考虑到更少的复杂性。 按此优先级排列所有剩余移动:
-外线两个相邻球之间的交换“值4”(如果这是我们最后一次交换,则为2) -两个相邻球之间的交换,一个在外边,值2(如果这是我们的最后一次交换,则值1) -外线两个球之间的交换“值2” -两个球之间的交换,一个在外边,值1 并从上到下执行因此,我们移动O在顶部,左边(4),右边的O在(2),左上的O在(2),然后交换X顶部与O在中间(2)。我们最终在一个2-2-1系列中进行了五次交换,所以进行了三次交易
o x o x o
x 8 x x
o o o
x x
o
(值得注意的是,如果我们瞄准拐角处的条纹,这个问题也会很快解决。)
我认为要求4圈是不可能的,但我还没有向自己证明这一点
另一个成功的例子是:
这具有+1的奇偶性,因此我们的目标是在拐角处使用条纹:
x o x x o
x o x o
8 x o
o x
o
8 o o o x
o o o x
o x x
x x
x
x x o o x
o o x o
o o 8
x x
x
将8个球与中心x互换
(1-)
交换两个相邻的外部,4点
(1-1)
将相邻边交换到中心,2个点
(1-2-)
边对边交换,2点
(1-2-1-)
3个动作
编辑:这对开篇文章中的示例非常有效,分两步解决:
这具有+1的奇偶性,因此我们的目标是在拐角处使用条纹:
x o x x o
x o x o
8 x o
o x
o
8 o o o x
o o o x
o x x
x x
x
x x o o x
o o x o
o o 8
x x
x
将8与边上的x交换,然后与中心的o交换(求解两条边)
(2-)
交换左上下相邻的o和x(解决四条边)
(2-2-)
两步。你有两个八球,骗子 在给定的示例中,解决方案采取了两个步骤: 2-5,3-8
3-4,11-12 通过为(DP)配置问题,可以找到最佳解决方案。由于该问题是多阶段的,具有固定成本且无不确定性,因此将存在一个DP矩阵来最优地解决该问题 创建矩阵:请注意,考虑到对称性,8球可以位于9个位置之一。固体可按约(14-7)/2=1716种不同方式排列。这意味着机架配置的总数约为1716*9=15444。因此,您有15444个不同的可能状态。计算从任何一个州到任何其他州的成本。这就产生了一个包含15444*15444个细胞的矩阵,或者说是大约25亿个细胞。识别所有终端状态单元。要求解矩阵,您需要从开始状态向前搜索,直到到达结束状态(或直到达到总成本大于当前最小成本)。通过这样做,您将可以证明找到所有成本最低的路径 请注意,上述解决方案有些幼稚,可以通过各种方式进行优化,以生成更小的矩阵。例如,可以使用旋转对称减少单元数并添加
x x o o x
o o x o
o 8 x
x o
x
x o x o x
o o x o
x 8 x
o o
x
Pseudocode:
Create DP Matrix:
(1) determine number of possible arrangements, A, of balls
(2) for each arrangement, make a list of possible unique moves
---- the possible moves are:
------- rotating right
------- rotating left
------- exchanging any pair of balls
------- exchanging any two pairs of adjacent balls
(3) for each move in A store a pointer to the resulting arrangement
(4) for each arrangment make an attribute indicating whether it is an end state
Solve Problem
(5) goto arrangement for starting position S
(6) set best-cost-so-far (BCSF) variable to infinity
(6) breadth search from S, accumulating current cost CC as +1 for each transition
(7) if you reach an end state CC < BCSF, then set BCSF = CC and make solution list contain only the current path
(8) if you reach an end state CC = BCSF, then add path to solution list
(9) if CC > BCSF abandon branch and try next branch
The result will be a list of all possible solutions and the minimum cost BCSF.
x 8
x x o o
o o x o o x
o o x x o x x x
8 o o o x o x x o x
x
o o
x o x
x 8 o x
x o o x o
IF count is 3 {
#inside triangle will choose
IF inside triangle has 2 of a kind, that type stays (in the red spots)
ELSE pick random
}
swap 8 with 3 #move1
count[stripe]=3 [6,13,9]
count[solid]=3 [5,4,12]
highest count=3, checking inside, inside is correct, random pick: stripes stay
Pick 5, corners() correct, swap with middles(2) #move2
Pick 4, corners() correct, swap with middles(11) #move3
Pick 12, corners() correct, swap with middles(3) #move4
Done.
Pick 6, swap with corners(10) #move2
Pick 13, swap with corners(1) #move3
Pick 9, swap with corners(14) #move4
Done.
swap 8 with 3 #move1
count[stripe]=3 [6,13,9]
count[solid]=3 [5,4,12]
highest count=3, checking inside, inside has 2 of a kind(stripes) => stripes stay
Pick 5, corners() correct, swap with middles(2) #move2
Pick 4, corners() correct, swap with middles(11) #move3
Pick 12, corners() correct, swap with middles(15) #move4
Done.
6-9,14-15 2-12 2-5,4-7 1-2
x x x x o
x x x x 8 x o x x x
x o x => x o o => x o o => o 8 o => o 8 o
o o o x o o x x o o x x x o x x x o x x
o 8 o o x o 8 o x o o x o x o o x o x o o x o x o
5-11 12-13,14-15 4-7,6-10
x x x x
o o o o o o o o
o x o => o 8 o => o 8 o => x 8 x
x o x x x o x x x o x x o o x o
8 x o x o x x o x o x o x o x x o x o x
3-11 1-2,3-5
x x o
o o o 8 x x
o x o => o x o => o 8 o
x o x x x o x x x o x x
8 x o x o o x o x o o x o x o
11-2 12-5 13-3 9-10
x x x x x
x x o x o x o o o o
x o x => x o x => x 8 x => x 8 x => x 8 x
o o o x o o o x o o o x o o o x o o x o
o 8 o o x x 8 o o x x o o o x x o x o x x o x o x