kafkahaomei

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1. "最小重量机器设计问题"分析
    1.1 解空间
    问题理解
    从代码分析,这是一个最小重量机器设计问题:
    有 n 个部件(1...n)
    有 m 个供应商(1...m)
    对于部件 i,供应商 j提供:
    成本:c[i][j]
    重量:w[i][j]
    总成本限制:d
    目标:选择每个部件的供应商,使得:
  2. 总成本 ≤ d
  3. 总重量最小
    解空间形式化
    解空间:所有可能的供应商选择组合
    每个部件有 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 遍历过程中的节点状态值
    每个节点的状态包含:
  4. 当前深度 t:已考虑的前 t 个部件
  5. 当前选择 x[1...t]:前 t 个部件的供应商选择
  6. 累计成本 sc:∑_{i=1}^t c[i][x[i]]
  7. 累计重量 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]:当前探索路径的选择方案
  8. 对回溯算法的理解
    基本概念
    回溯算法是一种系统性的搜索算法,用于在问题的解空间中寻找所有满足约束条件的解。它通过深度优先搜索的方式遍历解空间树,并在搜索过程中使用剪枝函数来避免无效搜索。
    核心思想
    "试探-回溯"机制
  9. 前进:逐步构建部分解,每次选择一个决策
  10. 约束检查:检查当前部分解是否满足约束
  11. 剪枝:如果不满足约束,放弃继续扩展
  12. 回溯:返回上一层,尝试其他选择
    与DFS的关系
    相同点:都是深度优先遍历
    不同点:
    普通DFS:遍历所有节点
    回溯法:在遍历过程中进行剪枝
    回溯算法的三要素
  13. 解空间
    问题的所有可能解构成的集合
    通常组织成树形结构(解空间树)
    树中的路径对应一个候选解
  14. 约束条件
    显式约束:确定解空间,如 xᵢ ∈ {1, 2, ..., m}
    隐式约束:判定可行解的条件,如 ∑c[i][xᵢ] ≤ d
  15. 限界函数(剪枝函数)
    用于判断当前部分解是否可能扩展为最优解
    在搜索过程中尽早排除不可能的分支
    是提高算法效率的关键
posted on 2025-12-22 21:37  卡芙卡豪美  阅读(0)  评论(0)    收藏  举报