python分支限界剪枝思想小练习

题目:两个乒乓球队进行比赛,各出三人。甲队为1, 2, 3三人,乙队为4, 5, 6
三人。已抽签决定比赛名单。有人向队员打听比赛的名单。
1说他不和4比,3说他不和4, 6比,请编程序找出三队赛手的名单。

思路:类似于分支限界的剪枝法,穷举回溯
a,b,c代表甲队的1,2,3
d,e,f代表最后符合筛选条件的,分别对应于1,2,3的对手

a=1
b=2
c=3
d=4
e=5
f=6
for i in range(1,4):
        for j in range(4,7):
            if (i == 1 and j == 4):
                continue
            if ((i == 3 and j == 4) or (i == 3 and j == 6)):
                continue
            for k in range(4,7):
                if(k==j):
                    continue
                if(i==1):
                    d=j
                    e=k
                    f=15-j-k
                if (i == 2):
                    e = j
                    f = k
                    d = 15 - j - k
                if (i == 3):
                    f = j
                    d = k
                    e = 15 - j - k
                if(not(a==1 and d==4) and (c==3 and d==4) and (c==3 and f==6)):
                    d=j
                    e=k
                    f=15-j-k
                    break
print('%d的对手为:%d'%(a,d))
print('%d的对手为:%d'%(b,e))
print('%d的对手为:%d'%(c,f))


#运行结果

# 1的对手为:6
# 2的对手为:4
# 3的对手为:5

法二
a,b,c代表甲队的1,2,3
d,e,f代表最后符合筛选条件的,分别对应于1,2,3的对手
思路:随机变换d,e,f对应的4,5,6的对应关系
直到出现符合跳出循环条件的结果出现

a=1
b=2
c=3
d=4
e=5
f=6
i=0
while((a==1 and d==4) or (c==3 and f==4) or (c==3 and f==6)):
# while (not ((a==1 and d==6) and (b==2 and e==4) and (c==3 and f==5))):
    i=i+1
#if这几个交换位置怎样换都可以,但必须保证三种交换可能都必须出现一次
#即例如:第一个是d和e交换,第二个是e和f交换,第三个必须是d和f交换
#想降低时间复杂度可以考虑交换顺序与赋予初值之间的配合
    if(i%2):
        temp=f
        f=e
        e=temp
    if(i%3):
        temp = d
        d = f
        f = temp
    else:
        temp = d
        d = e
        e = temp
print('%d的对手为:%d'%(a,d))
print('%d的对手为:%d'%(b,e))
print('%d的对手为:%d'%(c,f))

#运行结果
# 1的对手为:6
# 2的对手为:4
# 3的对手为:5

方法粗糙,但易于理解,有误望指正

Python中的分支限界法(Branch and Bound)是一种用于解决最优化问题的搜索算法,特别适用于整数线性规划问题,如0-1背包问题。0-1背包问题是一个经典的动态规划问题,其中每个物品有一个价值和一个重量,目标是在不超过给定总重量的情况下,选择物品以最大化总价值。 分支限界法的工作原理包括以下步骤: 1. **定义状态空间**:用二维数组表示背包问题的状态,其中每个元素(i, w)代表背包容量为w时,前i个物品的最大价值。 2. **划分节点**:从初始状态开始,对于每个可能的物品选择(包含或不包含),创建两个子节点,分别对应于包含和不包含该物品。 3. **评估节点**:计算每个子节点的上界(即在当前限制条件下可能达到的最大值),如果小于已知最优解,则剪枝(跳过搜索)。 4. **回溯搜索**:选择未剪枝的最优子节点继续扩展,直到找到最优解或者所有子节点都被剪枝。 5. **使用剪枝策略**:例如,基于可行性约束和上界信息,可以选择只探索那些有可能提供更好解的路径。 6. **递归调用**:对每个子节点递归地应用上述步骤,直到所有可能的选择都被尝试过。 在Python中,可以使用内置的数据结构如列表、字典和集合,以及递归来实现分支限界法。Pandas库也提供了数据处理和存储方便,但核心的搜索逻辑通常会使用循环或递归函数来构建。 如果你正在编写代码,可能会用到类似这样的伪代码框架: ```python def branch_and_bound(items, capacity, values, weights, upper_bound, explored): # ... 初始化和剪枝逻辑 ... if capacity == 0 or not items: # 边界条件 return 0 # 构建子节点 for i, item in enumerate(items): include = branch_and_bound(..., ...) exclude = branch_and_bound(..., ...) # 更新最优解和上界 if include > upper_bound: upper_bound = include best_solution = ... # 剪枝决策 if include <= exclude: # 如果包含不如排除,剪枝 continue # 存储和记录探索过的节点 explore(...) return upper_bound # ... 调用函数并传入参数 ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值