Re: glp_intopt runs forever (related to Dusan Plavak's issue)

Dušan Plavák <[email protected]>
Newsgroups gmane.comp.gnu.glpk
Message-ID <CAPAgOKUU5MEvp5BZ0yj=Q4Hj=n7zfOSN9NM2z=u6BYetHgAyEg@mail.gmail.com>
Hi,

the test code is the same as Rafael posted. I am including it in attachment.

You should be able to compile it with:

g++ main.cpp -std=gnu++11 -lglpk


On Mon, Jun 12, 2017 at 12:05 PM, Chris Matrakidis <[email protected]>
wrote:

> Hi Dusan,
>
> > we found out that the looping forever on this example manifests on the
> > version 4.59 onward i.e. with 4.58 it still ran successfully.
>
> This seems more reasonable, but am still curious. Can you share the
> test code? I have here several intermediate versions between 4.58 and
> 4.59 and I would like to isolate the change responsible for this.
>
> Best Regards,
>
> Chris Matrakidis
>



-- 
S pozdravom Dušan Plavák

_______________________________________________
Help-glpk mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/help-glpk
main.cpp (text/x-c++src, 4.6 KB)
#include <iostream>
#include <vector>
#include <glpk.h>

using namespace std;

vector<double> solveSimplex() {
	vector<double> mins;
	vector<double> maxs;
	vector<double> i_mins;
	vector<double> i_maxs;
	vector<int> signs;
	vector<double> objectives;
	vector<vector<double> > left_parts;

	// here is hardcoded the problem definition
	left_parts = {
		{1.04909999999999992,5.07731250000000056,0.17905000000000001,2.54800000000000004,9.30000000000799965,0,0,0,0},
		{0.06509999999999999,0.68006249999999990,0.02325000000000000,0.74400000000000011,9.30000000000000071,0,0,0,0},
		{0.00820000000000000,3.52856250000000005,0.10291000000000000,0.36899999999999999,0.00000000000400000,0,0,0,0},
		{0.97580000000000000,0.86868750000000006,0.05289000000000000,1.43499999999999983,0.00000000000400000,0,0,0,0},
		{1,18.75000000000000000,1,10,1,0,0,0,0},{1.04909999999999992,5.07731250000000056,0.17905000000000001,2.54800000000000004,9.30000000000799965,1,0,0,0},
		{1.04909999999999992,5.07731250000000056,0.17905000000000001,2.54800000000000004,9.30000000000799965,-1,0,0,0},
		{0.06509999999999999,0.68006249999999990,0.02325000000000000,0.74400000000000011,9.30000000000000071,0,1,0,0},
		{0.06509999999999999,0.68006249999999990,0.02325000000000000,0.74400000000000011,9.30000000000000071,0,-1,0,0},
		{0.00820000000000000,3.52856250000000005,0.10291000000000000,0.36899999999999999,0.00000000000400000,0,0,1,0},
		{0.00820000000000000,3.52856250000000005,0.10291000000000000,0.36899999999999999,0.00000000000400000,0,0,-1,0},
		{0.97580000000000000,0.86868750000000006,0.05289000000000000,1.43499999999999983,0.00000000000400000,0,0,0,1},
		{0.97580000000000000,0.86868750000000006,0.05289000000000000,1.43499999999999983,0.00000000000400000,0,0,0,-1}
	};
	mins = {-80000,-32000,-16000,-32000,0,400,400,160,160,80,80,160,160};
	maxs = {80000,32000,16000,32000,800,400,400,160,160,80,80,160,160};
	i_mins = {100,8,2,4,4};
	i_maxs = {400,16,400,20,30};
	signs = {0,0,0,0,1,-1,1,-1,1,-1,1,-1,1};
	objectives = {0,0,0,0,0,6,6,6,6};

	glp_prob *lp;
	int *ia = NULL;
	int *ja = NULL;
	double *ar = NULL;
	vector<double> results;

	lp = glp_create_prob();
	glp_set_prob_name(lp, "amounts");
	glp_set_obj_dir(lp, GLP_MIN);


	glp_add_rows(lp, left_parts.size());

	for (unsigned int i = 0; i < left_parts.size(); i++)
	{
		if (signs[i] == 0)
		{

			glp_set_row_bnds(lp, i + 1, GLP_DB, mins[i], maxs[i]);
		}

		if (signs[i] == -1)
		{

			glp_set_row_bnds(lp, i + 1, GLP_LO, mins[i], mins[i]);
		}

		if (signs[i] == 1)
		{

			glp_set_row_bnds(lp, i + 1, GLP_UP, maxs[i], maxs[i]);
		}
	}


	glp_add_cols(lp, objectives.size());
	for (unsigned int i = 0; i < objectives.size(); i++)
	{
		if (i < objectives.size() - 4)
		{

			glp_set_obj_coef(lp, i + 1, 0.0);
			if (i_mins[i] != i_maxs[i])
			{

				glp_set_col_bnds(lp, i + 1, GLP_DB, i_mins[i], i_maxs[i]);
			}
			else
			{

				glp_set_col_bnds(lp, i + 1, GLP_FX, i_mins[i], i_mins[i]);
			}

			glp_set_col_kind(lp, i + 1, GLP_IV);
		}
		else
		{
			int tot = maxs.size() - 1;
			glp_set_obj_coef(lp, i + 1, 2/maxs[tot-6] * objectives[i]);
			glp_set_obj_coef(lp, i + 2, 1/maxs[tot-4] * objectives[i + 1]);
			glp_set_obj_coef(lp, i + 3, 1/maxs[tot-2] * objectives[i + 2]);
			glp_set_obj_coef(lp, i + 4, 1/maxs[tot] * objectives[i + 3]);


			glp_set_col_bnds(lp, i + 1, GLP_LO, 0.0, 0.0);
			glp_set_col_bnds(lp, i + 2, GLP_LO, 0.0, 0.0);
			glp_set_col_bnds(lp, i + 3, GLP_LO, 0.0, 0.0);
			glp_set_col_bnds(lp, i + 4, GLP_LO, 0.0, 0.0);
			break;
		}
	}

	long long fields_c;

	fields_c = left_parts.size() * objectives.size();


	ia = (int *) malloc((fields_c + 1) * sizeof(int));
	ja = (int *) malloc((fields_c + 1) * sizeof(int));
	ar = (double *) malloc((fields_c + 1) * sizeof(double));

	if (ia == NULL || ja == NULL || ar == NULL)
	{
		free(ia);
		free(ja);
		free(ar);
	}

	long long counter = 1;
	for (unsigned int i = 0; i < left_parts.size(); i++)
	{
		for (unsigned int j = 0; j < objectives.size(); j++)
		{
			if (left_parts[i][j] != 0)
			{
				ia[counter] = i+1;
				ja[counter] = j+1;
				ar[counter] = left_parts[i][j];
				counter++;
			}

		}
	}


	glp_load_matrix(lp, counter-1, ia, ja, ar);
	glp_write_lp(lp, 0, "problem.lp");

	glp_iocp parm;
	glp_init_iocp(&parm);
	parm.msg_lev = GLP_MSG_OFF;
	parm.presolve = GLP_ON;

	// upon calling glp_intopt here, the program loops forever
	if (glp_intopt(lp, &parm) == 0)
	{
		for (unsigned int i = 0; i < objectives.size() - 4; i++)
		{
			results.push_back(glp_mip_col_val(lp, i + 1));
		}
		glp_write_sol(lp, "solution.sol");
	}

	glp_delete_prob(lp);

	free(ia);
	free(ja);
	free(ar);

	return results;
}

int main() {
	solveSimplex();

	return 0;
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.