2013-07-01 8 views
0

Я работаю по реализации задачи о рюкзаке, но я не мог реализовать это право кода просто продолжает идти в этот бесконечный цикл While (истинный)
вот код:бесконечный цикл в python?

class KSBB: 
    global x 
    global y 
    x=[] 
    y=[] 
    global sp 
    sp=0 
    global cw 
    global cp 
    global nw 
    global np 
    cw,cp,nw,np=0,0,0,0 
    global k 
    k=0 
    global pi 
    pi=0 
def __init__(self,a,b,c): 
    self.weights=a 
    self.values=b 
    self.c=c 
    x=len(self.weights) 
    y=len(self.weights) 

Связанный метод:

def bound(self): 
    global cp 
    found=False 
    bv=0 
    n=len(self.weights) 
    np=cp 
    nw=cw 
    pi=k 
    while(pi < n and ~found): 
     if(nw+self.weights[pi] <= self.c): 
      nw+=self.weights[pi] 
      np+=self.values[pi] 
      y.append(1) 
     else: 
      bv=np+((self.c-nw)*(self.values[pi]/self.weights[pi])) 
      found=True 
      #y.append(0) 
     pi+=1 
    if found: 
     pi-=1 
     return bv 
    else: 
     return np 

Ветвление Метод:

def Knapsack(self): 
    n=len(self.weights) 
    while True: 
     global sp 
     while (self.bound() <= sp): 
      while(k !=0 and y[k] !=1): 
       k-=1 
      if (K==0):return 
      y[k]=0 
      cw-=self.weights[k] 
      cp-=self.values[k] 
     cw=nw 
     cp=np 
     k=pi 
     print k 
     if (k==n):    
      sp=cp 
      x=y 
      k=n-1 
     else: 
      y[k]=0 

Метод вывода:

def output(self):return sp 
+2

Я думаю, что 'global' ключевое слово не делать то, что вы думаете, что делает –

ответ

3
if (K==0) 

, вероятно, следует

if (k==0) 

Просто опечатка ...

Легко локализовать эту проблему - вы знаете, где вы хотите, чтобы завершить свой цикл и только вещь, которая может пойти не так, является вашим заявлением if. Проявление таких вещей легко и одна из самых простых вещей, которые нужно освоить в программировании. Вам нужно научиться отладке, как только ваши программы начнут работать дольше, чем 5 строк.

+0

Есть много предупреждений о именах переменных одного письма там. Некоторые люди всегда думают, что они знают лучше, и что все будет хорошо, если они будут достаточно осторожны. –

+0

@sashkello Спасибо за вашу помощь, после исправления опечатки он все еще находится в бесконечном цикле. Похоже, у меня есть логическая ошибка в самой реализации, которую я не могу найти. – Ahnassif

+0

Напечатайте k в начале этого времени и посмотрите, что он вам дает. Застрял ли он в этом цикле или, возможно, в некоторых внутренних петлях? Это будет первый шаг, чтобы выяснить проблему. – sashkello

1

~found - побитовое дополнение. Я думаю, вы имеете в виду not found!

>>> ~False 
-1    # True 
>>> ~True 
-2    # also True! 
+0

Это не привело бы к бесконечному циклу, хотя бы потому, что он должен вырваться с «pi». Еще одна ошибка, хотя кажется. – sashkello

+0

@gnibbler Спасибо за ваше освобождение. – Ahnassif