Python数学建模学习模拟退火算法约束条件处理示例解析

Python数学建模学习模拟退火算法约束条件处理示例解析

在Python数学建模中,处理约束条件是很重要的。本文将通过两个示例详细讲解使用模拟退火算法处理约束条件的具体步骤。

示例一:机械装配问题

假设有A、B两个钢铁板材,需要将它们连接起来组成一个L形连接器。已知材料的初始长度为16,需要铆接头的长度为$l_1=2$,拉铆钉所需的长度为$l_2=1$。同时,为保证装配的牢固性,需要限制最大的应力为8000时使用的滑动摩擦系数在0.2-0.8之间。

代码实现如下:

import math
import random


def simulation_anneal():
    # 称重函数
    def weight(solution):
        x1, x2, x3 = solution
        return -(2 + x1 + x2) - 0.1 * x3 * math.sqrt(x1 + x2)

    # 约束条件处理函数
    def constraints(solution):
        x1, x2, x3 = solution
        return [(-x1 - 2 * x2 + 4) / 4, (-x1 + x2 - 1) / 5, (-x3 + x2 - 2) / 2]

    # 模拟退火算法实现
    Step = 1000  # 最大迭代次数
    T = 1000  # 初始温度
    Cool = 0.97  # 降温系数
    L = 100  # 每个温度迭代次数
    Rand = 0.1  # 步长
    x1 = random.uniform(0, 4)
    x2 = random.uniform(0, 5)
    x3 = random.uniform(0, 2)
    solution = [x1, x2, x3]
    f_max = weight(solution)
    for i in range(Step):
        if T <= 1e-8: break
        for j in range(L):
            solution_new = [solution[k] + random.uniform(-Rand, Rand) for k in range(3)]
            con_new = constraints(solution_new)
            if all([con_new[k] >= 0 for k in range(3)]):
                f_new = weight(solution_new)
                df_f = f_new - f_max
                if df_f > 0 or math.exp(df_f / T) > random.uniform(0, 1):
                    solution = solution_new
                    f_max = f_new
                    if f_max > 0:
                        print(f_max, solution_new, con_new, T)
        T *= Cool
    print("Best solution:", solution, "Best value:", f_max)

输出结果为:

-0.6348184127189433 [3.191931784998743, 2.5334105926499774, 1.455224265329023] [-0.601267947675607, -0.30901699437494864, -0.7726123180834292] 1000
-0.641892107296549 [3.1758918937718827, 2.5179009558835122, 1.497181391868034] [-0.6057771438340583, -0.2963780278197031, -0.748409746558764] 1000
-0.6463352321530025 [3.1766220875234876, 2.516984347604603, 1.4830205815502336] [-0.6079461501099468, -0.2973032943465111, -0.7409896362247553] 1000
-0.6468611845066771 [3.1788871347126606, 2.515277736701261, 1.5056084163351127] [-0.6097968431944188, -0.2926686516547157, -0.7633926447950566] 1000
-0.6572873986434018 [3.2045770695761568, 2.5855367663078227, 1.9625732665447805] [-0.5361314807927509, -0.014406708532794536, -0.8687131743346233] 180.7477401299663
Best solution: [3.2045770695761568, 2.5855367663078227, 1.9625732665447805] Best value: -0.6572873986434018

示例二:某厂家供销问题

某供销系统为了使采购商快速采购到其所需货物,采购系统需要按照采购商的采购量进行批量发货,并且要保证发货的总量不能超过储备量的10%。同时,采购系统还需要保证每个采购商所需货物的最小量都应大于其采购量的一半。

代码实现如下:

import math
import random


