Python——模拟退火在背包问题上的运用(详细代码)

2023-10-29

一、模拟退火简介

二、详细代码

import math
import random
import matplotlib.pyplot as plt

def init_population(n):  
    '''生成一个种群,个体为全排列的随机排列'''
    population = []
    indivdul = 100  #个体数为100
    for i in range(indivdul):
        cs = [i for i in range(1,n+1)]
        random.shuffle(cs) #打乱
        population.append(cs)
    return population



def ff_popu(population,n,v1,v2):  
    '''传入一个种群,返回一个函数值列表'''
    ys = []
    for i in population:
        cost_sum = 0
        location  = i
        for j in range(n):
            for k in range(n):
                loca1 = location.index(j+1)
                loca2 = location.index(k+1)
                cost = v2[j][k]*v1[loca1][loca2]  #核心计算函数
                cost_sum = cost_sum + cost
        ys.append(cost_sum)
        index = ys.index(min(ys))
        #best = population[index]
    return ys

def ff_indivdul(i,n,v1,v2):
    '''传入一个个体,返回一个值'''
    cost_sum = 0
    location  = i
    for j in range(n):
        for k in range(n):
            loca1 = location.index(j+1)
            loca2 = location.index(k+1)
            cost = v2[j][k]*v1[loca1][loca2]  #核心计算函数
            cost_sum = cost_sum + cost
    return cost_sum



def neig(population,n,T,v1,v2):
    '''
    传入一个种群
    对种群中的每个个体产生邻域
    根据退火原理来判断是否接受这个新解
    返回一个新的种群
    '''
    popu_new = []
    for i in population:
        #随机生成两个数,让个体中这两个交换
        r1 = random.randint(0,len(i)-1)
        r2 = random.randint(0,len(i)-1)
        
        i_after = i[:]
        i_after[r1] = i[r2]
        i_after[r2] = i[r1]
        #分别计算初始值和邻域值
        y = ff_indivdul(i, n, v1, v2)
        y_after = ff_indivdul(i_after, n, v1, v2)
        E = y_after - y 
        if E < 0:
            i = i_after
        else:
            proba = random.random()
            f = math.exp(-(E/T))
            if proba <= f:
                i = i_after
        popu_new.append(i)
    return popu_new
        
def read():
    with open('D:/学习文件/大三上/科研课堂/qap-problems/QAP32.dat','r',encoding='utf-8') as f:   
        comments = f.read().splitlines()
    n = eval(comments[0])
    v11 = comments[2:2+n]
    v22 = comments[3+n:3+n+n]
    v1 = []
    v2 = []
    for i in v11:
        int_list = list(map(int, i.split()))
        v1.append(int_list)
    for i in v22:
        int_list = list(map(int, i.split()))
        v2.append(int_list)
    return v1,v2,n

def main():
    v1,v2,n = read()
    population = init_population(n)
    #evolution = 1000
    print(min(ff_popu(population,n,v1,v2)))
    T = 30  #这个是初始温度
    plt_y = []
    while (T > 2):
        population = neig(population,n,T,v1,v2)
        print(min(ff_popu(population,n,v1,v2)))
        plt_y.append(min(ff_popu(population,n,v1,v2)))
        T = T - 0.1  #每次温度减去0.1
    plt.plot(plt_y)
        
main()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python——模拟退火在背包问题上的运用(详细代码) 的相关文章

