- "最小重量机器设计问题"分析
1.1 解空间
问题理解
从代码分析,这是一个最小重量机器设计问题:
有 n 个部件(1...n)
有 m 个供应商(1...m)
对于部件 i,供应商 j提供:
成本:c[i][j]
重量:w[i][j]
总成本限制:d
目标:选择每个部件的供应商,使得: - 总成本 ≤ d
- 总重量最小
解空间形式化
解空间:所有可能的供应商选择组合
每个部件有 m种供应商选择,所以:
解空间大小:mⁿ
每个解是一个长度为 n 的向量 (x₁, x₂, ..., xₙ)
其中 xᵢ ∈ {1, 2, ..., m} 表示部件 i 选择的供应商编号
可行解:满足总成本约束 ∑c[i][xᵢ] ≤ d
最优解:所有可行解中总重量 ∑w[i][xᵢ] 最小的解
1.2 解空间树
树的结构
根节点:未选择任何部件
深度:树深为 n(有 n 层)
第 i 层节点:表示前 i 个部件的选择已确定
叶子节点:深度为 n,表示一个完整选择方案
分支因子
每个非叶子节点有 m个子节点
每个子节点对应一个供应商选择
示例(n=3, m=2)
根 (层0)
/
x₁=1 x₁=2 (层1)
/ \ /
x₂=1 x₂=2 x₂=1 x₂=2 (层2)
/ \ / \ / \ /
... ... (层3,叶子)
完全展开的节点数
总节点数:1 + m + m² + ... + mⁿ = (m^(n+1)-1)/(m-1)
当 m=2, n=3 时:1+2+4+8=15个节点
叶子节点数:mⁿ 个
1.3 遍历过程中的节点状态值
每个节点的状态包含: - 当前深度 t:已考虑的前 t 个部件
- 当前选择 x[1...t]:前 t 个部件的供应商选择
- 累计成本 sc:∑_{i=1}^t c[i][x[i]]
- 累计重量 sw:∑_{i=1}^t w[i][x[i]]
状态传递
向下扩展:从父节点到子节点时
t 增加 1
为新部件选择一个供应商
sc 加上新成本
sw 加上新重量
向上回溯:从子节点返回父节点时
t 减少 1
sc 减去最后添加的成本
sw 减去最后添加的重量
剪枝条件
代码中的剪枝条件:
if(sc <= d && sw < Min) {
Back(t+1);
}
可行性剪枝:sc ≤ d(总成本不超过预算)
最优性剪枝:sw < Min(当前部分解重量已超过已知最优解)
全局状态
Min:当前找到的最小总重量(初始化为一个大数)
minx[1...n]:当前最优解的选择方案
x[1...n]:当前探索路径的选择方案 - 对回溯算法的理解
基本概念
回溯算法是一种系统性的搜索算法,用于在问题的解空间中寻找所有满足约束条件的解。它通过深度优先搜索的方式遍历解空间树,并在搜索过程中使用剪枝函数来避免无效搜索。
核心思想
"试探-回溯"机制 - 前进:逐步构建部分解,每次选择一个决策
- 约束检查:检查当前部分解是否满足约束
- 剪枝:如果不满足约束,放弃继续扩展
- 回溯:返回上一层,尝试其他选择
与DFS的关系
相同点:都是深度优先遍历
不同点:
普通DFS:遍历所有节点
回溯法:在遍历过程中进行剪枝
回溯算法的三要素 - 解空间
问题的所有可能解构成的集合
通常组织成树形结构(解空间树)
树中的路径对应一个候选解 - 约束条件
显式约束:确定解空间,如 xᵢ ∈ {1, 2, ..., m}
隐式约束:判定可行解的条件,如 ∑c[i][xᵢ] ≤ d - 限界函数(剪枝函数)
用于判断当前部分解是否可能扩展为最优解
在搜索过程中尽早排除不可能的分支
是提高算法效率的关键
浙公网安备 33010602011771号