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); }