我的房间分配问题源码, 共同学习

denghui0815 2007-12-25 09:23:06
请大家一起讨论 给出更好的建议
http://download.csdn.net/user/huanyun
...全文
881 36 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
denghui0815 2008-01-24
  • 打赏
  • 举报
回复
错误更正
XGetDisharmonyCore 使用了SSE 所以要求数据必须128bit对齐
denghui0815 2008-01-05
  • 打赏
  • 举报
回复
XGetDisharmonyCore 使用了SSE 所以要求数据必须128字节对齐 你可以改变tagXStudent

typedef struct tagXStudent
{
char szName[12]; // 姓名信息
uint nVal;
char szAnswer[64]; // 调查结果
}XSTUDENT,*PXSTUDENT;
瓶盒 2008-01-04
  • 打赏
  • 举报
回复
tagXStudent好象是128位宽的,可以在最后的128位中插入一个变量,不过XGetDisharmonyCore函数的第三个比较要改一下,用全0来排序效果应该比字符串比较差.
guajunjie 2008-01-04
  • 打赏
  • 举报
回复
我本来准备不额外维护一个向量,在tagXStudent加了一个uint,但是在XGetDisharmonyCore函数中,十分意外的
得到一个抱错,不知道原因,所以只好额外维护了一个向量了,呵呵!
guajunjie 2008-01-04
  • 打赏
  • 举报
回复
对于排序,我有新想法,但是效果不好,请检查一下。
1.对每个样本取出它与全0的差别,然后把差别保存到一个向量中。(简称差别向量)
2.对保存好的向量进行快速排序,然后根据排序结果,动态调整student数组中的学生的位置,使差别和学生位置
保持一一对应。
3.调用局部查找模块。
发现效果还不如直接排序后的结果。但我认为可以用于对较多学生时进行排序用,因为这种排序方法时间上要优于
直接根据字符串排序。
分析原因:因为只有50个结果,最多可能产生的差别值只能是200,那么差别向量的数域只能为[0-200],如果还
考虑它为正态分布,那100左右的差别可能为最多,0或者200肯定最少,如果学生数超过200,那么为100的学生数
很有可能不只一个,(10万个数据时,有超过5000个),而对于这些数快速排序是认为无差别的,不能达到预期
结果。
其实如果差别域能够足够大,这种方法理论是可行的,至少要比直接字符串排序强,因为它能够识别出1000和
0001的问题。
这只是一个思路,我还尝试在同一差别下的学生采取denghui的快速排序,但是效果还是不咋地,这个我还没有理
解原因。
我觉得好的方法应该要保证:具有相同模式的结果尽可能靠近,相同的数据要绝对靠拢。对于denghui的这种方法
我觉得排序太重要的,排序排的好,可以直接降低局部最优搜索空间,加快速度,增强效果。
所有的试验都是在另写函数的基础上,尽最小可能保全denghui的代码,学习用,所以请denghui不要介意。
denghui0815 2008-01-03
  • 打赏
  • 举报
回复
先把system32下的删除调 然后用PATH就可以了 就是dll的搜索路径
guajunjie 2008-01-03
  • 打赏
  • 举报
回复
非常感谢!
呵呵,我终于找到原因了,因为我引得库是32位,而错误的dll却是64位的,之前的所有解决方案我都是操作的64
位dll,唉,没文化真可怕。
感谢denghui给了我提示。
不过,我把lib添加到了环境变量中,好像不行,后来我只有把32位dll拷贝到了system32中,得到了解决。
不知道你们一般都是怎么处理的。
总之感谢,现在可以安心学习了,就这么一个问题居然难了我快一个星期了!
瓶盒 2008-01-02
  • 打赏
  • 举报
回复
学习了一下,他的算法效率相当高,字符排序主要是控制整体大致有秩,后面的临近最佳法,保证了每对学生都是千里挑一的,从而在组合概率上有了很大提高。如果想获得更优的解可以在他的算法基础再加上遗传算法,逐渐逼近,但效率就低很多了,我试了下,几倍时间只有千分之几的改进,
denghui0815 2008-01-02
  • 打赏
  • 举报
