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

文章目录

  • 写在前面
  • 代码
  • 分析

写在前面

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

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

代码

//模拟退火
//
#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;命令…

Python实现PageRank算法

目录 第一部分:PageRank算法概述与原理1.1 什么是PageRank算法?1.2 PageRank算法的工作流程1.3 PageRank算法的时间复杂度第二部分:PageRank算法的Python实现(面向对象设计)2.1 Python类设计2.2 代码实现2.3 代码解释第三部分:案例1 - 动态网络中的PageRank计算(观察者模…

重学SpringBoot3-整合 Elasticsearch 8.x (三)使用Repository

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 在使用Spring Data Elasticsearch进行复杂查询时&#xff0c;Repository的接口方法以及定制查询能力可以帮助我们更灵活地构建高级用例。以下是几个具体示例&#xff1a;…

数据结构-并查集专题(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.…

CCS 学习记录

1.导入项目 在CCS菜单中选择Project->Import Existing CCS Eclipse Project&#xff0c;点击Browse找到CCS workspace所在文件夹&#xff0c;点击OK&#xff0c;CCS会自动将所选文件夹及其子文件夹下所有的CCS Projects列出。从列表中找到所要导入的项目文件夹&#xff0c;…

【在Typora中绘制用户旅程图和甘特图】

在 Typora 中可以使用 Mermaid 绘制用户旅程图&#xff08;User Journey Map&#xff09;&#xff0c;但由于 Mermaid 并不直接支持用户旅程图&#xff0c;我们可以通过一些图表的变通方式&#xff08;比如流程图或甘特图&#xff09;来表示用户旅程图的结构。用户旅程图通常展…

如何使用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…

原生 JavaScript基本内容和常用特性详解

原生 JavaScript&#xff08;也称为 Vanilla JS&#xff09;指的是不依赖于任何框架或库的纯 JavaScript。以下是原生 JavaScript 的一些基本内容和常用特性详解。 目录 1. 数据类型 2. 变量声明 3. 控制结构 4. 函数 5. 对象和数组 6. 事件处理 7. DOM 操作 8. Promi…

库打包工具 rollup

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

基于promtail+loki+grafana搭建日志系统

文章目录 Promtail安装promtail创建配置文件创建systemd 服务文件启动promtail服务 loki下载loki服务创建config.yml文件创建systemd服务文件启动loki grafana下载grafana 本文基于promtaillokigrafanaprometheus&#xff08;可选&#xff09; 搭建一个轻量快速的日志系统&…

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

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

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

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

Python 操作数据库:读取 Clickhouse 数据存入csv文件

import pandas as pd from clickhouse_driver import Client import timeit import logging import threading from threading import Lock from queue import Queue from typing import List, Dict, Set from contextlib import contextmanager import os import time# 配置参…

SCP收容物211~215

注 &#xff1a;此文接SCP收容物201~210,本文只供开玩笑 ,与steve_gqq_MC合作 --------------------------------------------------------------------------------------------------------------------------------- 目录 scp-211 scp-212 scp-213 scp-214 scp-215 s…