【算法】退火算法+背包问题 python
创始人
2025-05-31 07:23:01

目录

  • 一、概念
  • 二、算法的优点
  • 三、基本流程和公式
  • 四、例题+python代码
    • 已知背包的装载量为 c=10,现有 n=5 个物品,它们的重量和价值分别是 (2, 3, 5, 1, 4) 和 (2, 5, 8, 3, 6)。试使用模拟退火算法求解该背包问题。
    • python 代码

一、概念

模拟退火算法采用类似于物理退火的过程,先在一个高温状态下,然后逐渐退火,在每个温度下徐徐冷却,最终达到物理基态。

在这里插入图片描述

高温相当于算法随机搜索
反复退火则是状态转移,然后进行算法的局部搜索
冷却则是找到最优解的时候。

加热时,会给铁分子小球一个力,就在曲面上自由滚动,冷却下来可能就停在了某个小凹槽(即得到局部最优解),但不一定是最深的那个坑(最优解),所以要反复加热。
在这里插入图片描述

二、算法的优点

1、克服初值依赖性。
2、克服陷入局部最优解的情况。

三、基本流程和公式

(1) 初始化:初温t=t0,随机产生初始状态X0 ,令Xbest=X0,k=0;
(2) Repeat:
(2.1) Repeat:
(2.1.1) 产生新的状态 Xnew= Generate (Xk); // 状态产生函数
(2.1.2) if random[0,1] ≤ min{1, exp[-(f(Xnew)-f(X)) / tk]}
Xk = Xnew; f(Xk) = f(Xnew); // f(X)表示X的目标函数值
(2.2) Until 抽样稳定准则满足
(2.3) 退温 tk+1 = update(tk),并令 k=k+1;
(3) Until 算法终止准则满足;
(4) 输出结果

2.1.2的公式对应下图的坐标系:
f(Xk) >= f(Xnew),就是对应函数值大于等于1的部分(就是x>=0的部分)
反之,就是x<0的部分。

在这里插入图片描述

四、例题+python代码

已知背包的装载量为 c=10,现有 n=5 个物品,它们的重量和价值分别是 (2, 3, 5, 1, 4) 和 (2, 5, 8, 3, 6)。试使用模拟退火算法求解该背包问题。

python 代码

导入包:

import random
import math
import numpy as np

1、初始化

# 背包容量c, 有n个物品
# time 迭代次数, balance平衡次数
# best 记录全局最优  T 温度  rate退火率
# wsum 当前重量总和    vsum 当前价值总和
n = 5
T = 200.0
rate = 0.95
time = 10
balance = 100
global c, best, wsum, vsum
# best_way 记录全局最优解方案   now_way 记录当前解方案
best_way = [0] * n     # 将[0]复制了m遍,变成[0,0,...,0]
now_way=[0] * n

加入题目数据:

weight = [2, 3, 5, 1, 4]
value = [2, 5, 8, 3, 6]def init():global c, bestc = 10best = -1produce()

2.1.1 状态产生函数

def produce():  # 用于产生新解while(1):for k in range(n):if(random.random() < 0.5):now_way[k] = 1else:now_way[k] = 0calc(now_way)if (wsum < c):breakglobal bestbest = calc(now_way)cop(best_way, now_way, n)

2.1.2 退火过程
计算当前背包的价值,比较是否是较优解,是的话就接受!如果当前是较差的解,就按照公式去计算接受的概率 P,P大的话也接受该解。

def anneal():  # 退火函数global best, T, balancetest = [0] * nvalue_current = 0     # 当前背包价值for i in range(balance):value_current = calc(now_way)    # 计算当前背包的价值cop(test, now_way, n)  # 记录当前方案ob = random.randint(0, n-1)   # 随机选取某个物品if (test[ob] == 1):# 在背包中则将其拿出,并加入其它物品put(test)test[ob] = 1else:if(random.random()< 0.5): #接受新解的概率test[ob] = 1else:get(test)test[ob] = 1value_new = calc(test)if(wsum > c):    # 超重,则跳过continueif (value_new > value_current): # 接受该解cop(now_way, test, n)if (value_new > best):best = value_newcop(best_way, test, n) # 更新全局最优else:  # 按一定的概率接受该解g = 1.0 * (value_new - value_current) / Tif (random.random() < math.exp(g)): # 概率接受劣解cop(now_way, test, n)

3、中间使用到的将物品取出和放入背包的函数,和计算背包价值的函数

def cop(a, b, len):   # 把 b数组的值赋值a数组for i in range(len):a[i] = b[i]def calc(x):        # 计算背包价值global c, wsumvsum = 0wsum = 0for i in range(n):vsum += x[i] * value[i]wsum += x[i] * weight[i]return vsumdef put(x):     # 往背包随机放入物品while(1):ob = random.randint(0, n-1);if (x[ob] == 0):   # 当前情况下物品还不在包里面x[ob] = 1breakdef get(x):     # 往背包随机拿出物品while(1):ob = random.randint(0, n-1);if (x[ob] == 1):x[ob] = 0break

4、主函数

if __name__ == '__main__':init()flag = 0;          # 找到最优解for i in range(time):anneal()T = T * rate   # 温度下降print('找到最终解:', best, '迭代次数', time);print('方案为:', best_way);

END

相关内容

