You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求推荐传教士与食人族问题的启发式函数(Python实现Greedy/A*用)

Great question—coming up with a solid heuristic for the Missionaries and Cannibals problem is one of those tricky parts that makes search algorithms feel less straightforward. Let’s walk through a few proven, admissible options that work perfectly for Greedy or A* search, with explanations so you can pick what fits your implementation best:

  • Heuristic 1: Unconstrained Minimum Transport Steps
    This is a classic admissible heuristic (meaning it never overestimates the actual number of steps needed to reach the goal) because it ignores the "no cannibals outnumber missionaries" constraint to calculate a strict lower bound for required trips. Here's how to compute it:

    1. Let m = number of missionaries on the starting bank, c = number of cannibals on the starting bank, b = boat position (0 for starting bank, 1 for target bank), and k = maximum boat capacity.
    2. Total people left to transport: total = m + c. If total == 0, h(n) = 0.
    3. If the boat is on the target bank (b=1), add 1 to the final count (we need to first send the boat back to the starting bank).
    4. For the transport count (when boat is on starting bank):
      • If total <= k: Only 1 trip needed.
      • Else: 2 * ((total - k) // (k - 1)) + 1 (this accounts for round trips: each round trip except the last one moves k-1 people to the target, and the final trip moves the remaining people).
        For example, with 3 missionaries, 3 cannibals, and a boat capacity of 2: the heuristic gives 9 steps, which matches the optimal solution's step count—perfect for guiding A* to the optimal path fast.
  • Heuristic 2: Max of Missionary and Cannibal Transport Steps
    This is another admissible option that breaks the problem into two separate subproblems: moving all missionaries, and moving all cannibals. Calculate the unconstrained minimum steps for each group (using the same logic as Heuristic 1 for each group alone), then take the maximum of the two values.
    The logic here is simple: you can't finish the problem faster than you can finish either subproblem, so the maximum gives a valid lower bound. This can sometimes be tighter than Heuristic 1 for certain edge states, and it's just as easy to implement.

  • Heuristic 3: Danger-State Adjusted Lower Bound (for Greedy Search)
    If you're using Greedy search (where optimality isn't required, but speed is), you can adjust Heuristic 1 or 2 to prioritize states that avoid dangerous situations (cannibals outnumbering missionaries on a bank where missionaries are present). For example:

    • Check both banks: if either bank has a dangerous state, add 1 to the heuristic value from Heuristic 1/2.
      This isn't strictly admissible (so don't use it for A* if you need optimal solutions), but it helps the Greedy search avoid wasting time exploring paths that will hit dead ends due to safety violations. It's a great way to make your Greedy implementation find a solution much faster.

A quick note for A*: stick with Heuristic 1 or 2 to guarantee you find the shortest path. Heuristic 3 is better suited for Greedy where you want speed over optimality.

内容的提问来源于stack exchange,提问作者Amirition

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:47:47