湘潭大学 算法设计与分析实验 回溯 动态规划 贪心 模拟退火解决背包问题

这篇具有很好参考价值的文章主要介绍了湘潭大学 算法设计与分析实验 回溯 动态规划 贪心 模拟退火解决背包问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

https://download.csdn.net/download/SQ_ZengYX/88620871

搜索与回溯

#include <iostream>
using namespace std;

#define N 100
int n;
double limitW;
double maxv;
int option[N];
int cop[N];

struct {
	double weight;
	double value;
} a[N];

void BackTrack(int i, double tw, double tv) {
	// 不能超出重量限制
	if (tw > limitW + 0.1)
		return;
	if (tv > maxv) {
		for (int k = 0; k < n; ++k)
			option[k] = cop[k];
		maxv = tv;
	}
	// 选第i个物品
	cop[i] = 1;
	if (i < n)
		BackTrack(i + 1, tw + a[i].weight, tv + a[i].value);
	// 不选第i个物品
	cop[i] = 0;
	if (i < n)
		BackTrack(i + 1, tw, tv);
}


int main() {
	int k;
	double w[N], v[N];
	cout << "输入物品种数:" << endl;
	cin >> n;

	cout << "输入限制重量:" << endl;
	cin >> limitW;
	for (k = 0; k < n; ++k) {
		cout << "依次输入第" << k + 1 << "个物品的重量和价值: " << endl;
		cin >> w[k] >> v[k];
		a[k].weight = w[k];
		a[k].value = v[k];
	}

	maxv = 0.0;
	for (k = 0; k < n; ++k)cop[k] = 0;
	BackTrack(0, 0.0, 0.0);
	cout << "所选物品为:" << endl;
	for (k = 0; k < n; ++k)
		if (option[k])
			cout << k + 1 << "\t";
	cout << endl << "总价值为:" << maxv << endl;
}

动态规划

#include<iostream>
using namespace std;
int weight[100], goods_value[100];//weight表示背包可容纳重量,godds_value表示物品价值
int Value[100][100];//价值数组
int ZeroOneBag(int goods_value[], int weight[], int Value[][100], int m, int n) {
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= n; j++) {
			if (j < weight[i]) {
				Value[i][j] = Value[i - 1][j];
			} else if (Value[i - 1][j] >= (Value[i - 1][j - weight[i]] + goods_value[i])) {
				Value[i][j] = Value[i - 1][j];
			} else {
				Value[i][j] = Value[i - 1][j - weight[i]] + goods_value[i];
			}
		}
	}
	return Value[m][n];
}
int main() {

	int i = 0, m, n, value = 0;
	cout << "请输入物品个数:" << endl;
	cin >> m;
	cout << "请输入背包容量:\n";
	cin >> n;
	for (i = 1; i <= m; i++) {
		cout << "请输入物品" << i << endl;
		cout << "重量: " << "价值: \n";
		cin >> weight[i] >> goods_value[i];

	}

	value = ZeroOneBag(goods_value, weight, Value, m, n);
	cout << "背包能容纳的最大价值为:" << value << endl;
	cout << endl;
}

贪心

#include <iostream>
#include<algorithm>
using namespace std;
struct goodinfo {
	float p; //物品效益
	float w; //物品重量
	float X; //物品该放的数量
	int flag; //物品编号
	bool operator<(goodinfo b) {
		return p > b.p;
	}//按物品效益,重量比值做升序排列
};//物品信息结构体
void bag(goodinfo goods[], float M, int n) {
	float cu;
	int i, j;
	for (i = 1; i <= n; i++)
		goods[i].X = 0;
	cu = M; //背包剩余容量
	for (i = 1; i < n; i++) {
		if (goods[i].w > cu) //当该物品重量大与剩余容量跳出
			continue;
		goods[i].X = 1;
		cu = cu - goods[i].w; //确定背包新的剩余容量
	}
//按物品编号做降序排列
	for (j = 2; j <= n; j++) {
		goods[0] = goods[j];
		i = j - 1;
		while (goods[0].flag < goods[i].flag) {
			goods[i + 1] = goods[i];
			i--;
		}
		goods[i + 1] = goods[0];
	}
	cout << "最优解为:" << endl;
	double ans = 0;
	for (i = 1; i <= n; i++) {
		cout << "第" << i << "件物品要放:";
		cout << goods[i].X << endl;
		ans += goods[i].p * goods[i].w * goods[i].X;
	}
	cout << "总价值为:" << ans << endl;

}
int main(void) {
	cout << "|--------运用贪心法解背包问题---------|" << endl;
	cout << "|-------------------------------------|" << endl;
	int i, n;
	float M;
	cout << "请输入物品的总数量:";
	cin >> n;
	cout << "请输入背包的最大容量:";
	cin >> M;
	goodinfo goods[n + 1];

	cout << endl;
	for (i = 1; i <= n; i++) {
		goods[i].flag = i;
		cout << "请输入第" << i << "件物品的重量:";
		cin >> goods[i].w;
		cout << "请输入第" << i << "件物品的效益:";
		cin >> goods[i].p;
		goods[i].p = goods[i].p / goods[i].w; //得出物品的效益,重量比
		cout << endl;
	}

	sort(goods + 1, goods + 1 + n);
	bag(goods, M, n);

	return 0;
}