热门资讯

3天3板!哈尔斯确认:与泡泡玛... 近日,潮玩巨头泡泡玛特旗下的Labubu系列热度爆棚,有关话题频繁登上热搜,资本市场上,相关概念股也...
V观财报|方大特钢财报披露不准...   中新经纬6月13日电 方大特钢13日公告,因财报披露不准确,公司及居琪萍、颜军被出具警示函。  ...
股价猛涨近200%!这家ST公... 6月11日晚间,亚振家居股份有限公司(下称“亚振家居”、“*ST亚振”,603389.SH)发布公告...
上期能源:做好市场风险控制工作... 6月13日,上期能源发布关于做好市场风险控制工作的通知:近期国际形势复杂多变,市场波动较大,请各有关...
专访网智天元科技集团股份有限公... 初见网智天元创始人莫倩,他穿着一件蓝色的polo衫,胸前刻画着一只老鹰的图案。出生于1972年的他,...
绿通科技跨界“豪赌”半导体,胜... 半导体领域再现跨界并购。6月2日晚间,绿通科技(301322.SZ)发布公告称,拟以现金方式收购江苏...
护城河尚浅,理想汽车驶入慢车道... 曾经领跑国内新能源车圈的理想汽车,正在降速。2025年第一季度,理想营收仅同比微增1.1%,净利润同...
“2025 ESG与高质量发展... 本文来源:时代周报 作者:郭儒逸6月13日,广东时代传媒集团主办的“2025 ESG与高质量发展创新...
21对话|影石创新刘靖康:“敲... 21世纪经济报道记者 雷若馨 深圳报道6月11日,“智能影像第一股”影石创新(688775.SH)登...
36个笔记28个是广告和蹭流量... 出品/壹览商业 李彦 想在小红书上找一瓶靠谱的洗发水有多难? 最近,壹览商业做了个测评,来讨论“在...
深天马A董事长辞职 “80后”... 每经记者|王晶 每经编辑|马子卿 6月12日,深天马A(SZ000050,股价8.07元,市值19...
疯狂套现60多亿,“预制菜大王... A股上市公司赴港IPO已经变得越来越流行,近一年A股就有近80家公司申请港股IPO,这里面很多都是行...
A股龙虎榜丨千红制药涨停,换手... 格隆汇6月13日|千红制药(002550)(002558.SZ)今日涨停,换手率25.52%,成交额...
本周A股市场涨跌榜:稀土永磁概... 本周(6月9日至6月13日),A股三大指数涨跌互现。截至周五收盘,上证指数累计下跌0.25%,深证成...
飞速创新“带病”上市:利润“开... 近日,深圳市飞速创新技术股份有限公司(简称“飞速创新”)向港交所递交上市申请,中金公司、中信建投和招...
当下行情,为什么要关注十年国债... 今年以来,外围环境不确定性急剧升温,特朗普关税大棒反复无常,全球资本市场风声鹤唳。在外部充满不确定性...
员工炮轰惊动马云,阿里并购得与... 文 | 张佳儒近日,一则前阿里员工的万字长文在网络上掀起轩然大波。文中直击阿里巴巴“外部收购多数失败...
影石刘靖康谈上市:从开荒者到守... 6月11日,当上市的钟声在科创板敲响,影石创新(Insta360)这家成长于深圳的智能影像公司,迎来...
张小泉:法院裁定受理间接控股股... 6月13日,张小泉股份有限公司(张小泉,301055.SZ)公告,公司于6月13日收到间接控股股东富...
反对比例近45%,知名房企巨头... 近日,知名房企巨头在债务重组方面再度遭遇波折。数据显示,反对比例近 45%,这一情况引发了广泛关注。...
年销增长5000万,他连续九年... 在中国电商蓬勃发展的浪潮中,陈波并不是一个家喻户晓的名字,但他的品牌“美瑞德”却悄然占据了“适老化产...
波音坠机背后,两名吹哨人意外死... 作者| 猫哥来源| 大猫财经Pro&是史大郎波音787飞机在印度坠落,很惨烈,原因不清楚,但印度人都...
中国市场5年少卖130万辆车后... 在不再能将中国区作为最大单一市场后,大众汽车宣布其乘用车品牌中国CEO换“帅”。6月11日,大众汽车...
印度客机坠毁前,波音“吹哨人”... 波音吹哨人的死亡预警,果然还是应验了!一架波音787客机,在印度刚起飞就坠毁,机上242名乘客,只有...
医保结余留用,能不能“简单点”... 医保结余留用这一政策,能否做到“简单点”呢?一方面,它旨在激励医疗机构合理使用医保资金,提高资金使用...
保持增长!央行最新金融数据传递... 文/夏宾刚刚,中国央行公布了5月的金融数据,显示出金融总量合理增长,有力支持实体经济。5月末,社会融...
3000平方米逛不完!转转首家... 中国商报(记者贺阳 文/图)近日,国内循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式...
红利策略热度不减!港股红利ET... 在红利投资热度持续升温的背景下,港股红利ETF正在成为资金布局的重点。Wind数据显示,截至6月11...
最危险的战争,爆发了 最危险的... 原创 刘晓博近年来最危险的战争,今天爆发了!为了阻止伊朗发展核武器,在失去谈判耐心之后,以色列先发制...