我正在尝试使用背包问题进行简单的爬坡。
我有一个调整函数,该函数旨在返回馈入其中的二进制值列表的稍微修改的值。然后,我将此新值与现有值进行比较,以了解更好的方法。
但是,我遇到了一个奇怪的问题,当我尝试将新解决方案分配为当前解决方案的调整副本时,将立即用调整后的值替换当前解决方案和新解决方案。循环中的每个列表都将替换为相同的值,我也不知道为什么。我已经尝试与其他列表具有相同效果的相同事物。为什么会这样?
编辑:从数组更改为列表
from random import randrange
import numpy as np
val = [8, 7, 6, 3, 3]
iteration = 0
def generateInitialState():
array = []
k=0
while k != len(val):
array.append(randrange(0,2))
k+=1
return array
CurrentSolution = generateInitialState()
def Quality(Solution):
sum_items = 0
newValue = np.multiply(val,Solution)
for item in newValue:
sum_items += item
return sum_items
def Tweak(Solution):
print(str(Solution) + ' : ' + str(Quality(Solution)))
TempSolution = Solution
if Solution[iteration] is 0:
TempSolution[iteration] = 1
else:
TempSolution[iteration] = 0
print(str(TempSolution) + ' : ' + str(Quality(TempSolution)))
return TempSolution
while iteration < 5:
iteration+=1
NewSolution = Tweak(CurrentSolution)
if Quality(NewSolution) > Quality(CurrentSolution):
print('New good value detected'+ str(Quality(NewSolution)))
CurrentSolution = NewSolution
else:
print('Best solution found')
break
在Python中,变量始终是对对象的引用,而不是对象本身。对象是驻留在内存中的一条数据,或者至少可以这样想象。用Python术语来说是“变量绑定到对象”。
如果将一个变量分配给另一个变量,例如TempSolution = Solution
,则将引用复制到同一对象(列表)。换句话说,这两个变量现在都已绑定到内存中的同一列表,并且通过一个变量或另一个变量来更改列表并不重要。
要复制对象本身,请查看Python的copy
标准库(https://docs.python.org/3/library/copy.html)。它提供功能copy
和deepcopy
。前者复制一个对象,但不复制内部的引用,而后者则递归地复制所有引用。
所以,我建议:
import copy
# ...
def Tweak(Solution):
# ...
TempSolution = copy.copy(Solution)
[恕我直言,与TempSolution = Solution[:]
相对,这更清楚地表明您打算复制列表。
TempSolution = Solution[:]
这解决了问题!评论中有更多详细信息