湘潭大学软件工程算法设计与分析实验-模拟退火算法

文章目录

  • 写在前面
  • 代码
  • 分析

写在前面

总共是要四份代码,好像都是实现背包问题,前面三个都比较简单直观,朋友上周在机房给我讲解了一下之后,我大概弄清楚了,这周好像是最后一次算法课了,所以明天我得把剩下的那个实验代码讲一下。还要写之前小组作业的文档,还有这个实验的文档。

害其实文档不需要有太大压力吧。改一改就好了。

代码

//模拟退火
//
#include <bits/stdc++.h>
using namespace std;
void knapsackSa(int w[], int v[], int n, int M) { //n件物品,其重量和价值分别为w[i]和c[i],寻找将其装入容量为M的背包中物品的最大价值int i, j, dv, dw;int ans[n]; 	//定义解空间for (i = 0; i < n; i++) { //初始化解为0ans[i] = 0;}int val = 0, wei = 0;	//初始化总价值和总重量float t0 = 500; 	//初始温度,控制参数t的初值float t = t0;		//当前温度float a = 0.95f; 	//衰减因子float e = 0.00001f;	    //终止条件int L = 100 * n; 		//等温迭代次数,即每个温度都要迭代的次数,即生成新解的个数while (t > e) { 		//停止退火for (int k = 0; k < L; k++) {i = rand() % n; 	//随机选取第i件物品->生成新解if (ans[i] == 0) {	//若i不在背包中 (则考虑将i放入背包)if (wei + w[i] <= M) {	//且加入总重量后不超过容量M,则直接放入背包中ans[i] = 1;val = val + v[i];wei = wei + w[i];} else{ j = rand() % n;		//随机拿出物品jwhile (ans[j] == 0) {	//一直找,直到找到一个在背包的物体j = rand() % n;   	}dv = v[i] - v[j];dw = w[i] - w[j];if (wei + dw <= M)	//(拿出j放入i后)总重量后不超过容量Mif (dv > 0 || (exp(dv / t) > (double)(rand() / (double)RAND_MAX))) { //价值差大于0或以exp(dv/T)的接受概率接受新解ans[i] = 1;ans[j] = 0;val = val + dv;wei = wei + dw;}}} else {	//若i在包中,则考虑将i拿出j = rand() % n;    //随机选一个不在包里的物品while (ans[j] == 1) {j = rand() % n;}dv = v[j] - v[i];dw = w[j] - w[i];if(wei + dw <= M)if (dv > 0 || (exp(dv / t) > (double)(rand() / (double)RAND_MAX))) { //价值差大于0或以exp(df/T)的接受概率接受新解ans[i] = 0;ans[j] = 1;val = val + dv;wei = wei + dw;}}}t = t * a; 	//降温}cout << "该0/1背包问题的最优解为: ";for (i = 0; i <= n - 1; i++) cout << ans[i] << " ";cout << endl << "最大总价值为:" << val << endl;
}
int main() {int n, M;//n件物品,其重量和价值分别为w[i]和c[i],寻找将其装入容量为M的背包中物品的最大价值cout << "请输入物品件数n和背包容量M:" << endl;cin >> n >> M;int w[n],v[n];cout << "请依次输入物品重量和价值:" << endl;for (int i = 0; i < n; i++) {cin >> w[i] >> v[i];}srand((unsigned)time(NULL));	//初始化随机函数种子(播种),srand((unsigned)time(NULL));是拿系统时间作为种子,由于时间是变化的,种子变化,可以产生不相同的随机数。knapsackSa(w, v, n, M);return 0;
}

分析

这只有几页介绍,应该大概理解一下就好了吧。模拟退火算法表示的是,最开始把系统加热,然后让其冷却,最后得到的就是一个比较稳定的状态。我还是不懂。

模拟退火算法视频

模拟退火算法博客教程

看完了上面两个教程,感觉大概懂了一些了。现在去看一下代码。感觉就是贪心,然后有一定的概率不贪心,设计了一个函数,这个函数的取值是一个概率函数,依照这个概率不贪心。