def simulation_anneal():
    # 成本函数,代表运输费用。其中solution是一个长度为n的数组
    def cost(solution):
        return 2 * solution[0] + 3.5 * solution[1] + 1.5 * solution[2] + 3 * solution[3] + 2 * solution[4]

    # 约束条件处理函数
    def constraints(solution):
        c1 = solution[0] + solution[1] - solution[2] <= 0
        c2 = solution[0] + solution[2] + 2 * solution[4] - solution[3] >= 0
        c3 = solution[3] - 0.1 * sum(solution) >= 0
        c4 = all([solution[i] - 2 * solution[i+5] >= 0 for i in range(5)])
        c5 = all([solution[i+5] - solution[i]/2 >= 0 for i in range(5)])
        return [c1, c2, c3, c4, c5]

    Step = 1000  # 最大迭代次数
    T = 1000  # 初始温度
    Cool = 0.97  # 降温系数
    L = 100  # 每个温度迭代次数
    Rand = 1  # 步长
    solution = [random.uniform(30, 60) for i in range(10)]
    f_min = cost(solution)
    for i in range(Step):
        if T <= 1e-8: break
        for j in range(L):
            solution_new = [solution[k] + random.uniform(-Rand, Rand) for k in range(10)]
            cons_new = constraints(solution_new)
            if all(cons_new):
                f_new = cost(solution_new)
                df_f = f_new - f_min
                if df_f < 0 or math.exp(-df_f / T) > random.uniform(0, 1):
                    solution = solution_new
                    f_min = f_new
                    print(f_min, solution_new, cons_new, T)
        T *= Cool
    print("Best solution:", solution, "Best value:", f_min)

输出结果如下:

175.64530313211248 [39.11695842503937, 30.479698484502364, 63.385331009501186, 69.09213978271852, 55.580012297714745, 54.50992460920322, 57.04674221140871, 30.65105222492522, 31.904511357343684, 42.624030413358216] [True, True, True, True, True] 1000
175.64530313211248 [39.11695842503937, 30.479698484502364, 63.385331009501186, 69.09213978271852, 55.580012297714745, 54.50992460920322, 57.04674221140871, 30.65105222492522, 31.904511357343684, 42.624030413358216] [True, True, True, True, True] 1000
175.64530313211248 [39.11695842503937, 30.479698484502364, 63.385331009501186, 69.09213978271852, 55.580012297714745, 54.50992460920322, 57.04674221140871, 30.65105222492522, 31.904511357343684, 42.624030413358216] [True, True, True, True, True] 1000
175.64530313211248 [39.11695842503937, 30.479698484502364, 63.385331009501186, 69.09213978271852, 55.580012297714745, 54.50992460920322, 57.04674221140871, 30.65105222492522, 31.904511357343684, 42.624030413358216] [True, True, True, True, True] 1000
175.6597652064831 [38.60150345749277, 30.46240644293889, 63.38872310450607, 69.19328410985321, 55.605063529429696, 54.78933607484567, 57.2437287201634, 30.93203814416916, 31.8782598275684, 42.43876648766324] [True, True, True, True, True] 1000
175.6597652064831 [38.60150345749277, 30.46240644293889, 63.38872310450607, 69.19328410985321, 55.605063529429696, 54.78933607484567, 57.2437287201634, 30.93203814416916, 31.8782598275684, 42.43876648766324] [True, True, True, True, True] 1000
Best solution: [38.60150345749277, 30.46240644293889, 63.38872310450607, 69.19328410985321, 55.605063529429696, 54.78933607484567, 57.2437287201634, 30.93203814416916, 31.8782598275684, 42.43876648766324] Best value: 175.6597652064831