随机推荐

  • Flink 1.11.2 在K8s里基于NFS搭建高可用集群

    使用官方的docker镜像搭建job ha集群一直失败 最后参考了flink1 11 2 的start cluster sh 脚本 对docker 的启动脚本进行了调整 终于成功了 希望能够帮助到大家 需要注意的是 我的k8s环境是基于k8
  • GIS开发一:OpenLayers在线瓦片数据源汇总

    文章目录 1 概述 2 地图数据源 2 1 Google 2 2 OpenStreetMap 2 3 Thunderforest 2 4 Mapbox 2 5 ArcGIS 2 6 Bing地图 2 7 高德地图 2 8 百度地图 2 9
  • 自用入门人工智能笔记

    定义 百度百科的定义 机器学习的主要研究对象是人工智能 特别是如何在经验学习中改善具体算法的性能 能通过经验自动改进的计算机算法的研究 用数据和以往的经验来优化计算基础性的性能标准 Machine Learning书中的定义 如果一个程序可
  • Unity AssetBundle(2):工具UnityStudio

    一 UnityStudio 作用有两个 查看AssetBundle内资源 File gt LoadFile 提取AssetBundle内资源 Export 下载地址 UnityStudio releases地址 Perfare UnityS
  • Linux下Mysql 5.6.21 tar包安装实践

    好久没玩linux 由于项目需要部署新的linux开发环境 包括安装jdk tomcat redis mysql 趁着有时间 赶紧部署好 jdk tomcat redis很快就部署好了 唯独mysql让我折腾了一阵 先安装了我之前就安装过的
  • 数据库性能优化必读,AntDB-M数据库的哈希索引设计

    数据库加快访问速度的关键技术之一就是索引 索引的设计及使用方式极大程度上影响了数据库的性能 AntDB M支持Hash BTree两种索引类型 本文主要讲解Hash索引的相关设计 并给出一些使用建议 1 相关概念 桶 用于定位索引记录的容器
  • 如何在本地操作Redis

    1 下载redis到本地 下载Redis x64 xxx zip压缩包并解压 我这里解压到了D Redis Redis下载地址 2 开启并连接Redis 1 进入解压的文件夹中 按住shift 右击鼠标 点击在此处打开命令窗口 运行命令 r
  • MySQL安装时常见问题和解决方案【详解】

    目录 1 更改不了后缀名 2 配置文件设置错误 3 使用 mysqld install命令安装MySQL服务失败 4 使用 mysqld initialize console命令初始化MySQL 失败 5 使用net start mysql
  • java 中 BigDecimal 详解

    首先 学习一个东西 我们都必须要带着问题去学 这边我分为 为什么 是什么 怎么用 为什么要用BigDecimal 首先 我们先看一下 下面这个现象 那为什么会出现这种情况呢 因为不论是float 还是double都是浮点数 而计算机是二进制
  • 时间的几个实用函数 FILETIME UnixTime的转换

    filetimeToUnixTime windos filetime 起于 1601 01 01T00 00 00Z 单位 100 纳秒 UnixTime 起于 1970 01 01T00 00 00Z 单位 秒 它们的起始时间差了 116
  • Java实现第九届蓝桥杯测试次数

    测试次数 题目描述 x星球的居民脾气不太好 但好在他们生气的时候唯一的异常举动是 摔手机 各大厂商也就纷纷推出各种耐摔型手机 x星球的质监局规定了手机必须经过耐摔测试 并且评定出一个耐摔指数来 之后才允许上市流通 x星球有很多高耸入云的高塔
  • [踩坑记] CUDA环境下bitsandbytes安装报错/异常解决

    关键词 模型量化 bitsandbytes bitsandbytes报错 大模型环境 CUDA环境 1 问题描述 在部署大模型LLaMA的过程中 需要安装量化工具包bitsandbytes 环境如下 操作系统 Ubuntu 18 04 GP
  • 基于ChatGPT3.5 API实现的私有化web程序源码+使用说明,一键部署属于自己定制化的 chatgpt web 程序

    chatgpt web 本项目可以一键部署属于自己定制化的 chatgpt web 程序 兼容gpt3 5 只需下载release中对应平台的项目文件 修改配置后执行 打开 http 127 0 0 1 8080 便可以获得属于自己的cha
  • KEIL5 只有下载程序后不运行,只有在调试模式下多次点击全速运行代码才能跑起来的解决办法

    最近 使用KEIL5下载调试时遇到了一个很奇怪的现象 下载程序后哪怕是断电重启设备 程序都无法运行 在Flash Dowmload 下已经设置了Reset and Run 只有在Debug模式下 且多次点击全速运行 才能够把程序跑起来 最后
  • keyshot场景素材导入_KeyShot导入Rhino室内场景渲染的详细方法

    在KeyShot怎样导入Rhino室内场景渲染呢 下面就为大家分享KeyShot导入Rhino室内场景渲染的图文教程 有需要的可以来了解了解哦 KeyShot导入Rhino室内场景渲染的详细方法 1 打开一个rhino场景 这是一个简单的室
  • powershell 脚本启动优化

    需求分析 powershell 启动慢的主要原因是 profile中的终端配置加载时间长 当我们打开powershell终端进行交互时 加载时间长 尚可忍受 但当我们的脚本 执行powershell脚本时 较长的加载时间 是不可接受的 优化
  • 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java动物爱心救助平台s9dza

    如果你自己基础不好或者是小白的情况下那就建议你选择网站 系统类的去做 但是还得问问你们导师 如果你们导师没问题就可以 因为有的导师是不愿意你们选择做网站 系统的 毕竟做的人比较多 重复率调高 选择这种题目都是要创新功能 所以会比较棘手 以下
  • RT-Thread动态和静态创建线程

    上一篇 RT Thread线程管理教程 http t csdn cn phnwQ 目录 一 静态创建线程和动态创建线程的区别 二 创建线程的常用函数 三 动态创建线程 四 静态创建线程 五 动态和静态创建线程结合 线程调度hook函数使用
  • 计算机科学与技术专业课程有哪些,计算机科学与技术专业课程有哪些

    计算机科学与技术专业简介 计算机科学与技术类专业毕业生的职业发展路线基本上有两条路线 一是纯技术路线 二是由技术转型为管理的路线 计算机科学与技术专业课程 电路原理 模拟电子技术 数字逻辑 数字分析 计算机原理 微型计算机技术 计算机系统结
  • Python——模拟退火在背包问题上的运用(详细代码)

    一 模拟退火简介 二 详细代码 import math import random import matplotlib pyplot as plt def init population n 生成一个种群 个体为全排列的随机排列 popul