又加了一些注释,明天对着这个注释给助教讲了。还有就是自己就是太担心了,有些事情可以大胆一点,比如说去给助教讲这个算法,害主要还是自己不是很熟练。反正明天一过去就讲,早点讲不用排队。

//模拟退火
//
#include <bits/stdc++.h>
using namespace std;
void knapsackSa(int w[], int v[], int n, int M) { //n件物品,其重量和价值分别为w[i]和c[i],寻找将其装入容量为M的背包中物品的最大价值int i, j, dv, dw;int ans[n]; 	//定义解空间for (i = 0; i < n; i++) { //初始化解为0ans[i] = 0;}int val = 0, wei = 0;	//初始化总价值和总重量float t0 = 500; 	//初始温度,控制参数t的初值float t = t0;		//当前温度float a = 0.95f; 	//衰减因子,这里加个 f 表示这个数字是单精度浮点数float e = 0.00001f;	    //终止条件int L = 100 * n; 		//等温迭代次数,即每个温度都要迭代的次数,即生成新解的个数while (t > e) { 		//停止退火for (int k = 0; k < L; k++) {i = rand() % n; 	//随机选取第i件物品->生成新解if (ans[i] == 0) {	//若i不在背包中 (则考虑将i放入背包)if (wei + w[i] <= M) {	//且加入总重量后不超过容量M,则直接放入背包中ans[i] = 1;val = val + v[i];//表示的是当前的背包里面放的总的价值wei = wei + w[i];//表示当前背包里面放的总的重量} else{ //这里表示的意思是 i 放不下,但是抽到了 i 这个物品,那么下面我们要重新找一个物品j = rand() % n;		//随机拿出物品jwhile (ans[j] == 0) {	//一直找,直到找到一个在背包的物体j = rand() % n;   	}//找到之后把 j  拿出来,把 i 放进去,对 j 多少有点不厚道了哈哈哈dv = v[i] - v[j];//这个表示的是差值,或者直接直观理解就好,这样写可能还有点绕dw = w[i] - w[j];if (wei + dw <= M)	//(拿出j放入i后)总重量后不超过容量Mif (dv > 0 || (exp(dv / t) > (double)(rand() / (double)RAND_MAX))) { //价值差大于0或以exp(dv/T)的接受概率接受新解ans[i] = 1;//把 i 放进去ans[j] = 0;//把 j 拿出来val = val + dv;wei = wei + dw;}}} else {	//若i在包中,则考虑将i拿出j = rand() % n;    //随机选一个不在包里的物品while (ans[j] == 1) {j = rand() % n;}dv = v[j] - v[i];//表示的是把这件物品拿出来之后的情况dw = w[j] - w[i];if(wei + dw <= M)//wei 表示的是总重量if (dv > 0 || (exp(dv / t) > (double)(rand() / (double)RAND_MAX))) { //价值差大于0或以exp(df/T)的接受概率接受新解ans[i] = 0;ans[j] = 1;val = val + dv;wei = wei + dw;}}}t = t * a; 	//降温}cout << "该0/1背包问题的最优解为: ";for (i = 0; i <= n - 1; i++) cout << ans[i] << " ";cout << endl << "最大总价值为:" << val << endl;
}
int main() {int n, M;//n件物品,其重量和价值分别为w[i]和c[i],寻找将其装入容量为M的背包中物品的最大价值cout << "请输入物品件数n和背包容量M:" << endl;cin >> n >> M;int w[n],v[n];cout << "请依次输入物品重量和价值:" << endl;for (int i = 0; i < n; i++) {cin >> w[i] >> v[i];}//拿系统时间作为种子产生随机数srand((unsigned)time(NULL));	//初始化随机函数种子(播种),srand((unsigned)time(NULL));是拿系统时间作为种子,由于时间是变化的,种子变化,可以产生不相同的随机数。//重量和价值的数组,物品件数,总的能承受的重量knapsackSa(w, v, n, M);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/59181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自由学习记录(20)

PureMVC 把 LoginView 视图组件赋给 viewComponent&#xff0c;然后用它来监听用户事件&#xff0c;更新显示状态。 command 将请求&#xff08;例如方法调用&#xff09;封装成一个对象&#xff0c;从而使得用户可以通过该对象来调用相应的操作。 Command&#xff08;命令…

数据结构-并查集专题(2)

一、前言 接&#xff08;1&#xff09;完成剩余题目和了解并查集运用求解最小生成树的Kruskal算法 二、专题训练 2.1 题目总览 前四题见&#xff08;1&#xff09; 2.2 1568: 并查集-家谱 思路 首先这个题目的描述就有问题&#xff0c;它说每一组的父子关系由两行组成&…

吾店云介绍 – 中国人的WordPress独立站和商城系统平台

经过多年在WordPress建站领域的摸索和探索&#xff0c;能轻松创建和管理各种类型网站的平台 – 吾店云建站平台诞生了。 应该说这是一个艰苦卓绝的过程&#xff0c;在中国创建一个能轻松创建和使用WordPress网站的平台并不容易&#xff0c;最主要是网络环境和托管软件的限制。…

测试实项中的偶必现难测bug--<pre>标签问题

问题描述: 用户从网上copy的简介信息可能带有<pre>标签,导致安卓上的内容只能一行滑动展示,但是ios有对这个标签做特殊处理: 分析: <pre> 标签是 HTML 中用于表示预格式化文本的标签,它的作用是保留文本中的空格、换行和缩进。它的全称是 preformatted text…

管理 Elasticsearch 变得更容易了,非常容易!

作者&#xff1a;来自 Elastic Ken Exner Elasticsearch 用户&#xff0c;我们听到了你的心声。管理 Elasticsearch 有时会变得很复杂&#xff0c;面临的挑战包括性能调整、问题检测和资源优化。我们一直致力于简化你的体验。今天&#xff0c;我们宣布了自收购 Opster 以来的一…

微波无源器件 OMT1 一种用于倍频程接收机前端的十字转门四脊正交模耦合器(24-51GHz)

摘要&#xff1a; 我们报道了一种用于天文学射电望远镜的毫米波波长接收机的一种十字转门四脊OMT的设计&#xff0c;制造和实测结果。此四脊OMT被直接兼容到一个四脊馈电喇叭来实现可以拓展矩形波导单模带宽的双极化低噪声接收机。使用了24-51GHz的带宽&#xff0c;OMT证实了0.…

如何使用IDEA创建Maven/SSM工程?

鉴于很多学校还在教授SSMJSP&#xff0c;很多同学不会使用IDEA创建Maven工程&#xff0c;这里进行说明 windows下安装jdk并配置环境 添加链接描述Windows下安装Maven并配置环境 首先你要本地安装jdk&#xff0c;Maven并配置基础环境变量&#xff0c;然后对IDEA进行jdk、Mave…

网络安全常见面试题--含答案

本文面试题汇总&#xff1a; 防范常见的 Web 攻击 重要协议分布层 arp协议的工作原理rip协议是什么&#xff1f;rip的工作原理 什么是RARP&#xff1f;工作原理OSPF协议&#xff1f;OSPF的工作原理 TCP与UDP区别总结 什么是三次握手四次挥手&#xff1f; tcp为什么要三次握手&…

C++内存泄漏检查工具——Valgrind(--tool = memcheck)

在写c程序中通常遇到程序崩溃&#xff0c;我们首先想到的是内存问题 如果代码量少看几遍就能看得出来&#xff0c;如果代码量多起来我们就得借助一些工具了比如gdb调试和valgrind中得memcheck来解决内存问题 我用的ubuntu&#xff0c;先安装valgrind sudo apt update sudo a…

库打包工具 rollup

库打包工具 rollup 摘要 **概念&#xff1a;**rollup是一个模块化的打包工具 注&#xff1a;实际应用中&#xff0c;rollup更多是一个库打包工具 与Webpack的区别&#xff1a; 文件处理&#xff1a; rollup 更多专注于 JS 代码&#xff0c;并针对 ES Module 进行打包webpa…

微服务容器化部署实践(FontConfiguration.getVersion)

文章目录 前言一、整体步骤简介二、开始实战1.准备好微服务2.将各个微服务打包为镜像第一种第二种3. 将各个打包好的镜像,通过docker-compose容器编排,运行即可总结前言 docker容器化部署微服务: 将微服务容器化部署到 Docker 容器中是一个常见的做法,可以提高应用的可移…

人工智能(AI)和机器学习(ML)技术学习流程

目录 人工智能(AI)和机器学习(ML)技术 自然语言处理(NLP): Word2Vec: Seq2Seq(Sequence-to-Sequence): Transformer: 范式、架构和自注意力: 多头注意力: 预训练、微调、提示工程和模型压缩: 上下文学习、思维链、全量微调、量化、剪枝: 思维树、思维…

带你读懂什么是AI Agent智能体

一、智能体的定义与特性 定义&#xff1a;智能体是一个使用大语言模型&#xff08;LLM&#xff09;来决定应用程序控制流的系统。然而&#xff0c;智能体的定义并不唯一&#xff0c;不同人有不同的看法。Langchain的创始人Harrison Chase从技术角度给出了定义&#xff0c;但更…

Qt_day3_信号槽

目录 信号槽 1. 概念 2. 函数原型 3. 连接方式 3.1 自带信号 → 自带槽 3.2 自带信号 → 自定义槽 3.3 自定义信号 4. 信号槽传参 5. 对应关系 5.1 一对多 5.2 多对一 信号槽 1. 概念 之前的程序界面只能看&#xff0c;不能交互&#xff0c;信号槽可以让界面进行人机…

《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明

参考 《element plus 使用 icon 图标(两种方式)》使用 icon 升级 Vue2 升级 Vue3 项目时&#xff0c;遇到命名时的实心与空心点差异&#xff01; ElementUI&#xff1a; 实心是 el-icon-more空心是 el-icon-more-outline ElementPlus&#xff1a; 实心是 el-icon-more-fill…

RWKV 通过几万 token 的 CoT 解决几乎 100% 的数独问题(采用 29M 参数的小模型)

RWKV 做 CoT 特别有优势&#xff0c;因为推理速度和显存占用与上下文无关。即使做几百万 token 的 CoT 也不会变慢或额外消耗显存。 RWKV 社区开发者 Jellyfish042 训练了一个用于解决数独谜题的专用 RWKV 模型 Sudoku-RWKV &#xff0c;项目的训练代码和数据制作脚本均已开源…

postgres+timescaledb--离线安装,centos7.9

操作系统是centos7.9&#xff0c;使用的hper-V,安装的虚拟机环境&#xff0c;安装好操作系统之后&#xff0c;让系统不连外网后直接按下方操作安装。 方式1&#xff0c;使用压缩包&#xff0c;复杂一点。&#xff08;第一种方式暂时没有安装timescaledb&#xff09; 装备安装…

MyBatis xml 文件中 SQL 语句的小于号未转义导致报错

问题现象 在 MyBatis 的 xml 文件中添加了一个 SQL 语句 <select id"countXxx" resultType"int">select count(*) from t1 where count < 3 </select>启动 Spring Boot 应用程序后报错&#xff1a; Caused by: org.apache.ibatis.builde…

深入剖析输入URL按下回车,浏览器做了什么

DNS 查询 首先,是去寻找页面资源的位置。如果导航到https://example.com, 假设HTML页面被定位到IP地址为93.184.216.34 的服务器。如果以前没有访问过这个网站&#xff0c;就需要进行DNS查询。 浏览器向域名服务器发起DNS查询请求&#xff0c;最终得到一个IP地址。第一次请求…

ceph介绍和搭建

1 为什么要使用ceph存储 什么是对象存储&#xff1f; 对象存储并没有向文件系统那样划分为元数据区域和数据区域&#xff0c;而是按照不同的对象进行存储&#xff0c;而且每个对象内部维护着元数据和数据区域。因此每个对象都有自己独立的管理格式。 对象存储优点&#xff1a…