模拟退火

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
void knapsackSa(int w[], int c[], int n, int M) { //n件物品,其重量和价值分别为w[i]和c[i],寻找将其装入容量为M的背包中物品的最大价值
	int i, j, df, dm;
	int *x = new int[n]; //定义解空间
	for (i = 0; i < n; i++) { //初始化解为0
		x[i] = 0;
	}
	int f = 0, m = 0;
	for (i = 0; i < n; i++) {
		f = f + c[i] * x[i]; //初始化总价值
		m = m + w[i] * x[i];	 //初始化总重量
	}
	float t0 = 500; //控制参数t的初值
	float t = t0;
	float a = 0.95f; //衰减函数的系数
	float e = 0.00001f;
	int L = 100 * n; // Mapkob 链长
	while (t > e) { //停止准则
		srand((unsigned)time(NULL));//初始化随机函数种子,srand((unsigned)time(NULL));是拿系统时间作为种子,由于时间是变化的,种子变化,可以产生不相同的随机数。
		for (int k = 0; k < L; k++) {
			i = rand() % n; //随机选取第i件物品
			if (x[i] == 0) {	//若i不在背包中
				if (m + w[i] <= M) {	//且加入总重量后不超过容量M,则直接放入背包中
					x[i] = 1;
					f = f + c[i];
					m = m + w[i];
				} else {
					j = rand() % n;	//随机取出物品j
					while (x[j] == 0) {
						j = rand() % n;   //直到x[j]为1
					}
					df = c[i] - c[j];
					dm = w[i] - w[j];
					if (m + dm <= M)	//加入总重量后不超过容量M
						if (df > 0 || (exp(df / t) > (double)(rand() / (double)RAND_MAX))) { //价值差大于0或以exp(df/T)的接受概率接受新解
							x[i] = 1;
							x[j] = 0;
							f = f + df;
							m = m + dm;
						}
				}
			} else {
				j = rand() % n;
				while (x[j] == 1) {
					j = rand() % n;
				}
				df = c[j] - c[i];
				dm = w[j] - w[i];
				if (m + dm <= M)
					if (df > 0 || (exp(df / t) > (double)(rand() / (double)RAND_MAX))) { //价值差大于0或以exp(df/T)的接受概率接受新解
						x[i] = 0;
						x[j] = 1;
						f = f + df;
						m = m + dm;
					}
			}
		}
		t = t * a; //衰减函数
	}
	cout << "该0/1背包问题的最优解为: ";
	for (i = 0; i <= n - 1; i++) cout << x[i] << " ";
	cout << endl << "最大总价值为:" << f << endl;
}
int main() {
	int n, M;
	//n件物品,其重量和价值分别为w[i]和c[i],寻找将其装入容量为M的背包中物品的最大价值
	cout << "请输入物品件数n:" << endl;
	cin >> n;
	cout << "请输入背包容量M:" << endl;
	cin >> M;
	int *w = new int[n];
	cout << "请依次输入物品重量和价值:" << endl;
	int *c = new int[n];
	for (int i = 0; i < n; i++) {
		cin >> w[i] >> c[i];
	}

	knapsackSa(w, c, n, M);
	return 0;
}

测试用例文章来源地址https://www.toymoban.com/news/detail-784892.html

8 8
2 5
3 8
2 6
4 9
5 10
4 7
3 8
5 14