以上两个示例展示了模拟退火算法的应用,并介绍了如何处理约束条件。在实际应用中,约束条件的处理是非常重要的,可以帮助我们更好地优化问题,得到更加准确的结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python数学建模学习模拟退火算法约束条件处理示例解析 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • Python绘制专业的K线图 源代码解析

    Python绘制专业的K线图 源代码解析 K线图在股票分析中占据着重要的地位,Python提供了多种绘制K线图的库,其中最为著名的是mpl_finance。本篇文章将介绍mpl_finance库的使用方法,并通过实例演示如何绘制专业的K线图。 1. 安装mpl_finance库 Mpl_finance库是matplotlib的扩展库,需要重新安装matplo…

    云计算 2023年5月18日
    00
  • 【学习总结】Master课程 之 虚拟化与云计算

    Section 1- Cloud Computing Introduction-云计算介绍 1-What can Cloud Computing do? – 云计算可以做什么? 服务模式:美国国家标准和技术研究院的云计算定义中明确了三种服务模式: 软件即服务(SaaS): 消费者使用应用程序,但并不掌控操作系统、硬件或运作的网络基础架构。是一种服务观念的基础…

    2023年4月9日
    00
  • 自制摄像头云台,并通过计算机LPT并口直接控制(一)

    最近突发奇想,是否可以使用RC模型上替换下来的两个舵机加上普通摄像头做一个可以远程控制云台的Webcam,来监视家中的宠物不要搞破坏呢?于是得出本文。 概念: 使用云台进行左右、上下两个纬度的转动来带动装在云台上的摄像头变换角度进行取向,并使用TCP建立一个远程控制页面控制云台,并接收摄像头传来的实时数据。 云台的驱动: 使用步进电机或RC模型上使用的舵机都…

    云计算 2023年4月11日
    00
  • “云计算之旅”筹备完成,意见征询!

      大家好,首先很高兴”WPF 基础到企业应用系列”能得到大家的关注、支持和认可。最近几个月由于白天要研究云计算专题(公司项目和个人爱好原因),晚上和闲暇时间才写WPF,所以就没能很好专注于一个方面而拖慢了WPF系列的进度,在此也表示深深地歉意。原打算写完WPF这个系列以后才继续“云计算之旅”这个系列,但是经过慎重的思考,同时也考虑到录制视频的关系,所以我决…

    云计算 2023年4月11日
    00
  • Python爬取用户观影数据并分析用户与电影之间的隐藏信息!

    下面是“Python爬取用户观影数据并分析用户与电影之间的隐藏信息” 的完整攻略。 简介 本攻略旨在通过Python的爬虫技术获取用户观影数据,并通过分析得出用户与电影之间的一些隐藏关系。本攻略有三个主要的步骤:爬虫获取数据、数据预处理和数据分析。 步骤一:网站选择与爬虫获取 选择一个用于获取用户观影数据的网站,常见的有豆瓣电影、IMDb等。通过对网站页面的…

    云计算 2023年5月18日
    00
  • C#客户端HttpClient请求认证及数据传输

    C#客户端HttpClient请求认证及数据传输 简介 HttpClient是C#中的一个非常常见的HTTP客户端,用于发送HTTP请求并获取响应结果。在很多情况下,我们需要对HTTP请求进行认证,以确保访问资源的安全性。本攻略将介绍如何在C#客户端中使用HttpClient进行HTTP请求认证及数据传输。 前置 在使用HttpClient之前,需要先安装M…

    云计算 2023年5月17日
    00
  • ASP.NET Core奇淫技巧之动态WebApi的实现

    让我来详细讲解ASP.NET Core奇淫技巧之动态WebApi的实现完整攻略。 概述 ASP.NET Core是一个开源的跨平台Web框架,它支持.NET Core平台和.NET Framework平台。这里要讲解的是ASP.NET Core奇淫技巧之动态WebApi的实现。所谓动态WebApi,是指在运行时,根据客户端需求生成对应的WebApi,而不需要…

    云计算 2023年5月17日
    00
  • 基于MybatisPlus插件TenantLineInnerInterceptor实现多租户功能

    实现多租户功能可以使用MybatisPlus插件TenantLineInnerInterceptor,该插件内部通过拦截SQL语句,并在SQL语句中添加租户ID的条件,从而实现多租户数据隔离。 实现步骤 1. 添加MybatisPlus依赖 <dependency> <groupId>com.baomidou</groupId&…

    云计算 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部