算法的优化。 - 页 2 12345678910 新评论 Serj 2012.04.04 21:48 #11 就这样。//———————————————————————————————————————————————————————————————— int Selection() { int u=0; double p=RNDfromCI(Population[0][0]-Population[0][SizeOfPop-1]); for(u=0;u<SizeOfPop;u++) if(Population[0][u+1]<=p) break; return(u); } //————————————————————————————————————————————————————————————————? Vladimir Gomonov 2012.04.04 22:56 #12 我已经把它加速了一个半的系数。// Рулетка. int Roulette(double &array[], int SizeOfPop) { double p, sum=0, zero = array[SizeOfPop-1] - 1.; for(int i=0; i<SizeOfPop; i++) { select[i] = sum += array[i] - zero; } // бросим "шарик" p=RNDfromCI(0,sum); // посмотрим, на какой сектор упал "шарик" for(int u=0;u<SizeOfPop;u++) if(select[u]>=p) return(u); return -1; } 零(在你的例子中是 "系数")的选择同样愚蠢(几乎是 "凭空而来")。 // 作为一个潜在的用户,我建议你还是要仔细考虑一下这一点。// 我对这个问题有合理的想法,我们可以在闲暇时讨论。如果你在计算零时把1.1而不是1,结果(数字,而不是速度)将与你的情况完全一样。2012.04.05 02:30:17 mdRoulette (GBOTUSDMUR16Apr2012,M1) ---------------- 2012.04.05 02:30:17 mdRoulette (GBOTUSDMUR16Apr2012,M1) h0 = 38621212; 38.621212 2012.04.05 02:30:17 mdRoulette (GBOTUSDMUR16Apr2012,M1) h1 = 31685827; 31.685827 2012.04.05 02:30:17 mdRoulette (GBOTUSDMUR16Apr2012,M1) h2 = 17770070; 17.77007 2012.04.05 02:30:17 mdRoulette (GBOTUSDMUR16Apr2012,M1) h3 = 7335400; 7.3354 2012.04.05 02:30:17 mdRoulette (GBOTUSDMUR16Apr2012,M1) h4 = 4203603; 4.203603 2012.04.05 02:30:17 mdRoulette (GBOTUSDMUR16Apr2012,M1) h5 = 383888; 0.383888 2012.04.05 02:30:17 mdRoulette (GBOTUSDMUR16Apr2012,M1) 10374 мс - Время исполнения 2012.04.05 02:30:00 Roulette (GBOTUSDMUR16Apr2012,M1) ---------------- 2012.04.05 02:30:00 Roulette (GBOTUSDMUR16Apr2012,M1) h0 38635063 38.635063 2012.04.05 02:30:00 Roulette (GBOTUSDMUR16Apr2012,M1) h1 31678144 31.678144 2012.04.05 02:30:00 Roulette (GBOTUSDMUR16Apr2012,M1) h2 17759576 17.759576 2012.04.05 02:30:00 Roulette (GBOTUSDMUR16Apr2012,M1) h3 7333799 7.333799 2012.04.05 02:30:00 Roulette (GBOTUSDMUR16Apr2012,M1) h4 4208364 4.208364 2012.04.05 02:30:00 Roulette (GBOTUSDMUR16Apr2012,M1) h5 385054 0.385054 2012.04.05 02:30:00 Roulette (GBOTUSDMUR16Apr2012,M1) 16036 мс - Время исполнения 2012.04.05 02:29:24 Roulette (GBOTUSDMUR16Apr2012,M1) ---------------- 附加的文件: mdRoulette.mq5 3 kb Yedelkin 2012.04.05 13:51 #13 这样的问题https://www.mql5.com/ru/forum/6343/page5#comment_177533,在 这个主题中 是否合适? Andrey Dik 2012.04.05 14:43 #14 MetaDriver: 1.加速了1.5倍。2.对问题有合理的想法,可以在闲暇时讨论。1.好的解决方案,谢谢。要点和我的一样,但你用一个标记阵列而不是两个--因此速度提高了。看起来你不可能做得更好。除非你把标记从循环中拿出来。for(int i=0; i<SizeOfPop; i++) { select[i] = sum += array[i] - zero; }:)2.当然。 Andrey Dik 2012.04.05 14:44 #15 Yedelkin:这样的问题https://www.mql5.com/ru/forum/6343/page5#comment_177533,在 这个主题中 是否合适? 是的,这些都是算法的问题。然而,那条线已经回答了这个问题。 Dmitry Fedoseev 2012.04.05 14:59 #16 而像这样...void Test(){ double SectorSize[]={22,3,2,1,7,12}; double tc[]; ArrayResize(tc,ArraySize(SectorSize)); for(int i=0;i<100000;i++){ tc[Roulete(SectorSize)]++; } int m=tc[ArrayMinimum(tc)]; string str=""; for(i=0;i<ArraySize(SectorSize);i++){ tc[i]/=m; str=str+DoubleToStr(tc[i],2)+" "; } Alert(str); } int Roulete(double & SectorSize[]){ // На входе размеры секторов double Sum=0; int i; for(i=ArraySize(SectorSize);i>=0;i--){ Sum+=SectorSize[i]; } for(i=ArraySize(SectorSize);i>0;i--){ if(MathRand()<SectorSize[i]/Sum*32767){ return(i); } Sum-=SectorSize[i]; } return(i); }输入是一个包含扇区大小的数组( 不需要对数组进行排序)。为什么你在数组里有一个负数--我不明白。可能是扇形分区? Vladimir Gomonov 2012.04.05 16:41 #17 joo:好的解决方案,谢谢。这个想法和我的一样,但你用一个标记阵列代替了两个标记阵列--因此速度提高了。看起来你不可能做得更好。这个收获是通过许多小的改进实现的。 你还可以再加快一点 "小东西 "的速度。例如,如果你在调用轮盘时事先将第二个参数减少一个。int Roulette(double &array[], int MaxIndex) { double p, sum=0, zero = array[MaxIndex] - 1.1; for(int i=0; i!=MaxIndex; i++) { select[i] = sum += array[i] - zero; } // бросим "шарик" p=RNDfromCI(0,sum); // посмотрим, на какой сектор упал "шарик" for(int u=0;u!=MaxIndex;u++) { if(select[u]>=p) return(u);} return -1; } 你仍然得到一个相当可衡量的差异。2012.04.05 18:35:31 mdQuikRoulette (USDCHF,M1) ---------------- 2012.04.05 18:35:31 mdQuikRoulette (USDCHF,M1) h0 = 38784632; 38.784632 2012.04.05 18:35:31 mdQuikRoulette (USDCHF,M1) h1 = 31791177; 31.791177 2012.04.05 18:35:31 mdQuikRoulette (USDCHF,M1) h2 = 17835360; 17.83536 2012.04.05 18:35:31 mdQuikRoulette (USDCHF,M1) h3 = 7365937; 7.365937 2012.04.05 18:35:31 mdQuikRoulette (USDCHF,M1) h4 = 4222894; 4.222894 2012.04.05 18:35:31 mdQuikRoulette (USDCHF,M1) h5 = 0; 0.0 2012.04.05 18:35:31 mdQuikRoulette (USDCHF,M1) 9828 мс - Время исполнения 2012.04.05 18:33:30 mdRoulette (USDCHF,M1) ---------------- 2012.04.05 18:33:30 mdRoulette (USDCHF,M1) h0 = 38627427; 38.627427 2012.04.05 18:33:30 mdRoulette (USDCHF,M1) h1 = 31682853; 31.682853 2012.04.05 18:33:30 mdRoulette (USDCHF,M1) h2 = 17763763; 17.763763 2012.04.05 18:33:30 mdRoulette (USDCHF,M1) h3 = 7334465; 7.334465 2012.04.05 18:33:30 mdRoulette (USDCHF,M1) h4 = 4206490; 4.20649 2012.04.05 18:33:30 mdRoulette (USDCHF,M1) h5 = 385002; 0.385002 2012.04.05 18:33:30 mdRoulette (USDCHF,M1) 10359 мс - Время исполнения 但这还不是全部。真正的 "大赢家 "就在前面。 等一下,我调试一下,然后发布。//这里有一个小错误--已经修复。 Vladimir Gomonov 2012.04.05 16:45 #18 Integer:而像这样...1.输入一个包含扇区大小的数组( 不需要对数组进行排序)。2.为什么你在数组里有一个负数--我不明白。可能是扇形分区?1.问题是,输入的是原始数据。它们只需要随着游戏的进行转化为扇区大小。这就是问题的一部分。:)2.不可能,只要拷问一下Joo,只要你用力,他就会承认的。 我现在正在调试中。;) Vladimir Gomonov 2012.04.05 18:07 #19 而这是一个真正的高速Quik-roulette。 // Рулетка. int Roulette(double &array[], int r) { double p, sum=0, zero = array[r++] - 1.1; for(int i=0; i!=r; i++) { select[i] = sum += array[i] - zero; } p=RNDfromCI(0,sum); int l=0, m=(l+(--r))>>1; while(l<r) { if(select[m]>=p) r=m; else l=m+1; m=(l+r)>>1; } return m; }2012.04.05 19:58:24 mdQuikRoulette (USDCHF,M1) ---------------- 2012.04.05 19:58:24 mdQuikRoulette (USDCHF,M1) h0 = 38632491; 38.632491 2012.04.05 19:58:24 mdQuikRoulette (USDCHF,M1) h1 = 31675215; 31.675215 2012.04.05 19:58:24 mdQuikRoulette (USDCHF,M1) h2 = 17769223; 17.769223 2012.04.05 19:58:24 mdQuikRoulette (USDCHF,M1) h3 = 7337466; 7.337466 2012.04.05 19:58:24 mdQuikRoulette (USDCHF,M1) h4 = 4202088; 4.202088 2012.04.05 19:58:24 mdQuikRoulette (USDCHF,M1) h5 = 383517; 0.383517 2012.04.05 19:58:24 mdQuikRoulette (USDCHF,M1) 11529 мс - Время исполнения 2012.04.05 19:57:06 mdQuikRoulette (USDCHF,M1) ---------------- 你对这个结果没有印象吗? 这很天真。;)将输入阵列增加10000倍--那么你一定会被打动。--我正在等待对大型阵列的比较测试//。;) 附加的文件: mdQuikRoulette.mq5 3 kb Vladimir Gomonov 2012.04.05 19:35 #20 MetaDriver: 我正在等待在一个大的数组上进行的比较测试//。似乎不能再等了...:)我必须自己再做一次。2012.04.05 22:04:25 mdQuikRoulette_CompareTest (USDCHF,M1) h0 = 2105; 0.02105 2012.04.05 22:04:25 mdQuikRoulette_CompareTest (USDCHF,M1) h1 = 1782; 0.01782 2012.04.05 22:04:25 mdQuikRoulette_CompareTest (USDCHF,M1) h2 = 2189; 0.02189 2012.04.05 22:04:25 mdQuikRoulette_CompareTest (USDCHF,M1) h3 = 1793; 0.01793 2012.04.05 22:04:25 mdQuikRoulette_CompareTest (USDCHF,M1) h4 = 1803; 0.01803 2012.04.05 22:04:25 mdQuikRoulette_CompareTest (USDCHF,M1) h5 = 2075; 0.02075 2012.04.05 22:04:25 mdQuikRoulette_CompareTest (USDCHF,M1) 1825 мс - Время исполнения QuickRoulette 2012.04.05 22:04:23 mdQuikRoulette_CompareTest (USDCHF,M1) h0 = 2104; 0.02104 2012.04.05 22:04:23 mdQuikRoulette_CompareTest (USDCHF,M1) h1 = 1812; 0.01812 2012.04.05 22:04:23 mdQuikRoulette_CompareTest (USDCHF,M1) h2 = 2088; 0.02088 2012.04.05 22:04:23 mdQuikRoulette_CompareTest (USDCHF,M1) h3 = 1839; 0.01839 2012.04.05 22:04:23 mdQuikRoulette_CompareTest (USDCHF,M1) h4 = 1769; 0.01769 2012.04.05 22:04:23 mdQuikRoulette_CompareTest (USDCHF,M1) h5 = 2089; 0.02089 2012.04.05 22:04:23 mdQuikRoulette_CompareTest (USDCHF,M1) 183207 мс - Время исполнения Roulette 同时我把它全部梳理在类中,放到CRoulette.Reset()中。 附加的文件: mdQuikRoulette_CompareTest.mq5 4 kb 12345678910 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
就这样。
?
我已经把它加速了一个半的系数。
零(在你的例子中是 "系数")的选择同样愚蠢(几乎是 "凭空而来")。
// 作为一个潜在的用户,我建议你还是要仔细考虑一下这一点。
// 我对这个问题有合理的想法,我们可以在闲暇时讨论。
如果你在计算零时把1.1而不是1,结果(数字,而不是速度)将与你的情况完全一样。
这样的问题https://www.mql5.com/ru/forum/6343/page5#comment_177533,在 这个主题中 是否合适?
1.加速了1.5倍。
2.对问题有合理的想法,可以在闲暇时讨论。
1.好的解决方案,谢谢。要点和我的一样,但你用一个标记阵列而不是两个--因此速度提高了。看起来你不可能做得更好。
除非你把标记从循环中拿出来。
:)
2.当然。
这样的问题https://www.mql5.com/ru/forum/6343/page5#comment_177533,在 这个主题中 是否合适?
而像这样...
输入是一个包含扇区大小的数组( 不需要对数组进行排序)。
为什么你在数组里有一个负数--我不明白。可能是扇形分区?
好的解决方案,谢谢。这个想法和我的一样,但你用一个标记阵列代替了两个标记阵列--因此速度提高了。看起来你不可能做得更好。
这个收获是通过许多小的改进实现的。 你还可以再加快一点 "小东西 "的速度。
例如,如果你在调用轮盘时事先将第二个参数减少一个。
你仍然得到一个相当可衡量的差异。
但这还不是全部。真正的 "大赢家 "就在前面。 等一下,我调试一下,然后发布。
//这里有一个小错误--已经修复。
而像这样...
1.输入一个包含扇区大小的数组( 不需要对数组进行排序)。
2.为什么你在数组里有一个负数--我不明白。可能是扇形分区?
1.问题是,输入的是原始数据。它们只需要随着游戏的进行转化为扇区大小。这就是问题的一部分。:)
2.不可能,只要拷问一下Joo,只要你用力,他就会承认的。 我现在正在调试中。;)
你对这个结果没有印象吗?
这很天真。;)将输入阵列增加10000倍--那么你一定会被打动。
--
我正在等待对大型阵列的比较测试//。
;)
我正在等待在一个大的数组上进行的比较测试//。
似乎不能再等了...:)
我必须自己再做一次。
同时我把它全部梳理在类中,放到CRoulette.Reset()中。