我下学期参加comp 2210(数据结构),我一直在做在线发布的暑期学期的作业。到现在为止,我在完成作业时没有遇到任何问题。看看下面的作业4,看看你是否可以给我一个如何处理它的提示。请不要提供完整的算法,只是一种方法。谢谢!
“成本排序”是一种算法,其中值序列必须按升序排列。排序是
通过一次一个地交换两个值的位置来执行,直到序列处于正确的顺序。每
交换产生成本,该成本计算为交换中涉及的两个值的总和。总数
该类别的成本是交换成本的总和。
例如,假设开始
序列是{3,2,1}。一种可能
一系列的交汇处是
Interchange 1: {3, 1, 2} interchange cost = 0
Interchange 2: {1, 3, 2} interchange cost = 4
Interchange 3: {1, 2, 3} interchange cost = 5,
given a total cost of 9
您要编写一个程序来确定排列特定数字序列的最低成本。
编辑:教授不允许暴力强迫。
如果你想让教授大吃一惊,你可以使用 模拟退火。然后,如果你管理它,你可以跳过一些课程:)。请注意,此算法仅提供近似答案。
否则:试试吧 回溯 算法,或 分支机构。这些都将找到最佳答案。
你是什么意思“暴力强迫?”你的意思是“尝试所有可能的组合并选择最便宜的?”只是检查。
我认为“分支和绑定”是你正在寻找的 - 检查算法的任何来源。它就像“蛮力”一样,除非你尝试一系列动作,只要这个动作序列不如迄今为止所尝试的任何其他动作序列更优化,你就可以放弃让你到达那一点的序列 - 成本。这是上面提到的“回溯”的一种风格。
我这样做的首选语言是Prolog,但我很奇怪。
模拟退火是一种PROBABLISTIC算法 - 如果解空间具有局部最小值,那么您可能被困在一个并得到您认为正确答案但不是。有很多方法可以找到所有相关的文献,但我不同意它是你想要的工具。
如果这是您想要的方式,您也可以尝试相关的遗传算法。
你学过树了吗?您可以创建一个包含所有可能更改的树,从而获得所需的结果。当然,诀窍是避免创建整个树 - 特别是当它的一部分显然不是最佳解决方案时,对吧?
我认为适当的方法是仔细考虑最小“成本”排序的定义属性。然后通过模拟这种理想的排序来计算成本。这里的关键要素是您不必实施通用的最小成本排序算法。
例如,假设最小成本排序的定义属性是每个交换将至少一个交换元素置于其排序位置(我不知道这是否为真)。每个基于交换的排序都希望能够拥有这个属性,但在一般情况下这并不容易(可能?)。但是,您可以轻松创建一个采用未排序数组的程序,获取排序版本(它本身可以通过不理想的算法生成),然后使用此信息决定从未排序数组中实现排序数组的最低成本。
描述
我认为最便宜的方法是 将最便宜的错放物品与属于其所在地的物品交换。我相信这可以通过移动最贵的东西来降低成本。如果n元素不合适,那么最多只需要n-1次交换就可以将它们放置到位,成本为n-1 *成本最低的项目+所有其他不合适的成本。
如果全球最便宜的元素没有放错地方并且这个最便宜的元素和最便宜的错误元素之间的差距足够大,那么将最便宜的元素与最便宜的错误元素交换在一起可能更便宜。那么成本是n-1 *最便宜+所有不合适的成本+最便宜的成本。
例
对于[4,1,2,3],该算法交换(1,2)以产生:
[4,2,1,3]
然后交换(3,1)以产生:
[4,2,3,1]
然后交换(4,1)以产生:
[1,2,3,4]
请注意,[2,3,4]中每个放错位置的项目仅移动一次,并与最低成本项目交换。
码
Ooops:“请不要提供完整的算法,只是一种方法。”删除了我的代码。
为了让你继续前进,这可能没有完全意义。
确定所有可能的移动,以及每次移动的成本并以某种方式存储它们,执行最便宜的移动,然后确定可以从此变体执行的移动,将存储移动的其余部分存储,执行最便宜的等等,直到数组已排序。
我喜欢解决这样的问题。
这个问题也称为 傻排序 一些ACM比赛中的问题。看一眼 这个解决方案 运用 分而治之。
在相同的输入数据上尝试不同的排序算法并打印最小值。