`
rcfalcon
  • 浏览: 227955 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

随机贪心算法简介(搜出一个自己高中的时候写的程序)

阅读更多

高三的时候准备信息学奥赛,到处做编程题。。

 

当时自己为AC了这道题得意了好一阵子…… 是TOJ上的一道题目,

其解题思路涉及到 随机贪心。。

 

什么是随机贪心?这里用我自己的话给个简单的介绍吧。

贪心算法就是根据问题的本质,给出一个最优解导向,然后不断的去迭代进而求出最优解。

而在很多时候,未必能准确的找到这个最优解导向(或者根本不存在,比如NP问题),但却可以找到一个近似的导向算法(近似贪心算法)。那么我们也可以在迭代若干次之后得到一个最优解的近似解。

假如我们打乱整个系统的初始状态为其等效状态,然后再进行上述迭代,又可以求到一个近似解。

如果我们能穷举出所有的等效初始状态,然后从所有的近似解里取最优解,那么就可以得到整个问题的最优解了。

而在实际情况中,可能无法枚举所有情况(复杂度太高),那么我们可以不断的随机去模拟初始状态,然后从该状态求近似解。

然后我们多次随机取其中的最佳值。这样,我们随机次数越高,结果就越准确。

我们把这种算法叫做随机贪心算法。

 

发上来纪念一下,这段青涩的代码,哈哈

记得当初我还写了个小解题报告,存在 yeah.net的邮箱里。。今天去看,居然因为我长期不登陆把我的删掉了。。可恶

 

{$N+}
program tju1033;
const
	limit=18;
var
	Ham:array[0..limit+1] of integer;
	n,i,u:integer;
	min:double;
	cost:array[1..limit,1..limit] of double;
	x,y:array[1..limit] of double;

procedure init;
var
	i,j:integer;
begin
	readln(n);
	for i:=1 to n do readln(x[i],y[i]);
	for i:=1 to n do
	for j:=1 to n do
		cost[i,j]:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));
	for i:=0 to n+1 do Ham[i]:=i;
end;

procedure Hamilton_Change;
var
	finish:boolean;
	i,j,k,tmp:integer;
begin
	finish:=false;
	Ham[0]:=Ham[1];
	Ham[n+1]:=Ham[n];
	while not finish do
	begin
		finish:=true;
		for i:=1 to n do
		for j:=i+1 to n do
			if cost[ Ham[i-1],Ham[i] ]+cost[ Ham[j],Ham[j+1] ]
			> cost[ Ham[i-1],Ham[j] ]+cost[ Ham[i],Ham[j+1] ] then
		begin
			for k:=0 to (j-i) div 2 do
			begin
				tmp:=Ham[i+k];
				Ham[i+k]:=Ham[j-k];
				Ham[j-k]:=tmp;
			end;
			finish:=false;
			Ham[0]:=Ham[1];
			Ham[n+1]:=Ham[n];
		end;
	end;
end;

procedure Count_Ans;
var
	total:double;
	i:integer;
begin
	total:=0;
	for i:=1 to n-1 do
	total:=total+cost[ Ham[i],Ham[i+1] ];
	if total<min then min:=total;
end;

procedure Random_adjust;
var
	i,a,b,tmp:integer;
begin
	for i:=1 to 1000 do
	begin
		a:=random(n+1);
		b:=random(n+1);
		if (a<>b) and (a<>0) and (b<>0) then
		begin
			tmp:=Ham[a];
			Ham[a]:=Ham[b];
			Ham[b]:=tmp;
		end;
	end;
end;

begin
	randomize;
	while not eof do
	begin
		init;
		min:=maxint;
		Hamilton_Change;
		Count_Ans;
		for i:=1 to 500 do
		begin
			Random_adjust;
			Hamilton_Change;
			Count_Ans;
		end;
		writeln(min:0:2);
	end;
end.

 

分享到:
评论

相关推荐

    动态规划,分治算法,概率算法,模拟退火算法,搜索算法,贪婪算法,网上matlab,遗传算法,组合算法

    2. **分治算法**:分治策略是将一个大问题分解为两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。典型的分治算法包括快速排序、归并排序和大数乘法等。 3. **...

    实验7_obtain47z_贪心算法_遗传算法背包_遗传算法实验_遗传算法_

    在IT领域,优化问题的解决方法众多,其中贪心算法和遗传算法是两种常见的策略。在"实验7_obtain47z"中,我们将重点探讨如何将这两种算法结合,形成混合遗传算法,来高效地解决经典的背包问题。 贪心算法是一种局部...

    程序设计经典算法

    8. **贪心算法**:贪心算法在每一步选择当前最优解,以期达到全局最优。如活动安排问题、霍夫曼编码等。 9. **回溯法**:当面临多步决策问题且某些决策可能导致失败时,回溯法是一种有效的求解策略,如八皇后问题、...

    算法分析与程序设计 算法分析的指导

    7. **贪心算法**:贪心算法在每一步都采取局部最优解,希望最终达到全局最优。但这并不总是可行,因此贪心算法只适用于特定类型的问题。 8. **回溯法与分支限界法**:这两者都是搜索策略,用于解决组合优化问题。...

    算法+数据结构=程序

    此外,书中可能还会探讨算法设计技巧,如递归、动态规划、贪心算法等,这些都是解决复杂问题的常用策略。同时,可能会涉及到如何使用数据结构优化算法,比如使用哈希表实现快速查找,或者利用平衡二叉搜索树实现高效...

    算法导论 手册 作者自己写的

    递归是算法设计中的一个重要工具。本章节介绍了如何解决递归方程的方法,包括: - **代入法**:通过代入猜测来求解递归方程。 - **主定理**:一种简化的方法,可以快速得到某些特定类型递归方程的解。 - **递归树法...

    《挑战程序设计竞赛2:算法与数据结构》电子书和配套代码.zip

    总之,《挑战程序设计竞赛2:算法与数据结构》是一本全面覆盖算法和数据结构的实用指南,结合电子书和配套代码,为读者提供了一个系统学习和实践的平台。无论是初学者还是有一定经验的程序员,都能从中受益匪浅,...

    禁忌搜索算法

    1. **初始化**:随机选择一个初始解,即一条旅行路线,并设置一个禁忌表,用于记录近期的路径选择。 2. **生成邻居解**:在当前解的基础上,通过交换两个城市的位置生成新的路径,形成邻居解。 3. **禁忌策略**:...

    《算法设计与分析》书中程序

    8. 贪心算法:在每一步选择当前最优解,逐步达到全局最优,如霍夫曼编码。 9. 回溯法和分支限界法:用于解决组合优化问题,如八皇后问题、N皇后问题。 通过阅读和运行这些源代码,你可以深入了解每个算法的工作...

    算法导论答案算法导论教师手册

    概率分析和随机化算法是现代算法设计中的一个重要分支,《算法导论》通过这一章节向读者展示了如何将概率理论应用于算法设计中,以及如何评估随机化算法的性能。 #### 动态规划与贪心算法 动态规划是一种解决具有...

    算法分析试题答案

    第十八个问题是关于贪心算法的基本要素,贪心选择性质是贪心算法的重要组成部分。 第十九个问题是关于回溯法的效率,确定解空间的时间是回溯法的重要组成部分。 第二十个问题是关于回溯法的策略,剪枝函数是回溯法...

    算法导论中文版

    9. 贪心算法:解释贪心算法如何工作,探讨其适用条件和局限性,并给出经典的贪心算法示例,如哈夫曼编码。 10. NP完全性:介绍NP完全问题的定义,探讨如何识别这类问题,并讲解近似算法和启发式算法等解决NP完全...

    作业1 第1章1

    汉诺塔问题是一个经典的递归问题,通过递归算法可以将所有盘子从一个柱子移动到另一个柱子。递归版本的时间复杂度为O(2^n),空间复杂度为O(n),因为每增加一个盘子,递归深度就增加一层。非递归版本通常使用栈来模拟...

    C语言常用算法程序集

    "C语言常用算法程序集"是一个集合了各种常见算法的资源库,旨在帮助C语言学习者提升编程技能,理解并掌握核心算法。这个程序集可能包含排序算法、搜索算法、数据结构实现以及其他实用的编程技巧。 首先,我们来看看...

    常用算法 常用算法 常用算法

    贪心算法则是另一种解决问题的方法,它每次做出局部最优决策,期望全局最优解。例如,Prim算法和Kruskal算法用于构建最小生成树,而Dijkstra算法在单源最短路径问题上也可视为贪心策略的应用。 回溯算法常用于求解...

    Python实现自适应大邻域搜索算法解决TSP问题

    - **初始化**: 开始时,算法生成一个随机解,例如使用贪心策略或简单回路构造方法。 - **破坏步骤**: 选择一部分解进行破坏,可以是随机选择或基于某些规则(如最远插入法)。 - **修复步骤**: 在更大的邻域内...

    数据结构及算法经典程序例子

    总的来说,数据结构和算法是计算机科学的基石,而这个“数据结构及算法经典程序例子”压缩包则为我们提供了一个丰富的学习资源。无论是自学还是教学,都应该充分利用这些实例,深入探究数据结构与算法的奥秘,提升...

    中南大学算法实验报告

    本实验报告通过具体的算法实验案例,深入探讨了递归与分治、回溯算法、贪心算法以及随机算法的基本思想与应用。这些算法不仅是计算机科学中的基础工具,也是解决实际问题的重要手段。通过对这些算法的学习与实践,...

    《算法设计》Kleinberg 练习 答案

    这本书涵盖了诸如动态规划、贪心算法、分治策略、图算法等多种核心算法,并通过丰富的实例帮助读者理解和应用这些算法。针对提供的压缩包文件,我们主要关注的是书中的练习答案,这对于学习和掌握书中内容至关重要。...

Global site tag (gtag.js) - Google Analytics