数学建模|通过模拟退火算法求解供货与选址问题:问题二(python代码实现)

这篇具有很好参考价值的文章主要介绍了数学建模|通过模拟退火算法求解供货与选址问题:问题二(python代码实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天继续用模拟退火算法供货与选址问题的问题二,如果还没看过问题一的可以看我之前的博客

数学建模|通过模拟退火算法求解供应与选址问题:问题一(python代码实现)-CSDN博客

这里还是把题目放上来(题目来自数学建模老哥的视频):

数学建模|通过模拟退火算法求解供货与选址问题:问题二(python代码实现),模拟退火算法,数学建模,模拟退火算法,python,算法,机器学习,numpy

那么我们可以分析一下,第一问和第二问还是有联系的。区别就是第一问的A和B的坐标是固定的,所有AB到六个工地的距离也是固定的,我们的自变量就是AB对六个工地的供货量。这个自变量的解,我们在第一问已经求出来了。第二问这里,AB的坐标就不固定了。也就是AB坐标也成了我们要求的自变量的一部分。那我们的自变量就变成了 AB的坐标 + AB的供货量。因为我们的目标函数 = 距离 × 供货量,第一问的距离是固定的,所有我们不用管它。但是第二问,AB的坐标在变化,所有我们每次计算目标函数的时候都要重新计算一次距离。那么我们就要写一个计算距离的函数,就叫get_juli()吧。那么我们这个距离函数要怎么才能计算距离,是不是要先从自变量里拿到我们AB当前的坐标,才能计算距离并返回,那它的计算方式还是和第一问一样。

分析到这里其实就差不多,与第一问相比就多了一个AB的坐标和一个距离函数。其他都和第一问差不多。

这里先用一个numpy数组存储我们的自变量,也就是AB的坐标和AB的供货量。

数学建模|通过模拟退火算法求解供货与选址问题:问题二(python代码实现),模拟退火算法,数学建模,模拟退火算法,python,算法,机器学习,numpy

这里用一个两行八列的数组存储就行了,每个元素代表什么意思我也写清楚了。

我们再用一个info数组存储一些固定信息,包括工地的坐标和需求量,AB坐标的取值范围。方便我们计算的时候直接获取到。这里再说一下,为什么AB坐标的变化范围是0到10呢?当然是猜的啦。因为工地坐标的变化范围也是在0到10之间。如果把AB坐标的变化范围搞得很大,就会多出很多无效计算。

数学建模|通过模拟退火算法求解供货与选址问题:问题二(python代码实现),模拟退火算法,数学建模,模拟退火算法,python,算法,机器学习,numpy

然后我们定义我们距离函数,这个函数要把自变量传进去,然后获取到AB当前的坐标,再与info中的工地坐标进行计算就能得到距离了,公式和第一问是一样的。

def get_juli(x):
    juli = np.array([
        np.sqrt(np.sum((info[0:2,2:9] - x[0:2,0:1]) ** 2, axis=0)),
        np.sqrt(np.sum((info[0:2,2:9] - x[0:2,1:2]) ** 2, axis=0))
    ])
    return juli

然后,再定义目标函数和约束条件,这里和第一问是一样的。不过要注意,因为自变量x与第一问的自变量有一点点改变,所有我们要保证约束条件接收到的是AB的供货量而不包括AB的坐标。

target_fun = lambda x,juli: np.sum(juli * x[0:2,2:9])
st_fun1 = lambda x: np.sum(x[0:2,2:9],axis=1)[0]<=20 and np.sum(x[0:2,2:9],axis=1)[1]<=20
st_fun2 = lambda x ,info: np.all(np.sum(x[0:2,2:9],axis=0) == info[2][2:9], axis=0)
judgy_st = lambda x,info:st_fun1(x) and st_fun2(x,info)

再就是设计自变量的更新方式。大体和第一问是一样的,就是多了AB坐标的更新方式。那就多写一个判断语句,如果更新的是AB的坐标就随机给坐标一个数就行了(包括整数和浮点数)。

def get_x(x,lb,t_move):
    i = random.randint(0,1)
    j = random.randint(0,7)
    ub = info[2][j] #这里取的是x的上限
    lb = x[i][j]-t_move*(x[i][j]-lb)
    ub = x[i][j]+t_move*(ub-x[i][j])
    # print(t_move)
    #如果是更新AB的坐标,就这样操作
    if j == 0 or j == 1:
        if random.random() > random.random():
            x[i][j] = random.uniform(lb,ub)
        else:
            x[i][j] = random.randint(lb,ub)
        return x

    #如果是更新AB的供货量,就这样操作
    if random.random() > random.random():
        x[i][j] = random.randint(int(lb), int(ub))
        x[(i + 1) % 2][j] = ub - x[i][j]
    else:
        x[i][j] = random.uniform(lb,ub)
        x[(i+1) % 2][j] = ub-x[i][j]
    return x

现在万事俱备,就是带入模拟退火算法,计算了。直接上代码:

#%%
import random
import numpy as np
import math

t = 200000000
T = 200000000
dt = 0.999999993
eps = 1e-14
n = 0


info = np.array([
    [0,0,1.25,8.75,0.5,5.75,3,7.25],
    [0,0,1.25,0.75,4.75,5,6.5,7.25],
    [10,10,3,5,4,7,6,11]
])

x = np.zeros([2,8])
#%%
def get_juli(x):
    juli = np.array([
        np.sqrt(np.sum((info[0:2,2:9] - x[0:2,0:1]) ** 2, axis=0)),
        np.sqrt(np.sum((info[0:2,2:9] - x[0:2,1:2]) ** 2, axis=0))
    ])
    return juli

#%%
target_fun = lambda x,juli: np.sum(juli * x[0:2,2:9])
st_fun1 = lambda x: np.sum(x[0:2,2:9],axis=1)[0]<=20 and np.sum(x[0:2,2:9],axis=1)[1]<=20
st_fun2 = lambda x ,info: np.all(np.sum(x[0:2,2:9],axis=0) == info[2][2:9], axis=0)
judgy_st = lambda x,info:st_fun1(x) and st_fun2(x,info)

#%%
def get_x(x,lb,t_move):
    i = random.randint(0,1)
    j = random.randint(0,7)
    ub = info[2][j]
    lb = x[i][j]-t_move*(x[i][j]-lb)
    ub = x[i][j]+t_move*(ub-x[i][j])
    # print(t_move)
    #如果是更新AB的坐标,就这样操作
    if j == 0 or j == 1:
        if random.random() > random.random():
            x[i][j] = random.uniform(lb,ub)
        else:
            x[i][j] = random.randint(lb,ub)
        return x

    #如果是更新AB的供货量,就这样操作
    if random.random() > random.random():
        x[i][j] = random.randint(int(lb), int(ub))
        x[(i + 1) % 2][j] = ub - x[i][j]
    else:
        x[i][j] = random.uniform(lb,ub)
        x[(i+1) % 2][j] = ub-x[i][j]
    return x


#%%
move = 11
jud_n = 0
best_x = get_x(x,0,1)
# breakpoint()
while judgy_st(best_x,info) != True:
    best_x = get_x(best_x,0,1)
    jud_n += 1
best_y = target_fun(best_x,get_juli(x))
print(f"f = {best_y},x = {best_x},第{jud_n}次循环")
y = best_y

#%%
while n!= 200000 :
    # print(t/T)
    dx = get_x(x,0,1)
    judgy_n = 0
    while judgy_st(dx,info) != True:
        dx = get_x(dx,0,1)
        judgy_n += 1
        if judgy_n == 1000000:
            break
    if judgy_n == 1000000:
        continue
    dy = target_fun(dx,get_juli(dx))

    if dy < y:
        y = dy
        x = dx
        if dy < best_y:
            best_y = dy
            best_x = dx
            print(f"f = {best_y},\n x = \n{best_x}\n第{n}次循环")

    elif  np.exp((y - dy) / t)  > random.random():
        y = dy
        x = dx

    # print(f"f = {y},x = {x},第{n}次循环")

    t = t * dt
    n += 1

print(n)

看一下结果:

数学建模|通过模拟退火算法求解供货与选址问题:问题二(python代码实现),模拟退火算法,数学建模,模拟退火算法,python,算法,机器学习,numpy

数学建模|通过模拟退火算法求解供货与选址问题:问题二(python代码实现),模拟退火算法,数学建模,模拟退火算法,python,算法,机器学习,numpy

然后是,视频给出来到解:

数学建模|通过模拟退火算法求解供货与选址问题:问题二(python代码实现),模拟退火算法,数学建模,模拟退火算法,python,算法,机器学习,numpy

可以看到我们计算出的解,比视频的解还节省的10的吨千米数,那我们的计算结果是更优的。然后就是为什么计算的结果会和视频的不一样。这点也不用纠结,因为视频里他计算的结果也不是每次都一样的。只要结果有说服力就行了。文章来源地址https://www.toymoban.com/news/detail-795102.html

到了这里,关于数学建模|通过模拟退火算法求解供货与选址问题:问题二(python代码实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 数学建模(三):模拟退火算法(SA)

    数学建模(三):模拟退火算法(SA)

    1、 算法简介 模拟退火算法(simulated annealing,SA)来源于固体退火原理,是一种基于概率的算法。 模拟退火算法(SA)来源于固体退火原理,是一种基于概率的算法。将固体加温至充分高的温度,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,分子和原

    2023年04月17日
    浏览(11)
  • Matlab数学建模算法之模拟退火算法(SA)详解

    🔗 运行环境:Matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥  推荐专栏:《算法研究》 🔐####  防伪水印——左手の明天 #### 🔐 💗 大家好🤗🤗🤗,我是 左手の明天 !好久不见💗 💗今天分享 matlab数学建模算法 —— 模拟退火算法 💗

    2024年01月16日
    浏览(9)
  • 【数学建模】《实战数学建模:例题与讲解》第十四讲-模拟退火、遗传算法(含Matlab代码)

    【数学建模】《实战数学建模:例题与讲解》第十四讲-模拟退火、遗传算法(含Matlab代码)

    本系列侧重于例题实战与讲解,希望能够在例题中理解相应技巧。文章开头相关基础知识只是进行简单回顾,读者可以搭配课本或其他博客了解相应章节,然后进入本文正文例题实战,效果更佳。 如果这篇文章对你有帮助,欢迎点赞与收藏~ 现代优化算法,自20世纪80年代初开

    2024年02月04日
    浏览(17)
  • 【数学建模】模拟退火全解析

    【数学建模】模拟退火全解析

    和局部束搜索相反,模拟退火将最优化策略改变,引入随机噪声,不一定每次都是最优,但是内部机制保证了最终的走向是最优,总的过程可以理解为初期广泛探索(Exploration),逐步过渡到深挖(Exploitation)。其中机理比较复杂,我们逐步去理解。 首先声明,我们这里还是

    2024年02月02日
    浏览(11)
  • 数学建模——模拟退火优化投影寻踪

    数学建模——模拟退火优化投影寻踪

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档   在考虑综合评价的时候,我们使用了各自主观、客观的方法去求解权重,客观权重的计算依靠着数据本身的分布来决定,有时候会出现各种各样不可抗拒的意外情况,其中在熵权法的解释在就有提到

    2024年02月11日
    浏览(7)
  • 数学建模之模拟退火法(SA)

    数学建模之模拟退火法(SA)

    模拟退火算法(SA)是一种模拟物理退火过程而设计的优化算法。 它的基本思想最早在1953年就被Metropolis提出,但直到1983年,Kirkpatrick等人才设计出真正意义上的模拟退火算法并进行应用。 模拟退火算法采用类似于 物理退火 的过程。先在一个高温状态下,然后逐渐退火,在

    2024年01月17日
    浏览(8)
  • 数学建模-退火算法和遗传算法

    数学建模-退火算法和遗传算法

    退火算法和遗传算法 一.退火算法 退火算法Matlab程序如下: [W]=load(\\\'D:100个目标经度纬度.txt\\\'); 二、遗传算法 [E]=xlsread(\\\'D:100个目标经度纬度\\\');  % 加载敌方 100 个目标的数据, 数据按照表格中的位置保存在纯文本文件 sj.txt 中 x=[E(:,1)]; y=[E(:,2)]; e =[x y]; d1=[70,40]; e =[d1;  e ;d1];

    2024年02月20日
    浏览(14)
  • 2023数学建模国赛B题完整论文来啦!(含一二问求解代码及三四问仿真模拟代码)

    2023数学建模国赛B题完整论文来啦!(含一二问求解代码及三四问仿真模拟代码)

    大家好呀,从昨天发布赛题一直到现在,总算完成了全国大学生数学建模竞赛B题完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 说实话团队通宵一直到现在做了这么久bc题,我收

    2024年02月09日
    浏览(9)
  • 数学建模--Lingo求解线性规划问题

    数学建模--Lingo求解线性规划问题

    一 问题重述 1.1问题背景 工厂根据外部需求和内部设备,人力,原料等条件,以及最大利润为生产目标制定生产计划,根据生产计划,工艺流程,资源约束及费用参数等,以最小的成本为目标制定生产批量计划,若短时间外部需求和内部资源等不随时间的变化,可制定单阶段

    2024年02月12日
    浏览(11)
  • 数学建模1:lingo软件求解优化模型

    数学建模1:lingo软件求解优化模型

    本次数学建模学习笔记系列,以代码学习为主,附带建模及论文亮点记录 由于队友为两位经济学小伙伴,因此以大数据类型题目为主要学习方向 注:论文代码资料来源网络 1、结构清晰(后附该论文前两问的目录结构) 2、lingo求解优化模型,涉及函数循环与求和 3、表格很好

    2024年02月08日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包