我试图找到一些Python库或方法来创建一个描述任意整数列表的公式,如:[1,1,2,4,3,1,2,3,4,1,...]
例如:
from some_awesome_library import magic_method
seq = [1,1,2,4,3,1,2,3,4,1,4,3,2,2,4,3]
my_func(sequence):
equation = magic_method(seq)
return equation
print(my_func(seq))
序列的顺序很重要,但它有一定的规则。例如,所有整数都在1到4之间,序列中每个整数的数量都相等。
我已查看numpy.polyfit
和scipy.optimize.leastsq
。我怀疑scipy是我所需要的,但是确认这种方法以及对我应该使用的数学函数类型的任何建议都很棒(我没有太多的数学'那个人 - 只是研究大学的微积分)。也许某种模数函数?也许正弦波?
提前感谢您提供任何帮助或建议。
编辑:感谢您在下面的评论。我对数独谜题感到好奇,特别是N = 2个谜题。我怀疑如果你采用整个解决方案空间并按照特定顺序排列它们,那么模式将会出现,这对于更快地解决数独可能是有用的。我有一个代表名为SolutionManager
的解决方案空间的类,并返回"切片"解决方案空间看起来像上面显示的整数列表。下面是N = 2拼图解空间的一个这样的例子的图像(用Jupyter Notebook生成):
我认为我可以看到数据中的模式,但我试图弄清楚如何开发代表这些模式的公式。我还怀疑重新排序解决方案将会产生描述这些模式的更简单的方程式。
为了证明我正在尝试编写一种遗传算法,该算法将根据描述它们的方程式的简单程度对SolutionManager中描述的解决方案进行重新排序。我坚持编写适应度函数,它应该根据它所描述的方程式的简单程度对SolutionManager实例进行评级。
SolutionManager的代码如下:
class SolutionManager:
"""Object that contains all possible Solutions for an n=2 Sudoku array"""
def __init__(self, solutions_file):
input_file = open(solutions_file, 'r')
grids = [r.strip() for r in input_file.readlines()]
list_of_solutions = []
i = 0
for grid in grids:
list_of_cubes = []
i += 1
for r in range(4):
for c in range(4):
pos = r * 4 + c
digit = int(grid[pos])
cube = Cube(i, c, r, digit)
list_of_cubes.append(cube)
list_of_solutions.append(Solution(list_of_cubes))
self.solutions = list_of_solutions
assert isinstance(self.solutions, list)
assert all(isinstance(x, Solution) for x in self.solutions)
"""Get a vertical slice of the Solution Space"""
def get_vertical_slice(self, slice_index):
assert slice_index <= 4
assert slice_index >= 0
slice = []
for sol in self.solutions:
slice.append(sol.get_column(slice_index))
return slice
"""Get a horizontal slice of the Solution Space"""
def get_horizontal_slice(self, slice_index):
assert slice_index <= 4
assert slice_index >= 0
slice = []
for sol in self.solutions:
slice.append(sol.get_row(slice_index))
return slice
"""Sorts the solutions by a vertical axis using an algorithm"""
def sort_solutions_by_vertical_axis(self, axis_index):
pass
class Solution:
def __init__(self, cubes):
assert (len(cubes) == 16)
self.solution_cubes = cubes
def get_column(self, c):
return list(_cube for _cube in self.solution_cubes if _cube.row == c)
def get_row(self, r):
return list(_cube for _cube in self.solution_cubes if _cube.column == r)
def get_column_value(self, c, v):
single_cube = list(_cube for _cube in self.solution_cubes if _cube.row == r and _cube.value == v)
assert (len(single_cube) == 1)
return single_cube[0]
def get_row_value(self, r, v):
single_cube = list(_cube for _cube in self.solution_cubes if _cube.column == c and _cube.value == v)
assert (len(single_cube) == 1)
return single_cube[0]
def get_position(self, r, c):
single_cube = list(_cube for _cube in self.solution_cubes if _cube.column == c and _cube.row == r)
assert (len(single_cube) == 1)
return single_cube[0]
class Cube:
def __init__(self, d, c, r, v):
self.depth = d
self.column = c
self.row = r
self.value = v
def __str__(self):
return str(self.value)