回复
那就是环境变量没设置好 你把编译器的lib路径加到PATH里面就可以了
denghui0815 2008-01-02
  • 打赏
  • 举报
回复
1 对于特殊的数据可能不是很好 类似于快速排序
2 我也没有想出能更好的方法去进行相似排序
3 其实对于大量的数据 一次局部优化就能达到64%左右 应该强于退火

另外 我认为可以对一次局部优化后的房间 按照每个房间第一个人的答案 进行其他方式的局部有序 然后进行局部退火 应该能得到更好的结果

这些弱点其实我也知道 可是我目前没有其他方法能改进它 如楼上所说我试过在我的结果上再进行退火 但基本上退不下去 特别是数据量很大的时候

可以采取随机取10个字符排序的方式 应该比字符串比较要好
guajunjie 2008-01-02
  • 打赏
  • 举报
回复
一样, 只要用intel的编译器就有问题
我现在尝试的解决方案是重装编译器,并升级到10.1
denghui0815 2008-01-02
  • 打赏
  • 举报
回复
用不了intel数学库可以把#include <mathimf.h> 换成 #include <math.h> 应该不影响效率

就不使用libmmdd.dll了
guajunjie 2008-01-02
  • 打赏
  • 举报
回复
请教一个问题,我认真运行过你的两种代码,我这边出现了一个问题,与代码无关的的问题.
说是libmmdd.dll为无效的windows映像.并且只在模拟退火算法中出现.
我用的是vs2005,装了intel 9.1 c++,还有mkl,
不明白为什么老是报这个错,
还有,经过调试后,发现因为模拟退火中调用的有exp这个函数,并且肯定是因为动态引入了这个函数造成的错误.
我已经找答案N久了,也没有解决,所以在此请假,希望能得到正解.
尝试过的解决方法有:
把libmmdd.dll拷贝到system32目录下,但只是抱错的位置发生改变
认真配置编译环境,我把两种代码的编译环境配置的一模一样,但是模拟退火还是会抱错
fmddlmyy 2008-01-01
  • 打赏
  • 举报
回复
在另一个帖子写过:
>>我后来想了想,denghui按照字符串比较排序其实是有问题的,例如:
>>1 0 0 0 0 0 0 0和0 0 0 0 0 0 0 1会被分隔很远,其实它们还是很般配的。
>>对于随机数据,排序没有问题。但对于有一定特征的数据,结果就可能很差。即使给予足够的运算时间,但由于算法的局限性,也达不到最优解。

>>而使用模拟退火算法只要每个温度迭代足够多步(以达到平稳分布),理论上是可以得到全局最优解的。

>>不过在两分钟限制的前提下,denghui的算法要明显优于模拟退火算法。

学生的答卷本质上是没有顺序的。通过排序可以分割解空间,更快地得到结果。但其实这个分解也抛弃了很多可能性,可能包括更优的解。
不过如果将时间限制放在第一位,那么denghui的解法是很出色的,虽然它不能保证得到最优解,但对于大多数数据集,它能在两分钟内用更短的时间获得比那些理论上可以获得最优解的算法更优秀的解。
捺捺 2007-12-29
  • 打赏
  • 举报
回复
iseeiconquer
smallEar
等 级:
发表于:2007-12-25 22:56:146楼 得分:0
我想要第一名的代码,那个得300分的,自称得过2次全国数模大赛一等奖的人的代码!




顶!!
denghui0815 2007-12-28
  • 打赏
  • 举报
回复
用不了intel数学库可以把#include <mathimf.h> 换成 #include <math.h> 应该不影响效率
denghui0815 2007-12-28
  • 打赏
  • 举报
回复
用不了数据库可以把#include <mathimf.h> 换成 #include <math.h>应该不影响效率
捺捺 2007-12-28
  • 打赏
  • 举报
回复
顶起~
akingli 2007-12-28
  • 打赏
  • 举报
回复
我怎么用不了intel的数学库里面的函数啊? 楼主真不厚道,帖出来的程序编译环境都不写!
denghui0815 2007-12-27
  • 打赏
  • 举报
回复
libmmd.dll 是intel编译器的库
加载更多回复(16)

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