我正在尝试为背包问题编写代码。哪里有一个重量容量的背包,你选择一个项目的组合,以找到最好的解决方案。我试图随机生成可能的解决方案。因此,我的代码将选择一个随机数量的随机项(生成随机大小的列表)并测试以确定解决方案是否可行(小于容量)或不可行(大于容量)。但是,当我尝试将总重量和所有项目的总价值相加时,该数字将关闭。比方说,这是每个项目的数据。
Itms Wts Vals
=====================
1 22 80
2 29 35
3 12 36
4 14 24
5 29 41
6 30 87
7 18 10
8 22 63
9 12 66
10 27 72
这是运行代码后的结果:
Items picked: [6, 4, 1, 7, 8, 3]
Feasible: Total Wt = 18 Total Val = 10
Items picked: [1]
Infeasible: Total Wt = 135 Total Val = 264
Items picked: [5, 1, 8, 6, 7, 4]
Infeasible: Total Wt = 89 Total Val = 198
因此值不正确。但我不知道我的代码中有什么问题:
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):
pop = range(1,items)
leng = random.randint(1,len(pop))
ran = random.sample(pop, leng)
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 :(得分:0)
没关系。我自己想出了答案。我只需要取出if i == len(ran):
,将totalwt
和totalval
移到for循环(for i in range(1,gen+1)
)中,并在添加到totalwt
时从i中减1 totalval
。
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? "))
for i in range(1,gen+1):
totalwt = 0
totalval = 0
pop = range(1,items)
leng = random.randint(1,len(pop))
ran = random.sample(pop, leng)
for i in ran:
totalwt += int(wts[i-1])
totalval += int(vals[i-1])
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)