为了账号安全,请及时绑定邮箱和手机立即绑定

有没有比使用嵌套循环更好的寻找解决方案的方法?

有没有比使用嵌套循环更好的寻找解决方案的方法?

慕桂英3389331 2023-06-09 15:13:46
我希望根据包含的代码段中的嵌套循环加快测试所有组合的过程。我目前在 Windows 10 上使用 JavaScript 和 NodeJS。有没有办法使用 GPU 而不是 CPU 来计算这个?var simulations = 0;for (let i = 10; i <= 20; i++) {    breakStepThree = i;    for (let i = 8; i <= 12; i++) {        historyLevelThree = i;        for (let i = 0; i <= 60; i += 5) {            rateLevelThree = i;            for (let i = 10; i <= 16; i++) {                breakStepTwo = i;                for (let i = 6; i <= 10; i++) {                    historyLevelTwo = i;                    for (let i = 0; i <= 50; i += 5) {                        rateLevelTwo = i;                        for (let i = 10; i <= 14; i++) {                            breakStepOne = i;                            for (let i = 4; i <= 8; i++) {                                historyLevelOne = i;                                for (let i = 0; i <= 40; i += 5) {                                    rateLevelOne = i;                                    simulations++;                                    console.log('testing combination '                                        + rateLevelOne + ' ' + historyLevelOne + ' ' + breakStepOne + ' '                                        + rateLevelTwo + ' ' + historyLevelTwo + ' ' + breakStepTwo + ' '                                        + rateLevelThree + ' ' + historyLevelThree + ' ' + breakStepThree                                    );                                    console.log('performing test no ' + simulations);                                }                            }                        }                    }                }            }        }    }}尽我所能实施工作线程。
查看完整描述

3 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

在 Node.js 中,我不知道有任何易于使用的 GPU。根据为测试每个组合所做的工作的性质和主机系统的特性,您可以使用内置的worker_threads和/或集群模块来分散工作。该worker_threads模块在进程中创建线程。该cluster模块创建单独的进程。



查看完整回答
反对 回复 2023-06-09
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

尽我所能实施工作线程。


const {

    Worker, isMainThread, parentPort, workerData

} = require('worker_threads');


const os = require('os');


if (isMainThread) {

    const startTime = Date.now();


    const workers = [];


    // const numberOfThreads = 1;

    const numberOfThreads = os.cpus().length;


    let completed = 0;


    let minBreakStep = 10;

    let maxBreakStep = 20;

    let minMaxElements = [];


    for (let i = minBreakStep; i <= maxBreakStep; i++) {

        minMaxElements.push(i);

    }


    const numberOfElements = minMaxElements.length;


    const numElementsPerThread = Math.ceil(numberOfElements / numberOfThreads);


    let workerIndex = 0;


    let allSimulations = 0;


    for (let i = minBreakStep; i <= maxBreakStep; i += numElementsPerThread) {

        let workerStart = i;

        let workerEnd = i + numElementsPerThread - 1;

        if (workerEnd > maxBreakStep) {

            workerEnd = maxBreakStep

        }


        const worker = new Worker(__filename, {

            workerData: {

                workerIndex,

                workerStart,

                workerEnd,

            }

        });


        worker.on('message', (message) => {

            if (message.completed) {

                completed++;

                console.log('worker ' + message.workerIndex + ' completed ' + message.simulations + ' simulations.');

                allSimulations += message.simulations;

            }

            if (completed === workers.length) {

                console.log('Completed all ' + allSimulations + ' done!');

                const endTime = Date.now();

                const elapsedTime = (endTime - startTime) / 1000;

                console.log(elapsedTime + ' second(s) to complete');

            }

        });

        workerIndex++;

        workers.push(worker);

    }


} else {


    let workerIndex = workerData.workerIndex;

    let workerStart = workerData.workerStart;

    let workerEnd = workerData.workerEnd;


    let simulations = 0;


    for (let i = workerStart; i <= workerEnd; i++) {

        breakStepThree = i;

        for (let i = 8; i <= 12; i++) {

            historyLevelThree = i;

            for (let i = 0; i <= 60; i += 5) {

                rateLevelThree = i;

                for (let i = 10; i <= 16; i++) {

                    breakStepTwo = i;

                    for (let i = 6; i <= 10; i++) {

                        historyLevelTwo = i;

                        for (let i = 0; i <= 50; i += 5) {

                            rateLevelTwo = i;

                            for (let i = 10; i <= 14; i++) {

                                breakStepOne = i;

                                for (let i = 4; i <= 8; i++) {

                                    historyLevelOne = i;

                                    for (let i = 0; i <= 40; i += 5) {

                                        rateLevelOne = i;

                                        simulations++;

                                        // console.log('testing combination '

                                        //     + rateLevelOne + ' ' + historyLevelOne + ' ' + breakStepOne + ' '

                                        //     + rateLevelTwo + ' ' + historyLevelTwo + ' ' + breakStepTwo + ' '

                                        //     + rateLevelThree + ' ' + historyLevelThree + ' ' + breakStepThree

                                        // );

                                        // console.log('performing test no ' + simulations);

                                    }

                                }

                            }

                        }

                    }

                }

            }

        }

    }


    console.log('testing completed');

    parentPort.postMessage({

        completed: true,

        workerIndex: workerIndex,

        simulations: simulations,

    });

}



查看完整回答
反对 回复 2023-06-09
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

例如,您可以使用 CUDA 绑定在 GPU 上执行计算。也许在这种情况下,连接 C 程序并导入/导出实验设计和结果会更好。

此外,我将使用如下所示的方法摆脱所有这些嵌套循环。为了性能起见,可能会去掉切片,并检查参数,因为下面的几行只是为了理解这个想法。

class ExperimentGenerator{


  let pointer = 0;

  const initialParams = [0,0,0,0,0,0,0,0];

  let params = [...initialParams]

  const maxValue = [10,10,10,10,10,10,10,10]


  nextExperiment = () =>{

     if(params[pointer] >= maxValue[pointer]){

         pointer++;

         //Reset all other parameters

         params = [initialParams.slice(0,pointer),params[pointer],initialParams.slice(pointer)];

     }

     params[pointer]++;

     return params;

  }

}


查看完整回答
反对 回复 2023-06-09
  • 3 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信