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
#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;
}
_______________________________________________
Help-glpk mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/help-glpk

Reply via email to