(1)回溯法要求要给出约束条件,总价格不超过c,设当前已选部件的重量和为cw,价格之和为cc.
(2)初始化供应商数量及部件数量,然后初始化部件的一些属性作为测试数据。程序关键点是中间变量的总价值取较小的那个,总重量与最小重量bestw的比对是否达到最小,最优。此问题属于类01背包问题,即在某个变量的限制条件下,另一个变量的最优值问题。
(3)首先考虑问题输出,应该为每个零件的供货商编号,如果设为x[i],则此算法最终输出为x[i]的遍历,其中i为第i件零件。
(4)考虑回溯法的解空间树,因为每个商品可以从m个供货商获得,则问题的解空间树是一棵m叉树,该树属于子集树而非排列树。
(5)考虑剪枝条件,此问题中的限制条件为价格上限c,最小重量设bestw,则当 当前价格<c 且 当前重量 < bestw时,执行树的深度遍历,否则,执行回溯,因此本问题中包含两个剪枝条件。
(6)最后是更新最优值,以及问题的解,本题中最优解是bestw,解集合是x[i]。递归出口处更新一种最优解,以及对应解集合。
有n个零件与m个厂商,解空间是总价格不超过总重量和供应商的集合
回溯法的解空间树,因为每个商品可以从m个供货商获得,则问题的解空间树是一棵m叉树,该树属于子集树。
每个结点的状态应该是当前背包的价值和重量。
(1)回溯法
回溯算法是一种选优搜索法,按选优条件向前搜索,以达到目标。简单的说是在搜索过程中寻找问题的解,当发现已不满足求解条件时,就回溯返回,尝试别的路径。
当探索到某一步时,发现原先选择不是目前的最优解或不满足问题条件时,就退回一步重新选择,并减去当前步骤的节点对应的值,这种方法为回溯法。
(2)剪枝函数:
回溯已经走了这个步骤,走过处理的逻辑,当前节点的数据存在参与计算。退回上一步,则需要减去当前步骤的数据,编写去除这些节点数据的函数就是剪枝函数。