Так что мне любопытно, как узнать количество исследуемых узлов ветвей и границ. Мне было интересно узнать, насколько сложно решить мой IP - если есть лучший показатель c для этого, пожалуйста, не стесняйтесь поделиться.
Я пытался использовать
my_prob.solution.MIP.get_incumbent_node()
который из документации CPLEX дает номер узла, решение которого было найдено - что, я думаю, будет хорошим показателем количества исследованных узлов. Но он всегда возвращает 0, я приложил пример, в котором решение ввода (угадай) и вывод разные. Я ожидаю, что оно будет 0, только если входное решение было глобальным оптимальным решением (узел root обнаружил сильную двойственность).
Вот небольшой пример:
Спасибо
import cplex
from cplex.exceptions import CplexError
# my_prob = cplex.Cplex()
# print(dir(my_prob))
# print("-----------")
# print(dir(my_prob.solution))
# print(my_prob.solution.get_status_string())
# print(my_prob.solution.get_status())
# print(my_prob.solution.get_method())
class knapsack:
def __init__(self,N,g,square_list,density_list,cs,dx,number_squares):
self.N = N
self.square_list= square_list
self.g = g
self.nummats= len(density_list)
self.numlist=[]
self.cs=cs
self.number_squares=number_squares
self.dx=dx
self.density_list=density_list
def solve_problem(self):
number_squares=self.number_squares
square_list=self.square_list
nummats=self.nummats
density_list=self.density_list
dx=self.dx
#lol_print([number_squares,square_list,nummats,density_list,dx])
try:
my_prob = cplex.Cplex()
prob =my_prob
prob.set_log_stream(None)
prob.set_error_stream(None)
prob.set_warning_stream(None)
prob.set_results_stream(None)
my_obj = self.g
my_ctype = "B"
number_of_one = self.square_list.count(1.0)
my_ctype = my_ctype*len(self.square_list)
val = self.N -number_of_one
val2=self.cs
#print(val)
#print(len(self.g))
#print(len(self.square_list))
rhs=[val]
my_sense="L"
my_rownames = ["r1"]
counter =0
variable_list=[]
coiff_list=[]
coiff_den =[]
for k in range(0,number_squares):
sub_slice = square_list[k*nummats:k*nummats+nummats]
#print(sub_slice)
#print(len(sub_slice))
temp1=[0]*nummats
temp2 = sub_slice
for j in range(0,len(sub_slice)):
temp1[j] = density_list[j]*dx**2
if(temp2[j]==0):
temp2[j] = 1.0
else:
temp2[j]=-1.0
variable_list.append(str(counter))
self.numlist.append(counter)
counter+=1
coiff_den = coiff_den + temp1
coiff_list = coiff_list + temp2
#print(square_list)
#print(coiff_den)
#print(coiff_list)
rhs2 =[val2]
#print("got here")
rows = [[variable_list, coiff_list]]
rows2 =[[variable_list,coiff_den]]
prob.objective.set_sense(prob.objective.sense.minimize)
prob.variables.add(obj=my_obj, types=my_ctype,
names=variable_list)
prob.linear_constraints.add(lin_expr=rows, senses=my_sense,
rhs=rhs)
prob.linear_constraints.add(lin_expr=rows2, senses=my_sense,rhs=rhs2)
for i in range(0,number_squares):
sos_var = variable_list[i*nummats:i*nummats+nummats]
num_var = self.numlist[i*nummats:i*nummats+nummats]
#print((sos_var,num_var))
prob.SOS.add(type="1", SOS=[sos_var, num_var])
my_prob.solve()
x = my_prob.solution.get_values()
my_prob.solution.write("myanswer")
#print(x)
#print(my_prob.solution.get_status_string())
#print(my_prob.solution.get_quality_metrics())
#print(dir(my_prob.solution.MIP))
#print(my_prob.solution.MIP.get_incumbent_node())
#print(my_prob.get_stats())
print("starting" + str(square_list))
print("solution :" + str(x))
print("what I think returns number of nodes (wrong): " + str(my_prob.solution.MIP.get_incumbent_node()))
#print(my_prob.solution.get_integer_quality())
#print(self.cs)
mysum=0.0
for k in range(0,number_squares):
sub_slice = x[k*nummats:k*nummats+nummats]
for j in range(0,len(sub_slice)):
mysum = mysum+sub_slice[j]*density_list[j]*dx**2
#print(mysum)
#print(self.cs)
#print(coiff_den)
return (x,my_prob.solution.get_status_string())
except CplexError as exc:
#print(exc)
mysum=0.0
for k in range(0,number_squares):
sub_slice = square_list[k*nummats:k*nummats+nummats]
for j in range(0,len(sub_slice)):
mysum = mysum+sub_slice[j]*density_list[j]*dx**2
#print(mysum)
#print(self.cs)
return None
def lol_print(arr):
for k in arr:
print(k)
lol = knapsack(2,[1,-1,-1,-1,],[0,0,0,0],[1,2],10.0,.1,2)
lol.solve_problem()