尝试在Java中解决rubiks多维数据集

尝试在Java中解决rubiks多维数据集,java,heuristics,rubiks-cube,Java,Heuristics,Rubiks Cube,到目前为止,我已经开发了一个类,可以使用树形图(最佳方式?)表示rubiks立方体。每个颜色都映射到一个键0-53。关键点始终保持不变,并由立方体的二维视图表示。我做了一个旋转90度的方法,将颜色和颜色面(中间的立方体永远不会移动)顺时针旋转90度。所以我的问题是,我如何实现一个好的搜索(可能是*?),让这个立方体朝着正确的方向移动到它的goalState(我在代码中也初始化了goalState,作为一个全局,这样我就可以将它与当前状态进行比较)。任何方向正确的反馈或提示都会很好。谢谢 这是没有

到目前为止,我已经开发了一个类,可以使用树形图(最佳方式?)表示rubiks立方体。每个颜色都映射到一个键0-53。关键点始终保持不变,并由立方体的二维视图表示。我做了一个旋转90度的方法,将颜色和颜色面(中间的立方体永远不会移动)顺时针旋转90度。所以我的问题是,我如何实现一个好的搜索(可能是*?),让这个立方体朝着正确的方向移动到它的goalState(我在代码中也初始化了goalState,作为一个全局,这样我就可以将它与当前状态进行比较)。任何方向正确的反馈或提示都会很好。谢谢

这是没有rotate 90方法的代码,还有一个checkInput方法,它只检查文件文本是否正常。输入只是一个表示2D立方体的文本文件,如下所示。现在的解决方法只是我胡闹,没有真正的进展

   GGW
   RRG
   RRG
OWWGGOYYR
OGOYYYRBR
YYYRBGRWW
   BOY
   BOB
   BOB
   OGO
   WWB
   WWB

package rubik;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.NavigableMap;
import java.util.TreeMap;

