找回密码
 加入
搜索
楼主: binghc

[效率算法] 数据公正性分配算法Lv1【这题做了我两天两夜,现已达到极限,高手们继续】

 火... [复制链接]
发表于 2011-9-16 22:08:10 | 显示全部楼层
回复 1# binghc


    我等做完了才去下载楼主的附件,才发现里面没有源码,不过没事,出题人到最后再给代码也是可以的,楼主两天两夜,真是有耐性啊,呵呵
 楼主| 发表于 2011-9-16 22:13:09 | 显示全部楼层
回复 39# tryhi


与其我直接告诉你要怎么怎么互换数据,还让你这么纠结

我还是把问题从数学模型上抽象到生活中来,你自己分析题目,自己爱怎么换就怎么换,只要最后能把

那小岛上的金子都拿走,那你就成功了,实在不能拿走,尽可能的多拿走些,那你也离成功不远了

发表于 2011-9-16 22:18:28 | 显示全部楼层
回复 47# binghc


    都说我明白啦,垂直互换没意义是不?1.只需说“是”还是“不是”,2.我的源码正不正确
发表于 2011-9-16 22:20:41 | 显示全部楼层
[quote]回复  tryhi
非同一列的互换是有意义的,可能说垂直互换容易让人误解
xms77 发表于 2011-9-16 21:11 [/
   

这个题确实有点儿意思,开始也没有理解,xms77兄 提醒的好!
 楼主| 发表于 2011-9-16 22:28:44 | 显示全部楼层
回复 48# tryhi


  都说我明白啦,垂直互换没意义是不?1.只需说“是”还是“不是”,2.我的源码正不正确

    呵呵~那就当我多嘴了
首先恭喜你是第一个给出算法的人

至于代码正不正确,这没有什么正不正确的,只要出来的结果就可以了,看看每列是不是很接近平均值就可以了。如果是,那你的代码就是没问题的

但是有个问题还真得说说,你的计算结果总共有1293个数字,比原来多了3个,检查检查
发表于 2011-9-16 22:34:44 | 显示全部楼层
回复 50# binghc


    你不会不会把总计那行也算进去啊,没多没少啊
 楼主| 发表于 2011-9-16 22:39:27 | 显示全部楼层
回复 51# tryhi


    哦~看错看错,不好意思,说明你的算法没问题

现在如果是4个人,5个人,应该没也没什么问题吧?
 楼主| 发表于 2011-9-16 22:46:20 | 显示全部楼层
本帖最后由 binghc 于 2011-9-16 22:47 编辑

回复 51# tryhi


       3列会了, 4列5列,肯定没问题,你的代码我看了,就是针对3列写的

好的算法一般力求降低耦合性,增强通用性。有兴趣的写一下,怕麻烦就算了



其他高手继续……
发表于 2011-9-16 22:46:52 | 显示全部楼层
回复  tryhi


    哦~看错看错,不好意思,说明你的算法没问题

现在如果是4个人,5个人,应该没也没 ...
binghc 发表于 2011-9-16 22:39


不过现在算法设计中只考虑了三,而且还不确定能不能计算出最优解,不过根据这个思路改成N行N列也是比较简单的,但这个思路究竟是不是能得到最优解这个我还不是很确定。因为只考虑了相邻两列,期待高人出现
 楼主| 发表于 2011-9-16 22:52:44 | 显示全部楼层
回复 54# tryhi


    这种算法一般用在数据公正性分配比较多一点儿,一般对效率要求也不特别高,最重要的是能完成功能,相差个几分钟,没太大关系。当然你能让它跑的更快,那当然是好事儿
发表于 2011-9-17 02:07:12 | 显示全部楼层
路过
瞅一瞅
发表于 2011-9-17 15:21:49 | 显示全部楼层
嗯,没有找到好的算法.
给出个笨办法,也算为如此好的题目做下抛砖引玉的烂砖头吧,希望能引来数学高手.
#include <array.au3>

Local $arr[18] = [1, 2, 3, 3, 2, 4, 5, 3, 4, 6, 4, 5, 7, 5, 6, 8, 6, 7]

$e=_ArrayToString($arr,"+")

Local $array[UBound($arr) / 3][3], $sum

For $i = 0 To UBound($array) - 1
        Local $temp[3] = [Number($arr[$i * 3]), Number($arr[$i * 3 + 1]), Number($arr[$i * 3 + 2])]
        $array[$i][0] = $temp[0]
        $array[$i][1] = $temp[1]
        $array[$i][2] = $temp[2]
Next

_ArrayDisplay($array,"原始数据")
MsgBox(0, "总和", _sum($array, 0) & @CRLF & _sum($array, 1) & @CRLF & _sum($array, 2))
$AVG = Int(Execute($e)/3)

For $i = 0 To UBound($array) - 1
        $max = max($array[$i][0], $array[$i][1], $array[$i][2])
        $min = min($array[$i][0], $array[$i][1], $array[$i][2])
        $sum0 = _sum($array, 0)
        $sum1 = _sum($array, 1)
        $sum2 = _sum($array, 2)

        $max_sum = max($sum0, $sum1, $sum2)
        $min_sum = min($sum0, $sum1, $sum2)

        If $sum0 = $sum1 And $sum1 = $sum2 Then ExitLoop

        If Eval("sum"&$max_sum) > $AVG Then
                If Number($array[$i][$max_sum]) <= Number($array[$i][$min_sum]) Then ContinueLoop
                $temp = $array[$i][$max_sum]
                $array[$i][$max_sum] = $array[$i][$min_sum]
                $array[$i][$min_sum] = $temp
        EndIf
Next

_ArrayDisplay($array,"结果")
MsgBox(0, "结果&每列总和", _sum($array, 0) & @CRLF & _sum($array, 1) & @CRLF & _sum($array, 2))


Func _sum($array, $col)
        If UBound($array, 0) <> 2 Then Return SetError(0)
        Local $sum = 0
        For $i = 0 To UBound($array) - 1
                $sum += $array[$i][$col]
        Next
        Return $sum
EndFunc   ;==>_sum

Func Max($x, $y, $z)
        $x = Number($x)
        $y = Number($y)
        $z = Number($z)
        Local $index = 0;[2]=[0,$x]
        If $y > $x Then
                $index = 2
                If $y > $z Then
                        $index = 1
                EndIf
        EndIf
        
        If $z > $x Then
                $index = 1
                If $z > $y Then
                        $index = 2
                EndIf
        EndIf
        Return $index
EndFunc   ;==>Max

Func min($x, $y, $z)
        $x = Number($x)
        $y = Number($y)
        $z = Number($z)
        Local $index = 0;[2]=[0,$x]
        If $y < $x Then
                $index = 2
                If $y < $z Then
                        $index = 1
                EndIf
        EndIf
        
        If $z < $x Then
                $index = 1
                If $z < $y Then
                        $index = 2
                EndIf
        EndIf
        Return $index
EndFunc   ;==>min

评分

参与人数 1金钱 +50 贡献 +5 收起 理由
tryhi + 50 + 5 学习了

查看全部评分

发表于 2011-9-17 16:41:46 | 显示全部楼层
回复看一下,学习一下。。。。。。。。。
发表于 2011-9-17 18:42:55 | 显示全部楼层
什么东西,瞧一瞧
发表于 2011-9-17 18:42:57 | 显示全部楼层
什么东西,瞧一瞧
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-2 08:36 , Processed in 0.077168 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表