Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在并行_for循环中使用GLPK_C++_Concurrency_Glpk - Fatal编程技术网

C++ 在并行_for循环中使用GLPK

C++ 在并行_for循环中使用GLPK,c++,concurrency,glpk,C++,Concurrency,Glpk,我想在GLPK中以并行_for循环运行LP解算器。这些问题都是相互独立的,所以不应该有任何干扰 下面是一个失败的示例代码,这本质上是glpk wikibook中的示例代码,但被包装在一个并行的\u for循环中。任何帮助都将不胜感激 //#include <stdio.h> /* C input/output */ //#include <stdlib.h> /* C standard

我想在GLPK中以并行_for循环运行LP解算器。这些问题都是相互独立的,所以不应该有任何干扰

下面是一个失败的示例代码,这本质上是glpk wikibook中的示例代码,但被包装在一个并行的\u for循环中。任何帮助都将不胜感激

//#include <stdio.h>            /* C input/output                       */
//#include <stdlib.h>           /* C standard library                   */
#include <iostream>
#include <glpk.h>             /* GNU GLPK linear/mixed integer solver */
#include <ppl.h>

using namespace concurrency;
using namespace std;

void main()
{
    parallel_for(0, 10, [](int i){
        /* declare variables */
        glp_prob *lp;
    int *ia = new int[4];
    int *ja = new int[4];
    double *ar = new double[4];
    double z, x1, x2;


    /* create problem */
    lp = glp_create_prob();
    glp_set_prob_name(lp, "minimax");
    glp_set_obj_dir(lp, GLP_MAX);


    /* fill problem */
    glp_add_rows(lp, 2);
    //glp_set_row_name(lp, 1, "p");
    glp_set_row_bnds(lp, 1, GLP_UP, 0.0, 1.0);
    //glp_set_row_name(lp, 2, "q");
    glp_set_row_bnds(lp, 2, GLP_UP, 0.0, 2.0);


    glp_add_cols(lp, 2);
    //glp_set_col_name(lp, 1, "x1");
    glp_set_col_bnds(lp, 1, GLP_LO, 0.0, 0.0);
    glp_set_obj_coef(lp, 1, 0.6);
    //glp_set_col_name(lp, 2, "x2");
    glp_set_col_bnds(lp, 2, GLP_LO, 0.0, 0.0);
    glp_set_obj_coef(lp, 2, 0.5);


    ia[1] = 1, ja[1] = 1, ar[1] = 1.0; /* a[1,1] = 1 */
    ia[2] = 1, ja[2] = 2, ar[2] = 2.0; /* a[1,2] = 2 */
    ia[3] = 2, ja[3] = 1, ar[3] = 3.0; /* a[2,1] = 3 */
    ia[4] = 2, ja[4] = 2, ar[4] = 1.0; /* a[2,2] = 1 */
    glp_load_matrix(lp, 4, ia, ja, ar);



    /* solve problem */
    glp_simplex(lp, NULL);
    /* recover and display results */
    z = glp_get_obj_val(lp);
    x1 = glp_get_col_prim(lp, 1);
    x2 = glp_get_col_prim(lp, 2);
    printf("z = %g; x1 = %g; x2 = %g\n", z, x1, x2);
    /* housekeeping */
    glp_delete_prob(lp);
    glp_free_env();
});
    system("pause");
}
/\include/*C输入/输出*/
//#include/*C标准库*/
#包括
#包含/*GNU GLPK线性/混合整数解算器*/
#包括
使用名称空间并发;
使用名称空间std;
void main()
{
(0,10,[](int i)的并行_{
/*声明变量*/
glp_prob*lp;
int*ia=新的int[4];
int*ja=新的int[4];
double*ar=新的double[4];
双z,x1,x2;
/*制造问题*/
lp=glp_create_prob();
glp_集_prob_名称(lp,“极小极大”);
glp_集合对象目录(lp,glp_最大值);
/*填充问题*/
glp_添加_行(lp,2);
//glp设置行名称(lp,1,“p”);
glp设置行(lp,1,glp向上,0.0,1.0);
//glp设置行名称(lp,2,“q”);
glp设置行(lp,2,glp向上,0.0,2.0);
glp_添加_cols(lp,2);
//glp集合集合名称(lp,1,“x1”);
glp_集合col_bnds(lp,1,glp_LO,0.0,0.0);
glp_集_obj_系数(lp,1,0.6);
//glp集合集合名称(lp,2,“x2”);
glp_集合col_bnds(lp,2,glp_LO,0.0,0.0);
glp_集_obj_系数(lp,2,0.5);
ia[1]=1,ja[1]=1,ar[1]=1.0;/*a[1,1]=1*/
ia[2]=1,ja[2]=2,ar[2]=2.0;/*a[1,2]=2*/
ia[3]=2,ja[3]=1,ar[3]=3.0;/*a[2,1]=3*/
ia[4]=2,ja[4]=2,ar[4]=1.0;/*a[2,2]=1*/
glp_载荷_矩阵(lp、4、ia、ja、ar);
/*解决问题*/
glp_单纯形(lp,NULL);
/*恢复并显示结果*/
z=glp_get_obj_val(lp);
x1=glp_get_col_prim(lp,1);
x2=glp_get_col_prim(lp,2);
printf(“z=%g;x1=%g;x2=%g\n”,z,x1,x2);
/*内务管理*/
glp_删除_prob(lp);
glp_free_env();
});
系统(“暂停”);
}

您正在从每个线程内部调用
glp\u free\u env
,而库仍在其他线程中积极工作。那不好用--你在努力工作,把地毯从线下拽出来


相反,只有在所有线程完成计算(加入它们)后才调用它。对于这个简单的示例,您可能完全可以跳过清理步骤。

我发现了问题所在。问题在于GLPK源代码,有两个例程不可重传,导致了一些大问题。此处记录了这一点:。也有一个修复,但它需要重建。请注意,这仅适用于GLPK的4.50版本,而较旧、较新版本的布局略有不同


虽然Ben完全正确,但对库进行此更改可以解决所有问题,并允许您释放循环内的环境。

它以何种方式失败?我获得访问冲突:例如:OOT.exe中0x00007FFC44FB1D57(glpk_4_52.dll)处的未处理异常:0xC000005:访问冲突读取位置0xFFFFFFFFFFFF。但这是不可预测的,编译器并不总是在同一个位置中断。请使用调试器。检查是否有任何指针变量最终为空。似乎没有任何变量被空,这是非常不可预测的。例如,如果我降低迭代次数,有时代码会顺利通过。有时在第一对夫妇等之后。。。错误并不总是发生在同一个地方。看起来线程互相干扰。谢谢,这实际上解决了我的大部分问题。到目前为止,它让我意识到glpk似乎并没有运行在多个内核中。我的四核在迭代过程中保持稳定的25%。你认为如果我创建一个对象,并在其中执行优化过程,为每个迭代创建单独的对象,它会解决这个问题吗?还是glpk dll有问题?