public class RubikCube {
final static String FILE_NAME = "rubikTest.txt";
public TreeMap<Integer, Character> goalState;


//swaps two colors given a cube
public static void swapColorValue(int color1, int color2, TreeMap<Integer, Character> rubik){
    char tempColor = rubik.get(color1);
    rubik.put(color1,rubik.get(color2));
    rubik.put(color2, tempColor);
}

//initialize the goal map
public void goalInit(TreeMap<Integer, Character> rubik){
    //initialize the goal state map each rubik.get(magicNumber) is the static center cubie
    TreeMap<Integer, Character> goalMap = new TreeMap<Integer,Character>();
    for(int i =0;i<=8;i++){
    goalMap.put(i,rubik.get(4));
    }
    //the left side
    goalMap.put(9, rubik.get(19));
    goalMap.put(10, rubik.get(19));
    goalMap.put(11, rubik.get(19));
    goalMap.put(18, rubik.get(19));
    goalMap.put(19, rubik.get(19));
    goalMap.put(20, rubik.get(19));
    goalMap.put(27, rubik.get(19));
    goalMap.put(28, rubik.get(19));
    goalMap.put(29, rubik.get(19));
    //the middle
    goalMap.put(12, rubik.get(22));
    goalMap.put(13, rubik.get(22));
    goalMap.put(14, rubik.get(22));
    goalMap.put(21, rubik.get(22));
    goalMap.put(22, rubik.get(22));
    goalMap.put(23, rubik.get(22));
    goalMap.put(30, rubik.get(22));
    goalMap.put(31, rubik.get(22));
    goalMap.put(32, rubik.get(22));
    //right side
    goalMap.put(15, rubik.get(25));
    goalMap.put(16, rubik.get(25));
    goalMap.put(17, rubik.get(25));
    goalMap.put(24, rubik.get(25));
    goalMap.put(25, rubik.get(25));
    goalMap.put(26, rubik.get(25));
    goalMap.put(33, rubik.get(25));
    goalMap.put(34, rubik.get(25));
    goalMap.put(35, rubik.get(25));
    //bottom
    for(int i = 36;i<=44;i++){
        goalMap.put(i, rubik.get(40));
    }
    //back
    for(int i = 45;i<=53;i++){
        goalMap.put(i, rubik.get(49));
    }
    //give it to the global variable
    goalState = (TreeMap<Integer, Character>) goalMap.clone();

}

//Maps a Integer key to a color given a file.
public static NavigableMap<Integer, Character> setup(String file) throws IOException{
    TreeMap<Integer, Character> rubik = new TreeMap<Integer, Character>();
    BufferedReader br = new BufferedReader(new FileReader(file));
    try {
        StringBuilder sb = new StringBuilder();
        String line = br.readLine();
        //add each line (without white spaces) to the stringbuilder
        while (line != null) {
            sb.append(line.trim());
            line = br.readLine();
        }
        //convert the stringbuilder(which has all the input from the file) to a char array
        char [] colors = sb.toString().toCharArray();
        //put the key,color into the Treemap.
        for(int i =0; i < colors.length;i++){
            rubik.put(i, colors[i]);
        }
    } finally {
        br.close();
    }
    //type Tree map
    return rubik;

    }

public int solve(TreeMap<Integer, Character> rubik){
    int j = 1;
    int check = 0;
    int redMatches=0;
    char [] colors = {'r','g','y','b','o','w'};

    for(int i = 0; i < 100;i++ ){
        if(j==6) j = 1;
        redMatches = 0;
        rotate90(colors[j],rubik);
        if(rubik.get(check)==goalState.get(check)){
            System.out.print("rubik match at: "+i+" with: "+rubik.get(i)+"match at goalState: "+i+" with: "+goalState.get(i));
            redMatches++;
        }

        j++;
    }


    return redMatches;
}

public static void main (String[] args){
    try {
        //check if file input is good
        //System.out.print(new RubikCube().checkInput(FILE_NAME));
        //Map the rubik cube(key,Color)
        RubikCube cubeInst = new RubikCube();
        //make sure to set up the mapping before calling rotate and goalInit    
        TreeMap<Integer, Character> cube = (TreeMap<Integer, Character>) (setup(FILE_NAME));
        cubeInst.goalInit(cube);
        //System.out.print(cubeInst.goalState);
        //rotate90('y',cube);
        //rotate90('y',cube);
        //System.out.print(cube);
        System.out.print(cubeInst.solve(cube));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}
GGW
RRG
RRG
owwggoyr
奥戈尔布
YYYYRBGRWW
男孩
上下快速移动
上下快速移动
奥戈
世界银行
世界银行
包装魔方;
导入java.io.BufferedReader;
导入java.io.FileReader;
导入java.io.IOException;
导入java.util.NavigableMap;
导入java.util.TreeMap;
公共类RubikCube{
最终静态字符串文件\u NAME=“rubikTest.txt”;
公共树状图目标状态;
//交换给定立方体的两种颜色
公共静态void swapColorValue(int color1、int color2、TreeMap rubik){
char tempColor=rubik.get(color1);
rubik.put(颜色1,rubik.get(颜色2));
rubik.put(color2,tempColor);
}
//初始化目标映射
公共无效目标(TreeMap rubik){
//初始化目标状态映射每个rubik.get(magicNumber)是静态中心立方体
TreeMap goalMap=newtreemap();

对于(int i=0;i我从未编写过求解魔方的代码,但如果您使用的是像a*这样的启发式图遍历算法,我可以想出一些好的启发式方法来告诉您离目标有多远:

  • 放错地方的小熊的数量

  • 每个立方体离目标状态的距离的总和,可能使用曼哈顿距离来判断它离目标状态有多远


  • 问题是,我认为你不能只为每个立方体状态使用一种颜色。你可能需要从任意角度将立方体表示为数据结构位置。例如,“左上角”是目标状态下的左上角部分(也是左侧和后侧的角立方体…)然后你就会知道你的“左上角”cubbie不合适。

    你试过寻找求解算法吗?或者那是作弊吗?Rubik's Cube上的Wikipedia页面上有一些指针。我不是这方面的专家,但在我看来,由于立方体有654=大约1042个状态,一个图形搜索算法是不可行的。是的,一些我看到的算法是带有启发式表的A*算法(我很难想出)也许可以找到一种方法一层一层地解决它,正如我读到的,在网上冲浪时,如果你的键从0连续运行到一个已知的最大值,那么a
    TreeMap
    是毫无意义的。值类型的数组或
    ArrayList
    在使用键作为索引时也会做同样的事情,在源代码中更简单,在运行时更高效。好吗嗯,我会切换的,谢谢Holger谢谢你的输入。你是说总是从同一个角度看立方体总是?例如,总是有白色的脸在前面,蓝色的在右边,绿色的在左边,等等。我想这会更容易。软件可以在同一时间看到每个角度,它只是保持立方体在f数据结构中的ixed方向。这还可以让您更改颜色,因为这不会影响用户对算法的看法。