qq_31382269 2023-12-11 10:33 采纳率: 100%
浏览 29
已结题

虚心请教C#的代码优化问题

虚心请教,我遇到了一个问题,水平有限,困扰我好几天了:
有9个嵌套的for循环,每个for循环各循环100次,最里面是一个封装好的函数,该函数输入为数组,输出为Z。我需要遍历计算所有的Z值,再取其最小值。PS:已知该函数的输入和输出非线性关系,所以尽量全部计算。
代码:C#

 int[]  X =  new  int[10];
    int Z = 0;
    int Min = 10000;
    for(int i1 = 0;i1<100;i1++)
    {
        X[0] = I1;
         for(int i2 = 0;i2<100;i2++)
        {
            X[1] = i2;
            //多层嵌套省略
             ........................
                      for(int i9 = 0;i9<100;i9++)
                     {
                           X[8] = i9 ;
                           X[9] = 100 - i1 -i2 -i3 - i4 - i5 - i6 - i7 - i8 - i9;
                           Z = Function(X);
                           if(Z < Min)   Min = Z;
                     }
        }
    }
```c#



请问:
1.由于Function函数的输入和输出不是呈线性关系,有没有其它算法可以优化,从而减少计算量?

2.如果在必须要暴力全部计算Z值的前提下,可以采取何种方法加快运算速度,减少等待时间?

  • 写回答

17条回答 默认 最新

  • wanghui0380 2023-12-11 14:14
    关注

    有些东西不明确,所以你可以暂时需要按楼上的建议修改。
    1.可以用并行
    2.可以分块并行

    不明确的地方
    1.100 - i1 - i2 - i3 - i4 - i5 - i6 - i7 - i8 - i9; 可以是负数?比如都是99
    2.Function 这个概率判定的到底是什么?线性相关,还是说这就是是个离散度,余弦相似度,方差这种

    如果疑问1,i9也在0-99不是负数,我们可以简化到递归。 因为我们倒推来看 a+b=100,b=100-a,所以倒过来递归处理,这就可以省掉很多多余的循环步骤

    如果疑问2是非线性相关,那么我们不用全排列,用组合就行,那么a+b=100,a的值可以只限定到100/2=50,这样也可以省掉很多多余的循环步骤

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(16条)

报告相同问题?

问题事件

  • 系统已结题 12月22日
  • 已采纳回答 12月14日
  • 赞助了问题酬金15元 12月11日
  • 创建了问题 12月11日

悬赏问题

  • ¥50 关于#微信小程序#的问题:微信小程序支持h5实现webrtc h264 h265低延迟传输渲染,能付费帮我们解决一下吗
  • ¥20 请问ansys License manager 这个问题如何解决
  • ¥15 memory.limit()' is no longer supported
  • ¥15 基于stm32f4产生两路pwm信号并可由串口通信调节
  • ¥15 C++/QT设置函数调用条件(多个功能调用同一,且各自调用条件不同)
  • ¥15 UE5样条线生成的网格UV问题
  • ¥15 如何用最短的时间大致看懂springboot+vue的项目
  • ¥15 (有偿)懂数值分析和含时变参数微分方程的来
  • ¥15 abaqus随机生成二维颗粒
  • ¥15 安装ansys许可证管理器时出现了这个问题,如何解决?