【发布时间】:2015-05-29 11:59:51
【问题描述】:
我正在尝试优化以下代码和平 - 有多次迭代会消耗大量时间。查看 Parallel.For 示例,但不明白如何在我的情况下使用它们,因为我在每个“for”循环中都有“double”变量。你能帮忙吗?谢谢
public void maximization ()
{
int ii = 0; // counter to alter file name
int jj = 0; // counter for all output strings
string[] calculation;
ArrayList array = new ArrayList(); // temporary array for optimized parameters
for (pr_lower1 = -0.02; pr_lower1 <= 0.0; pr_lower1 = pr_lower1 + 0.002) //11
{
for (pr_upper1 = 0.002; pr_upper1 <= 0.02; pr_upper1 = pr_upper1 + 0.002) //10
{
for (OI_lower1 = 0.02; OI_lower1 <= 0.1; OI_lower1 = OI_lower1 + 0.01) //9
{
for (pr_lower2 = -0.02; pr_lower2 <= 0.0; pr_lower2 = pr_lower2 + 0.002) //11
{
for (pr_upper2 = 0.002; pr_upper2 <= 0.02; pr_upper2 = pr_upper2 + 0.002) //10
{
for (OI_lower2 = -0.1; OI_lower2 <= 0.0; OI_lower2 = OI_lower2 + 0.01) //11
{
for (OI_upper2 = 0.01; OI_upper2 <= 0.1; OI_upper2 = OI_upper2 + 0.01) //10
{
for (stop = 0.05; stop <= 0.27; stop = stop + 0.02) //12
{
for (tp = 0.05; tp <= 0.27; tp = tp + 0.02) //12
{
this.run_algo_max();
jj++;
string output = ret + " " + jj;
array.Add(output);
}
}
}
}
}
}
}
}
ii++;
calculation = (String[])array.ToArray(typeof(string));
array.Clear();
File.WriteAllLines(Application.StartupPath + "\\results" + ii + ".txt", calculation);
}
}
【问题讨论】:
-
你确定你真的需要这么多的循环吗?
-
不幸的是。我有几个参数要优化并试图找到最佳组合
-
这个例子有很多错误。首先,当您计划并行化任何东西时,不要使用类属性。将所有参数传递给
run_algo_max方法,并将返回值作为常规返回值返回。否则,并行化将导致竞争条件。第二:与其直接调用run_algo_max,不如让它成为一个可以迭代选择要检查的特性的委托。 (待定下一条评论) -
如果你能给出真正的代码……现在我可以通过删除 all 的
loops 来为你优化这个;) -
第三,使用启发式。不要计算整个 170 万个特征空间。样本稀疏,立即评估特征点的质量,并将新的要检查的点推回到要检查的点队列中。仔细检查哪些参数推导较低,并首先使其更粗略。仅在这些上增加采样率,因为您已固定具有更高推导的参数。哦,为什么是代表?因此,您可以将新 ponts 排队的代码和负责并行(或卸载)执行的代码分开。
标签: c# loops optimization nested parallel.for