In the following lines of code, I have commented out a few lines from your program and replaced them with alternatives:
#LIP.variables.add(names=[Columnas[s][6] for s in xrange(b)],obj= [Columnas[s][5] for s in xrange(b)], types = ["C"] * b, lb = [0] * b, ub = [1] * b)
#LIP.variables.add(names=["x"+str(j) for j in range(1,1+Centros)],obj=[CDs[j].ctol for j in xrange(Centros)], types = ["C"]*len(CDs), lb= [0]*len(CDs), ub=[1]*len(CDs))
#LIP.variables.add(names=[Columnas[s][6] for s in xrange(b)],obj= [Columnas[s][5] for s in xrange(b)], types = ["C"] * b, lb = [0] * b, ub = [1] * b)
#LIP.variables.add(names=["x"+str(j) for j in range(1,1+Centros)],obj=[CDs[j].ctol for j in xrange(Centros)], types = ["C"]*len(CDs), lb= [0]*len(CDs), ub=[1]*len(CDs))
LIP.variables.add(names=[Columnas[s][6] for s in xrange(b)],obj= [Columnas[s][5] for s in xrange(b)], lb = [0] * b, ub = [1] * b)
LIP.variables.add(names=["x"+str(j) for j in range(1,1+Centros)],obj=[CDs[j].ctol for j in xrange(Centros)], lb= [0]*len(CDs), ub=[1]*len(CDs))
LIP.variables.add(names=[Columnas[s][6] for s in xrange(b)],obj= [Columnas[s][5] for s in xrange(b)], lb = [0] * b, ub = [1] * b)
LIP.variables.add(names=["x"+str(j) for j in range(1,1+Centros)],obj=[CDs[j].ctol for j in xrange(Centros)], lb= [0]*len(CDs), ub=[1]*len(CDs))
The difference here is that the uncommented lines do include the "types" arguments to variables.add(). If you read the documentation for this method, you'll see the following note:
"If types is specified, the problem type will be a MIP, even if all variables are specified to be continuous."
You can check that this is true by adding the following line of code to your program:
print "Problem Type: " + LIP.problem_type[LIP.get_problem_type()]
With those changes, the call to get_dual_values does not fail for me.
#CPLEXOptimizers#DecisionOptimization