问题 按升序排序数组,同时最小化“成本”


我下学期参加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

您要编写一个程序来确定排列特定数字序列的最低成本。

编辑:教授不允许暴力强迫。


12816
2017-07-24 15:16


起源

你只允许交换相邻的值吗? - Bubblewrap
不,任何元素都可以互换。 - dacman
这显然是一个学术问题 - 在现实生活中,比较成本很高,而不是交流。通常,最小化任何类型的移动数量的算法可能会做得更好 - Jonathan Leffler
回答:“不,任何元素都可以互换”所以1-2-3可以转换为3-2-1,单次交换1和3,成本为4? - hughdbrown
实际上这是一个真实的问题,甚至比排序计算机数据更重要:想象它不是关于排序计算机数据,而是重新计算对象(例如运输场中的容器),每次移动都会产生基于位置的不同成本,重量和谁知道还有什么,并且执行每一步都需要比在几秒钟内计算最佳交换顺序更多的时间。 - Bubblewrap


答案:


如果你想让教授大吃一惊,你可以使用 模拟退火。然后,如果你管理它,你可以跳过一些课程:)。请注意,此算法仅提供近似答案。

否则:试试吧 回溯 算法,或 分支机构。这些都将找到最佳答案。


8
2017-07-24 15:24



哦,伙计,退火! :-)对于那些不知道的人,退火是一系列基于用于处理金属的物理过程的算法!不能比那更酷!或者,更热,更热! :-) - Daniel C. Sobral
谢谢你,这看起来就像我需要的! - dacman
一个 概率 回答一个算法问题?真? - rmmh
@sysrqb嗯,实际上我打算这是笑话答案:)。然后我添加了回溯和分支绑定位作为“严重的事后想法”。 - jqno


你是什​​么意思“暴力强迫?”你的意思是“尝试所有可能的组合并选择最便宜的?”只是检查。

我认为“分支和绑定”是你正在寻找的 - 检查算法的任何来源。它就像“蛮力”一样,除非你尝试一系列动作,只要这个动作序列不如迄今为止所尝试的任何其他动作序列更优化,你就可以放弃让你到达那一点的序列 - 成本。这是上面提到的“回溯”的一种风格。

我这样做的首选语言是Prolog,但我很奇怪。

模拟退火是一种PROBABLISTIC算法 - 如果解空间具有局部最小值,那么您可能被困在一个并得到您认为正确答案但不是。有很多方法可以找到所有相关的文献,但我不同意它是你想要的工具。

如果这是您想要的方式,您也可以尝试相关的遗传算法。


3
2017-07-24 16:04





你学过树了吗?您可以创建一个包含所有可能更改的树,从而获得所需的结果。当然,诀窍是避免创建整个树 - 特别是当它的一部分显然不是最佳解决方案时,对吧?


1
2017-07-24 15:25





我认为适当的方法是仔细考虑最小“成本”排序的定义属性。然后通过模拟这种理想的排序来计算成本。这里的关键要素是您不必实施通用的最小成本排序算法。

例如,假设最小成本排序的定义属性是每个交换将至少一个交换元素置于其排序位置(我不知道这是否为真)。每个基于交换的排序都希望能够拥有这个属性,但在一般情况下这并不容易(可能?)。但是,您可以轻松创建一个采用未排序数组的程序,获取排序版本(它本身可以通过不理想的算法生成),然后使用此信息决定从未排序数组中实现排序数组的最低成本。


1
2017-07-24 15:31





描述

我认为最便宜的方法是 将最便宜的错放物品与属于其所在地的物品交换。我相信这可以通过移动最贵的东西来降低成本。如果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:“请不要提供完整的算法,只是一种方法。”删除了我的代码。


1
2017-07-24 17:01



这种方法输入失败:[1,8,9,7,6] - 最小值为41 - dacman
交换:(1,6),(1,9),(1,7),(1,8),(1,6)。费用:41。是的,我考虑过如果最便宜的已经到位并且它与下一个最昂贵的之间存在很大差距的可能性,解决方案可能不是最理想的,但我无法提出测试案件。谢谢,我会回到这个。 - hughdbrown


为了让你继续前进,这可能没有完全意义。

确定所有可能的移动,以及每次移动的成本并以某种方式存储它们,执行最便宜的移动,然后确定可以从此变体执行的移动,将存储移动的其余部分存储,执行最便宜的等等,直到数组已排序。

我喜欢解决这样的问题。


0
2017-07-24 17:46





这个问题也称为 傻排序 一些ACM比赛中的问题。看一眼 这个解决方案 运用 分而治之


0
2018-01-31 00:51





在相同的输入数据上尝试不同的排序算法并打印最小值。


-1
2017-07-24 15:26



这不太可能产生最佳解决方案。 - AlbertoPL