public Dictionary <string, object> searchNeighborhood(Machine[] machines, Operation[] criticalPath)
        {
            this.possibleOperations.Clear();
            Dictionary <string, object>         retDict     = new Dictionary <string, object> ();
            List <Machine[]>                    retMachines = new List <Machine[]> ();
            Dictionary <int, List <Operation> > blockList   = new Dictionary <int, List <Operation> > ();

            if (tabuListOperations.ToArray().Length == MAX_LENGTH)
            {
                tabuListOperations.RemoveAt(0);
            }
            this.machines     = machines;
            this.criticalPath = criticalPath;

            for (int i = 0; i < criticalPath.Length - 1; i++)
            {
                //复制tempMachine
                //找到邻居之前先判断是否在关键路径和同一机器上;是否在禁忌表里
                if (criticalPath[i].getMachineId() == criticalPath[i + 1].getMachineId() && !isInTabuList(criticalPath[i + 1].getOperationNumber(), criticalPath[i].getOperationNumber(), this.tabuListOperations.ToArray()))
                {
                    List <int> arrayList = new List <int>(blockList.Keys);
                    if (!isContain(arrayList.ToArray(), criticalPath[i].getMachineId()))
                    {
                        List <Operation> oper = new List <Operation> ();
                        oper.Add(criticalPath[i]);
                        oper.Add(criticalPath[i + 1]);
                        blockList[criticalPath[i].getMachineId()] = oper;
                    }
                    else
                    {
                        blockList[criticalPath[i].getMachineId()].Add(criticalPath[i]);
                        blockList[criticalPath[i].getMachineId()].Add(criticalPath[i + 1]);
                    }
                }
            }

            List <int> test = new List <int> (blockList.Keys);

            for (int i = 0; i < blockList.Count; i++)
            {
                // 每次循环都创建一个tempMachine
                Machine[] tempMachine = new Machine[machines.Length];
                for (int k = 0; k < machines.Length; k++)
                {
                    Operation[] operations = new Operation[machines[k].getOperations().Length];
                    for (int j = 0; j < machines[k].getOperations().Length; j++)
                    {
                        operations[j] = machines[k].getOperations() [j];
                    }
                    Machine machines1 = new Machine(k);
                    machines1.setOperations(operations);
                    tempMachine[k] = machines1;
                }
                Machine[] tempMachine_2 = new Machine[machines.Length];
                for (int k = 0; k < machines.Length; k++)
                {
                    Operation[] operations = new Operation[machines[k].getOperations().Length];
                    for (int j = 0; j < machines[k].getOperations().Length; j++)
                    {
                        operations[j] = machines[k].getOperations() [j];
                    }
                    Machine machines1 = new Machine(k);
                    machines1.setOperations(operations);
                    tempMachine_2[k] = machines1;
                }
                if (i == 0)
                {
                    if (blockList[test[i]].ToArray().Length >= 2)
                    {
                        //add to tabuListOperation
                        TabuListOperation tabuListOperation = new TabuListOperation();
                        tabuListOperation.startOperationNumber = blockList[test[i]].ToArray() [blockList[test[i]].ToArray().Length - 1].getOperationNumber();
                        tabuListOperation.endOperationNumber   = blockList[test[i]].ToArray() [blockList[test[i]].ToArray().Length - 2].getOperationNumber();
                        possibleOperations.Add(tabuListOperation);  //备选的tabuListOperation对
                        int         indexInMachine_1 = searchOperation(machines[blockList[test[i]].ToArray() [blockList[test[i]].ToArray().Length - 2].getMachineId()].getOperations(), blockList[test[i]].ToArray() [blockList[test[i]].ToArray().Length - 2]);
                        int         indexInMachine_2 = searchOperation(machines[blockList[test[i]].ToArray() [blockList[test[i]].ToArray().Length - 1].getMachineId()].getOperations(), blockList[test[i]].ToArray() [blockList[test[i]].ToArray().Length - 1]);
                        Operation[] a = machines[blockList[test[i]].ToArray() [blockList[test[i]].ToArray().Length - 2].getMachineId()].getOperations();
                        Operation[] tempOperations = new Operation[a.Length];

                        for (int j = 0; j < a.Length; j++)
                        {
                            tempOperations[j] = a[j];
                        }

                        Operation o1 = tempOperations[indexInMachine_1];
                        Operation o2 = tempOperations[indexInMachine_2];
                        tempOperations[indexInMachine_1] = o2;
                        tempOperations[indexInMachine_2] = o1;
                        tempMachine[blockList[test[i]].ToArray() [blockList[test[i]].ToArray().Length - 2].getMachineId()].setOperations(tempOperations);     //设置operations
                        retMachines.Add(tempMachine);
                    }
                }
                else if (i < blockList.Count - 1)
                {
                    if (blockList[test[i]].ToArray().Length >= 2)
                    {
                        //add to temp
                        TabuListOperation tabuListOperation = new TabuListOperation();
                        tabuListOperation.startOperationNumber = blockList[test[i]].ToArray() [0].getOperationNumber();
                        tabuListOperation.endOperationNumber   = blockList[test[i]].ToArray() [1].getOperationNumber();
                        possibleOperations.Add(tabuListOperation);  //备选的tabuListOperation对
                        int         indexInMachine_1 = searchOperation(machines[blockList[test[i]].ToArray() [0].getMachineId()].getOperations(), blockList[test[i]].ToArray() [0]);
                        int         indexInMachine_2 = searchOperation(machines[blockList[test[i]].ToArray() [1].getMachineId()].getOperations(), blockList[test[i]].ToArray() [1]);
                        Operation[] a = machines[blockList[test[i]].ToArray() [0].getMachineId()].getOperations();
                        Operation[] tempOperations = new Operation[a.Length];

                        for (int j = 0; j < a.Length; j++)
                        {
                            tempOperations[j] = a[j];
                        }

                        Operation o1 = tempOperations[indexInMachine_1];
                        Operation o2 = tempOperations[indexInMachine_2];
                        tempOperations[indexInMachine_1] = o2;
                        tempOperations[indexInMachine_2] = o1;
                        tempMachine[blockList[test[i]].ToArray() [0].getMachineId()].setOperations(tempOperations);    //设置operations

                        retMachines.Add(tempMachine);

                        //后两个

                        TabuListOperation tabuListOperation_2 = new TabuListOperation();
                        tabuListOperation_2.startOperationNumber = blockList[test[i]].ToArray() [blockList[test[i]].ToArray().Length - 1].getOperationNumber();
                        tabuListOperation_2.endOperationNumber   = blockList[test[i]].ToArray() [blockList[test[i]].ToArray().Length - 2].getOperationNumber();
                        possibleOperations.Add(tabuListOperation_2);  //备选的tabuListOperation对
                        int         indexInMachine_1_2 = searchOperation(machines[blockList[test[i]].ToArray() [blockList[test[i]].ToArray().Length - 2].getMachineId()].getOperations(), blockList[test[i]].ToArray() [blockList[test[i]].ToArray().Length - 2]);
                        int         indexInMachine_2_2 = searchOperation(machines[blockList[test[i]].ToArray() [blockList[test[i]].ToArray().Length - 1].getMachineId()].getOperations(), blockList[test[i]].ToArray() [blockList[test[i]].ToArray().Length - 1]);
                        Operation[] b = machines[blockList[test[i]].ToArray() [blockList[test[i]].ToArray().Length - 2].getMachineId()].getOperations();
                        Operation[] tempOperations_2 = new Operation[a.Length];

                        for (int j = 0; j < a.Length; j++)
                        {
                            tempOperations_2[j] = a[j];
                        }

                        Operation o1_2 = tempOperations_2[indexInMachine_1_2];
                        Operation o2_2 = tempOperations_2[indexInMachine_2_2];
                        tempOperations_2[indexInMachine_1_2] = o2_2;
                        tempOperations_2[indexInMachine_2_2] = o1_2;
                        tempMachine_2[blockList[test[i]].ToArray() [blockList[test[i]].ToArray().Length - 2].getMachineId()].setOperations(tempOperations_2);     //设置operations
                        retMachines.Add(tempMachine_2);
                    }
                }
                else
                {
                    if (blockList[test[i]].ToArray().Length >= 2)
                    {
                        //add to temp
                        TabuListOperation tabuListOperation = new TabuListOperation();
                        tabuListOperation.startOperationNumber = blockList[test[i]].ToArray() [0].getOperationNumber();
                        tabuListOperation.endOperationNumber   = blockList[test[i]].ToArray() [1].getOperationNumber();
                        possibleOperations.Add(tabuListOperation);  //备选的tabuListOperation对
                        int         indexInMachine_1 = searchOperation(machines[blockList[test[i]].ToArray() [0].getMachineId()].getOperations(), blockList[test[i]].ToArray() [0]);
                        int         indexInMachine_2 = searchOperation(machines[blockList[test[i]].ToArray() [1].getMachineId()].getOperations(), blockList[test[i]].ToArray() [1]);
                        Operation[] a = machines[blockList[test[i]].ToArray() [0].getMachineId()].getOperations();
                        Operation[] tempOperations = new Operation[a.Length];

                        for (int j = 0; j < a.Length; j++)
                        {
                            tempOperations[j] = a[j];
                        }

                        Operation o1 = tempOperations[indexInMachine_1];
                        Operation o2 = tempOperations[indexInMachine_2];
                        tempOperations[indexInMachine_1] = o2;
                        tempOperations[indexInMachine_2] = o1;
                        tempMachine[blockList[test[i]].ToArray() [0].getMachineId()].setOperations(tempOperations);    //设置operations
                        retMachines.Add(tempMachine);
                    }
                }
            }

            retDict.Add("candidateMachines", retMachines.ToArray());
            return(retDict);
        }