到了这里,关于湘潭大学 算法设计与分析实验 回溯 动态规划 贪心 模拟退火解决背包问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 湘潭大学 湘大 XTU OJ 1055 整数分类 题解(非常详细)

    湘潭大学 湘大 XTU OJ 1055 整数分类 题解(非常详细)

    整数分类 Description 按照下面方法对整数x进行分类:如果x是一个个位数,则x属于x类;否则将x的各位上的数码累加,得到一个新的x,依次迭代,可以得到x的所属类。比如说24,2+4=6,则24的类别数是6;39,3+9=12,1+2=3,则39的类别数是3。 输入        每行输入一个非负整数

    2024年02月12日
    浏览(8)
  • 南京邮电大学算法与设计实验四:回溯法(最全最新,与题目要求一致)

    南京邮电大学算法与设计实验四:回溯法(最全最新,与题目要求一致)

    要求用回溯法求解8-皇后问题,使放置在8*8棋盘上的8个皇后彼此不受攻击,即:任何两个皇后都不在同一行、同一列或同一斜线上。请输出8皇后问题的所有可行解。 用回溯法编写一个递归程序解决如下装载问题:有n个集装箱要装上2艘载重分别为c1和c2的轮船,其中集装箱i的

    2024年02月05日
    浏览(65)
  • 中北大学算法分析与设计实验报告三(数字旋转方阵)

    1.实验名称 实验三 分治与减治算法实验 2.实验目的 (1)掌握分治法的设计思想; (2)掌握数字旋转方阵的具体实现过程; (3)熟练掌握二维数组的使用方法; (4)在掌握的基础上编程实现数字旋转方阵的实现过程。 3.训练知识点集群 (1)根据实验内容设计算法伪代码

    2023年04月08日
    浏览(20)
  • 中北大学算法分析与设计实验报告六(最大团问题)

    1.实验名称 实验六 回溯与分支限界算法实验 2.实验目的 题目:最大团问题 强化学生利用回溯算法和优化处理实际问题的能力。 3.训练知识点集群 (1)根据实验内容设计算法伪代码进行算法描述; (2)利用C++/C/Java等编程语言对算法伪代码进行工程化实现; (3)输入测试用

    2024年02月06日
    浏览(9)
  • 【算法分析与设计】第八章-回溯法

    约束条件 分为 显式约束 和 隐式约束 显式:规定了问题的解的分量的取值范围。如求n的全排列每个位置只能取1~n 隐式:用于判定候选解是否为可行解。如全排列的每个数字不允许重复。 问题状态和状态空间树         状态空间树是 描述问题解空间 的树形结构,每个结

    2024年02月08日
    浏览(11)
  • 【算法设计与分析】3.回溯法—地图填色问题

    【算法设计与分析】3.回溯法—地图填色问题

    回溯法地图填色pre ppt 回溯法地图填色报告word 回溯法地图填色c++源代码 目录 相关资源下载 碎碎念 概览 背景知识 问题描述: 原理 回溯算法原理 回溯法涉及几个概念 回溯法伪代码 地图填色(回溯法) 搜索顺序策略(按优先级排序) 剪枝策略 地图数据获取 回溯填色伪代码

    2023年04月22日
    浏览(7)
  • 7-1 子集和问题--回溯法(算法设计与分析)

    作者 陈晓梅    单位 广东外语外贸大学 设集合S={x1,x2,…,xn}是一个正整数集合,c是一个正整数,子集和问题判定是否存在S的一个子集S1,使S1中的元素之和为c。试设计一个解子集和问题的回溯法,并输出利用回溯法在搜索树(按输入顺序建立)中找到的第一个解。 输入格

    2024年02月04日
    浏览(10)
  • 【算法设计与分析】回溯法解决运动员配对问题(课程设计)

    【算法设计与分析】回溯法解决运动员配对问题(课程设计)

    针对运动员最佳配对问题,本文利用回溯法寻求竞赛优势得分最优解,研究男女运动员最佳配对法,使各组男女双方竞赛优势的总和达到最大。针对这一问题,本题采用的是男运动员选女运动员的方法,构成了一棵排列树。树的结点表示女运动员,排列树的层数表示男运动员

    2024年02月10日
    浏览(27)
  • 计算机算法分析与设计(22)---回溯法(最小重量机器设计问题)

    计算机算法分析与设计(22)---回溯法(最小重量机器设计问题)

     设某一机器由 n n n 个部件组成,每种部件都可以从 m m m 个不同的供应商处购得。设 w i j w_{ij} w ij ​ 是从供应商 j j j 处购得的部件i的重置, c i j c_{ij} c ij ​ 是相应的价格。设计一个算法,给出总价格不超过 d d d 的最小重量机器设计。 数据输入: 第 1 1 1 行有 3 3 3 个正整

    2024年02月06日
    浏览(14)
  • 算法分析与设计考前冲刺 (算法基础、数据结构与STL、递归和分治、 动态规划、贪心算法、 回溯算法)

    算法分析与设计考前冲刺 算法基础 算法是一系列解决问题的清晰指令,代表着用系统的方法描述解决问题的策略机制。 程序是算法用某种程序设计语言的具体的 具体实现 算法特征: 有穷性(有限步) 确定性 输入 输出 可行性(有限时间) 算法的复杂性: 时间复杂性 和空间复

    2024年02月02日
    浏览(11)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包