回溯法:最小重量机器设计问题(python解决)

问题描述:
最小重量机器设计问题:设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设 w[i][j] 是从供应商j处购得的部件 i 的重量, c[i][j]是相应的价格。试设计一个算法,给出总价格不超过 p 的最小重量机器设计。
利用回溯法求解问题,首先可以为该题的二维数组w、c赋初值,不妨令n=3,m=2、p=60。构造回溯法中的解空间树,大概如下:
这里写图片描述
根据回溯法的要求,进行的是深度遍历,同时满足重量尽可能小,价格不能超过p。
明确以上要求后便可以进行代码的编写:

# coding = 'utf-8'
# python
# 最小重量机器设计问题:设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。
# 设 w[i][j] 是从供应商j处购得的部件 i 的重量, c[i][j] 是相应的价格。
# 试设计一个算法,给出总价格不超过 p 的最小重量机器设计

# 限定:价格不超过p 重量尽可能小

n = 3 # 零件数量
m = 2 # 供应商数量
p = 60 # 不应超过的价格

w = [[12, 15], [23, 24], [78, 70]] # 供应商j处购得的部件 i 的重量
c = [[8, 6], [13, 9], [14, 25]] # 相应的价格

min_weight = 10000
bast_choose = [None]*3

cur_choose = [None]*10
cur_weight = 0
cur_price = 0

def backtrack(t):
# 此处的t代表每一次遍历i供应商的零件
    global cur_weight, cur_price, cur_choose, min_weight, p, w, c
    if t == n:
        # 遍历到叶子结点
        if cur_weight < min_weight:
            min_weight = cur_weight

            for j in range(n):
                bast_choose[j] = cur_choose[j] + 1
            return

    else:
        for i in range(m): # 遍历供应商
            cur_choose[t] = i
            cur_weight += w[t][i]
            cur_price += c[t][i]

            if cur_weight < min_weight and cur_price <= p:
                # 该供应商的重量小于局部最优解 同时价格满足要求 则遍历其子树
                backtrack(t+1)

            cur_weight -= w[t][i]
            cur_price -= c[t][i]

            cur_choose[t] = 0

def main():
    backtrack(0)
    print('最小的重量是:%d'%min_weight)
    print('最佳选择是:',bast_choose)

if __name__ == '__main__':
    main()

运行截图:
这里写图片描述

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangbowj123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值