lemon-project-template-glpk

annotate deps/glpk/examples/t1.cs @ 9:33de93886c88

Import GLPK 4.47
author Alpar Juttner <alpar@cs.elte.hu>
date Sun, 06 Nov 2011 20:59:10 +0100
parents
children
rev   line source
alpar@9 1 /*Find the minimum value which satisfies the linear inequality:
alpar@9 2 a*x + b*y >= 1 {a,b,x,y Integers} {a,b > 0} {a,b entered on command line}
alpar@9 3
alpar@9 4 Nigel_Galloway@operamail.com
alpar@9 5 February 2008
alpar@9 6 */
alpar@9 7 using System;
alpar@9 8 using System.Runtime.InteropServices;
alpar@9 9
alpar@9 10 unsafe class GLPK{
alpar@9 11 double *lp;
alpar@9 12 public int a;
alpar@9 13 public int b;
alpar@9 14
alpar@9 15 const string glpkLibrary = "libglpk.so";
alpar@9 16 readonly int GLP_FR = 1;
alpar@9 17 readonly int GLP_IV = 2;
alpar@9 18 readonly int GLP_DB = 4;
alpar@9 19 struct ConstraintMatrix{
alpar@9 20 public fixed int ia[3];
alpar@9 21 public fixed int ja[3];
alpar@9 22 public fixed double ar[3];
alpar@9 23 }
alpar@9 24 [DllImport(glpkLibrary, SetLastError=true)]
alpar@9 25 static extern double* glp_create_prob();
alpar@9 26 [DllImport(glpkLibrary, SetLastError=true)]
alpar@9 27 static extern void glp_add_rows(double* lp, int rows);
alpar@9 28 [DllImport(glpkLibrary, SetLastError=true)]
alpar@9 29 static extern void glp_add_cols(double* lp, int cols);
alpar@9 30 [DllImport(glpkLibrary, SetLastError=true)]
alpar@9 31 static extern void glp_set_col_bnds(double* lp, int col, int bound_type, double lower_bound, double upper_bound);
alpar@9 32 [DllImport(glpkLibrary, SetLastError=true)]
alpar@9 33 static extern void glp_set_col_kind(double* lp, int col, int kind);
alpar@9 34 [DllImport(glpkLibrary, SetLastError=true)]
alpar@9 35 static extern void glp_load_matrix(double* lp, int elements, int* ia, int* ja, double* ar);
alpar@9 36 public GLPK(int a, int b){
alpar@9 37 this.a = a;
alpar@9 38 this.b = b;
alpar@9 39 lp = glp_create_prob();
alpar@9 40 //Col 1 is x, Col 2 is y
alpar@9 41 glp_add_rows(lp, 1);
alpar@9 42 glp_add_cols(lp, 2);
alpar@9 43 glp_set_col_bnds(lp, 1, GLP_FR, 0.0, 0.0);
alpar@9 44 glp_set_col_bnds(lp, 2, GLP_FR, 0.0, 0.0);
alpar@9 45 glp_set_col_kind(lp, 1, GLP_IV);
alpar@9 46 glp_set_col_kind(lp, 2, GLP_IV);
alpar@9 47 //Row 1 is a*x + b*y
alpar@9 48 ConstraintMatrix CM = new ConstraintMatrix();
alpar@9 49 CM.ia[1]=1; CM.ja[1]=1; CM.ar[1]=a;
alpar@9 50 CM.ia[2]=1; CM.ja[2]=2; CM.ar[2]=b;
alpar@9 51 glp_load_matrix(lp, 2, CM.ia, CM.ja, CM.ar);
alpar@9 52 Console.WriteLine("Hello Nigel");
alpar@9 53 }
alpar@9 54
alpar@9 55 [DllImport(glpkLibrary, SetLastError=true)]
alpar@9 56 static extern void glp_set_row_bnds(double* lp, int row, int bound_type, double lower_bound, double upper_bound);
alpar@9 57 [DllImport(glpkLibrary, SetLastError=true)]
alpar@9 58 static extern void glp_simplex(double* lp, void* options);
alpar@9 59 [DllImport(glpkLibrary, SetLastError=true)]
alpar@9 60 static extern void glp_intopt(double* lp, void* options);
alpar@9 61 [DllImport(glpkLibrary, SetLastError=true)]
alpar@9 62 static extern double glp_mip_col_val(double* lp, int col);
alpar@9 63 public int betterGuess(int upper_bound){
alpar@9 64 //Find a new guess less than the old guess: 1 <= (a*x + b*y) <= (old guess - 1)
alpar@9 65 glp_set_row_bnds(lp, 1, GLP_DB, 1.0, ((double)upper_bound)-0.5);
alpar@9 66 glp_simplex(lp, null);
alpar@9 67 glp_intopt(lp, null);
alpar@9 68 int x = (int)glp_mip_col_val(lp, 1);
alpar@9 69 int y = (int)glp_mip_col_val(lp, 2);
alpar@9 70 int nextGuess = a*x + b*y;
alpar@9 71 Console.WriteLine("x = {0}, y = {1}, a*x + b*y = {2}",x,y,nextGuess);
alpar@9 72 return nextGuess;
alpar@9 73 }
alpar@9 74
alpar@9 75 [DllImport(glpkLibrary, SetLastError=true)]
alpar@9 76 static extern void glp_delete_prob(double* lp);
alpar@9 77 ~GLPK(){
alpar@9 78 glp_delete_prob(lp);
alpar@9 79 Console.WriteLine("Goodbye Nigel");
alpar@9 80 }
alpar@9 81
alpar@9 82 }
alpar@9 83
alpar@9 84 class test{
alpar@9 85 static bool isMinimum(int a, int b, int guess){
alpar@9 86 Console.WriteLine("Trying {0}",guess);
alpar@9 87 if (a%guess > 0) return false;
alpar@9 88 if (b%guess > 0) return false;
alpar@9 89 Console.WriteLine("Solution is {0}",guess);
alpar@9 90 return true;
alpar@9 91 }
alpar@9 92
alpar@9 93 public static void Main(string[] args){
alpar@9 94 Console.WriteLine("a = {0}, b = {1}",args[0], args[1]);
alpar@9 95 GLPK lp = new GLPK(Int32.Parse(args[0]),Int32.Parse(args[1]));
alpar@9 96 int guess = (lp.a > lp.b) ? lp.b : lp.a;
alpar@9 97 while (!isMinimum(lp.a,lp.b,guess)) guess = lp.betterGuess(guess);
alpar@9 98 }
alpar@9 99 }