Python LSAT的逻辑游戏部分出现了哪类组合问题?
编辑:有关类似的问题类别,请参见 LSAT上有一类逻辑问题如下: 一次广播的七个连续时段,按时间顺序I到7编号,将由六盘歌曲磁带——G、H、L、O、p、S——和一盘新闻磁带填满。每个磁带将被分配到不同的时间段,并且没有磁带比任何其他磁带长。广播受以下限制:Python LSAT的逻辑游戏部分出现了哪类组合问题?,python,puzzle,combinatorics,combinations,Python,Puzzle,Combinatorics,Combinations,编辑:有关类似的问题类别,请参见 LSAT上有一类逻辑问题如下: 一次广播的七个连续时段,按时间顺序I到7编号,将由六盘歌曲磁带——G、H、L、O、p、S——和一盘新闻磁带填满。每个磁带将被分配到不同的时间段,并且没有磁带比任何其他磁带长。广播受以下限制: 必须在O之前立即播放L。 新闻磁带必须在L之后的某个时间播放。 G和G之间必须正好有两个时隙 P、 不管G是在P之前还是在P之后。 我感兴趣的是生成一个满足条件的排列列表,作为测试的学习方式和编程挑战。然而,我不确定这是什么类型的排列问题
必须在O之前立即播放L。
新闻磁带必须在L之后的某个时间播放。
G和G之间必须正好有两个时隙 P、 不管G是在P之前还是在P之后。 我感兴趣的是生成一个满足条件的排列列表,作为测试的学习方式和编程挑战。然而,我不确定这是什么类型的排列问题。我将类型问题概括如下: 给定一个n长度数组A:
我的想法是对限制进行编码,然后使用Python的itertools之类的工具来生成排列。欢迎提出意见和建议 好的,在我看来,有两种方法可以解决这个问题:
def L_before_O(s):
return (s.index('L') - s.index('O') == 1)
def N_after_L(s):
return (s.index('L') < s.index('N'))
def G_and_P(s):
return (abs(s.index('G') - s.index('P')) == 2)
def all_perms(s): #this is from the link
if len(s) <=1:
yield s
else:
for perm in all_perms(s[1:]):
for i in range(len(perm)+1):
yield perm[:i] + s[0:1] + perm[i:]
def get_the_answer():
permutations = [i for i in all_perms('GHLOPSN')] #N is the news tape
a = [i for i in permutations if L_before_O(i)]
b = [i for i in a if N_after_L(i)]
c = [i for i in b if G_and_P(i)]
return c
def L_前O(s):
返回值(s.index('L')-s.index('O')==1)
定义N_后的名称:
返回(s.index('L')
您可以使用像Python这样的通用编程语言编写代码,但这是您将在整数编程教科书的前几章中看到的类型。最有效的算法已经被其他人研究出来了
编辑:回答Merjit的问题:
定义:
矩阵Y,其中Y_j(ij)=1,如果磁带i
在磁带j和0之前播放
否则李>
向量C,其中C_i
指示当我处于活动状态时的时间段
播放(例如1,2,3,4,5,6,7)
大的
常数M(查找以下术语:
优化教科书中的“大M”)
在以下约束条件下最小化向量C的和:
Y_(ij) != Y_(ji) // If i is before j, then j must not be before i
C_j < C_k + M*Y_(kj) // the time slot of j is greater than the time slot of k only if Y_(kj) = 1
C_O - C_L = 1 // L must be played immediately before O
C_N > C_L // news tape must be played at some time after L
|C_G - C_P| = 2 // You will need to manipulate this a bit to make it a linear constraint
Y(ij)!=Y_ji)//如果i在j之前,那么j就不能在i之前
C_jC_L//新闻磁带必须在L之后的某个时间播放
|C_G-C_P |=2//您需要稍微处理一下,使其成为线性约束
这应该能让你大部分的路都走到那里。您希望用MathProg语言的语法编写上述约束(如链接所示),并确保我没有遗漏任何约束。然后在约束上运行GLPK解算器,看看它会产生什么。我认为整数规划可能是为此类问题创建一组广义解决方案的最佳方法,但我不确定如何将这样的线性排序游戏编码为优化问题。我应该在哪里/如何放置值系数?这是对问题1和3的一个很好的回答,也是对游戏限制进行编码的一种优雅方式!也就是说,在问题2的情况下,我仍然不知道如何计算置换,在这个问题中,你可以将变量加倍,以填充矩阵中的可用位置。好的,从程序上来说,你可以只做len(c)。将返回此类有效排列的数量。然而,如果你的问题是“我怎么用手做这个”,我知道怎么做,但我不知道怎么写在这里。贴一条评论,让我知道这是否是你想要的,如果是这样的话,我会在纸上手工做,扫描一下,放到我的网站上,然后在这里贴一个链接。这正是我想要的。我利用这个机会来学习一个我以前不太了解的数学领域,所以任何额外的信息都是有用的。我对问题2特别感兴趣,因为它经常作为LSAT难题出现。谢谢对不起,这么久了。我没有忘记这个问题。我已经解决了它,现在正在寻找一个扫描仪,我可以使用。我希望能在周一之前上传这个谢谢!我真的很感激。LSAT是什么?据谷歌称,这是法学院入学考试,但在这种情况下,这似乎不太可能。请不要在没有解释或给出URL的情况下使用晦涩难懂的首字母缩略词。我指的LSAT确实是法学院入学考试。其中一个部分是我上面提到的逻辑游戏——我的目标是确定每个谜题可能的解决方案的数量。