2015-02-24 6 views
0

Я пытаюсь написать код для проблемы с рюкзаком. Где есть рюкзак с весовой емкостью, и вы выбираете определенное сочетание предметов, чтобы найти наилучшее возможное решение. Тем не менее, я пытаюсь случайным образом генерировать возможные решения. Таким образом, мой код будет выбирать случайное количество случайных элементов (сгенерировать список случайных размеров) и проверить, возможно ли решение (меньше емкости) или невозможно (больше емкости). Но у меня проблемы с random.sample(). Чтобы получить список случайных размеров, я устанавливаю k как leng (случайное целое число), а популяция представляет собой случайный список элементов, выбранных из диапазона заданных элементов. Но я знаю, что если leng больше, чем население, то есть ValueError. Я хочу использовать random.sample(), поэтому у меня может быть список уникальных номеров, но мне нужно как-то обойти ValueError. Я попытался сделать попытку: и кроме ValueError: но я не уверен, как это осуществить. Это то, что у меня есть до сих пор:Как я могу обойти ValueError из random.sample в Python?

def genSoln(cap, items) 
    g = input("Would you like to generate random potential solutions? [y/n] ") 
    if g == 'y': 
     gen = int(input("Number of times to generate/check random potential solutions? ")) 
     totalwt = 0 
     totalval = 0 
     for i in range(1,gen+1): 
      try: 
       pop = range(1,items) 
       leng = random.randint(1,8) 
       ran = random.sample(pop, leng) 
      except ValueError: 
       pass 
      for i in ran: 
       totalwt += int(wts[i]) 
       totalval += int(vals[i]) 
       if i == len(ran): 
        if totalwt < int(cap): 
         print("Items picked: ", ran) 
         print("Feasible: ", "Total Wt = ", totalwt, "Total Val = ", totalval) 
        else: 
         print("Items picked: ", ran) 
         print("Infeasible: ", "Total Wt = ", totalwt, "Total Val = ", totalval) 
        totalwt = 0 
        totalval = 0 
+0

вместо жесткого кодирования верхнего предела leng, почему вы не используете размер pop как верхний предел? – Calum

+0

Так что ... 'ran = random.sample (pop, len (pop))'? –

+0

да или даже просто: 'ran = random.sample (pop, items)', предполагаемые элементы - целое число – Calum

ответ

1

Thsi должен это сделать.

leng = random.randint(1, items)