def mk_ampl_data(filename, unvisited, D): if filename == "-": f = sys.stdout else: f = open(filename, "w") n = len(unvisited) f.write("param n := %d;\n" % n) f.write("param c : " + " ".join("%r" % (i+1) for i in range(n)) + " :=\n") for i in unvisited: f.write("%r\t" % (i+1) + " ".join("%r" % D[i,j] for j in unvisited) + "\n") f.write(";\nend;\n") if __name__ == "__main__": """Solve the Fixed-Start Asymetric Hamiltonian Path with gurobi (with glpsol for preparing the MPS file) """ # # input data from an ATSP benchmark file # import atsp import time import sys if len(sys.argv) == 3: instance = sys.argv[1] maxcpu = float(sys.argv[2]) else: print "usage:", sys.argv[0], "[instance maxcpu]" exit(-1) n, D = atsp.read_atsplib(instance) # modify data for handling the fixed-start asymetric hamiltonian path start = 0 for i in range(n): D[i,start] = 0 mk_ampl_data("atsp.dat", range(n), D) # prepare MPS file for input to gurobi import os os.system("glpsol --math atsp.mod --data atsp.dat --wmps atsp.mps --check > /dev/null") # solve it with one thread, and the given time limit import gurobipy # setParam("LogfileName", "/home/jpp/gurobi.log") # setParam("OutputFlag", 0) m = gurobipy.read("atsp.mps") m.Params.Threads = 1 m.Params.TimeLimit = maxcpu m.optimize() import time print "%r\t%r\t%r" % (time.clock(), m.ObjVal, m.ObjBound) exit(0)