8 ポジションの 1 つのベクトルを検証しようとしています。この位置は、NxM のマトリックスの動きです。ここで、N = 列、M = 行です。
動きは次のとおりです。
- 北 -> 0
- 南 -> 1
- 東 -> 2
- 西 -> 3
主な目的は、穴の動きの解が行列の範囲外にならないようにすることです。
これが私のコードです:
有効な解が見つかるまで繰り返します。
while ! valid
start_solution = generate_random_solution
valid = validate_solution(start_solution)
end
移動番号を使用してランダムなベクトルを生成するのに問題はありません。これが generate_random_solution の機能です。
def validate_solution(solution)
position = @start.dup
move_count = 0
solution.each do |movement|
next_position = move(movement, position)
unless next_position.nil?
position = next_position
move_count += 1
end
end
move_count == @num_moves ? true : false
end
この場合の @start は (0,0) 3x3 マトリックスの最初の位置です。@num_moves は N * N - 1 です。マトリックスで実行できる移動の数です。
新しい位置を返す関数は次のとおりです。移動が無効な場合、デフォルト値は nil です。
def move(mov, pos)
case mov
when 0 # NORTH
return Position.new(pos.x, pos.y - 1) if pos.y > 0
when 1 # SOUTH
return Position.new(pos.x, pos.y + 1) if pos.y < @m
when 2 # EAST
return Position.new(pos.x + 1, pos.y) if pos.x < @n
when 3 # WEST
return Position.new(pos.x - 1, pos.y) if pos.x > 0
end
end
これが私の問題です。ある時点で、移動関数が nil を返さず、ベクトルが範囲外になることを許可しているようです。
ご協力ありがとうございました。