java - 将Matlab程序转换为Java以提高性能的敏感性

标签 java matlab genetic-algorithm sudoku

他的

我有一个假设性的问题。我们刚刚编写了一些实现遗传算法的代码,以找到数独游戏的解决方案,作为计算智能类(class)项目的一部分。不幸的是,它运行速度非常慢,这限制了我们执行足够数量的运行以找到最佳参数的能力。问题是,将整个代码重新编程(代码基础不是那么大)到 java 中是否是提高软件速度的可行解决方案。就像我们确实需要 10 倍的性能改进一样,我怀疑 Java 版本是否会更快。有什么想法吗?

谢谢

===更新1===

这是计算成本最高的函数的代码。它是一个 GA 适应度函数,它迭代总体(不同的数独板)并计算每行和每列有多少个元素是重复的。参数 n 已传递,当前设置为 9。也就是说,该函数计算一行中有多少个元素在 1 到 9 范围内多次出现。数字越高,董事会的适应度就越低,这意味着它对于下一代来说是一个较弱的候选者。

分析器报告两行调用在 for 循环中相交,导致性能不佳,但我们不知道如何真正优化代码。其内容如下:

function [fitness, finished,d, threshold]=fitness(population_, n)
finished=false;
threshold=false;
V=ones(n,1);
d=zeros(size(population_,2),1);
s=[1:1:n];
for z=1:size(population_,2)
    board=population_{z};
    t=0;
    l=0;
    for i=1:n
        l=l+n-length(intersect(s,board(:,i)'));
        t=t+n-length(intersect(s,board(i,:)));

    end
    k=sum(abs(board*V-t));

    f=t+l+k/50;
    if t==2 &&l==2
        threshold=true;
    end
    if f==0
        finished=true;        
    else
        fitness(z)=1/f;
        d(z)=f;
    end
end
end

===更新2===

在这里找到了解决方案:http://www.mathworks.com/matlabcentral/answers/112771-how-to-optimize-the-following-function

使用 histc(V, 1:9),速度快得多:)

最佳答案

如果不查看代码、了解是否使用并行化等,这是不可能说的。事实上,正如 MrAzzaman 所说,分析是要做的第一件事。如果您发现单个瓶颈,尤其是循环较多的情况,则用 C 语言编写该部分并通过 MEX 将其连接到 Matlab 可能就足够了。

在遗传算法中,我相信可以实现 10 倍的速度提升,而不是不能。我不太同意 MrAzzaman 的观点——在某些情况下(for 循环、使用动态对象)比 C/C++/Java 慢得多。这并不是说 Matlab 总是很慢,因为它并非如此,而是有很多算法会很慢。

也就是说,如果你不花太多时间循环,不使用对象,不受 Matlab 数据结构的限制,你可能会觉得 Matlab 没问题。也就是说,如果我用 Java 或 Matlab 编写 GA,我宁愿选择前者(而且我现在使用 Matlab 的次数比 Java 多得多,这不仅仅是习惯问题)。

顺便说一句。如果你不想自己编程,可以看看 JGAP,它是一个对于 GA 来说相当有用的 Java 库。

关于java - 将Matlab程序转换为Java以提高性能的敏感性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21146693/

相关文章:

java - 亚马逊 AWS 教程?

python - 是否有 Matlab "stem3"的 matplotlib 副本?

matlab - 继续在 Matlab 中一遍又一遍地播放声音?

testing - 遗传编程成功解决了哪些问题?

algorithm - 使用遗传算法进行闭合路径规划任务的良好个体表示是什么?

java - Hibernate Envers 如何记录额外的审计数据,例如被审计的表名

java - Java 中乘法的 J 单元测试

java - 为什么 Java 中的 addLast() 替换了我的链表?

r - 如何在给定索引数据帧的情况下创建 cclust 对象

algorithm - 给定序列S和T,找到一个序列X和Y,使得S和T属于X和Y的shuffle。(X和Y可能不存在)