[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Help-glpk] How to code restriction on number of variables > 0
From: |
Heinrich Schuchardt |
Subject: |
Re: [Help-glpk] How to code restriction on number of variables > 0 |
Date: |
Thu, 20 Feb 2014 14:46:49 +0100 |
Hello Wouter,
I was thinking of something like:
param max_ingredients := 5; # maximum number of ingredients per product/element
param M := 1; # maximum value for concentrations
var concentration {Product, Ingredients, Elements}, >= 0;
var x{Product, Ingredients, Elements}, binary;
s.t. c1{p in Products, e in Elements} :
sum{i in Ingredients} x[p,i,e] <= max_ingredients;
s.t. c2{p in Products, i in Ingredients, e in Elements} :
concentration[p,i,e] <= M * x[p,i,e];
Best regards
Heinrich Schuchardt
http://www.xypron.de
> Gesendet: Donnerstag, 20. Februar 2014 um 14:05 Uhr
> Von: "Baake, Wouter" <address@hidden>
> An: "Heinrich Schuchardt" <address@hidden>
> Cc: "'address@hidden'" <address@hidden>
> Betreff: RE: [Help-glpk] How to code restriction on number of variables > 0
>
> Hi Heinrich,
>
> Thanks for your answer, but I'm having some trouble implementing it.
>
> My original model would look something like this:
> set Products;
> set Unit_operations;
> set Ingredients;
> set Elements;
>
> param cost {Products};
> param aim {Products};
> param concentration {Ingredients,Elements};
>
> var ingredient_used {Products, Unit_operations,Ingredients} >= 0;
>
> minimize total_cost: sum{p in Products,u in Unit_operations, i in
> Ingredients} cost[i] * ingredient_used [p,u,i];
> Subject to {p in Products, e in Elements}: sum {u in Unit_operations, i in
> Ingredients} (ingredient_used [p,u,i]*concentration[i,e]) = aim[p,e];
>
> To add the binary variable, I would then write this as:
> set Products;
> set Unit_operations;
> set Ingredients;
> set Elements;
>
> param cost {Products};
> param aim {Products};
> param concentration {Ingredients,Elements};
>
> var ingredient_used {Products, Unit_operations,Ingredients} >= 0;
> var ingredient_used_yes_no {Products, Unit_operations,Ingredients} binary;
>
> minimize total_cost: sum{p in Products,u in Unit_operations, i in
> Ingredients} cost[i] * ingredient_used [p,u,i];
>
> Subject to {p in Products, e in Elements}: sum {u in Unit_operations, i in
> Ingredients} (ingredient_used [p,u,i]*concentration[i,e]) = aim[p,e];
> Subject to {p in Products,u in Unit_operations,i in Ingredients :
> ingredient_used_yes_no[p,u,i]=0}: ingredient_used[p,u,i]=0;
>
>
> Unfortunately, I then get an error: "operand preceding = has invalid type"
> which I do not understand.
> You write "Add a constraint limiting the ingredient quantity to zero if the
> binary is" but my attempts to do this result in errors when I run glpsol. Do
> you have an example of how to write this constraint?
>
> Regards,
> Wouter
>
>
> -----Original Message-----
> From: Heinrich Schuchardt [mailto:address@hidden
> Sent: Thursday, February 20, 2014 12:37 PM
> To: Baake, Wouter
> Cc: Help Glpk
> Subject: Re: [Help-glpk] How to code restriction on number of variables > 0
>
> Hello Wouter,
>
> you can add a binary variable per ingredient.
>
> Add a constraint limiting the ingredient quantity to zero if the binary is 0.
>
> aim <= M *x;
>
> Choose M as small as possible.
>
> Add a constraint for the sum of the binaries.
>
> Best regards
>
> Heinrich Schuchardt
>
> http://www.xypron.de
>
>
> On 20.02.14 at 11:49, Baake, Wouter wrote:
>
> > Hi,
> >
> >
> >
> > I'm modelling a problem where I need to make several products with
> > different specifications. Each product undergoes several unit operations
> > where ingredients are added.
> >
> > var ingredient_used {Products, Unit_operations,Ingredients} >= 0;
> >
> >
> >
> > Each ingredient has a cost and the total cost is to be minimized:
> >
> > minimize total_cost: sum{p in Products,u in Unit_operations, i in
> > Ingredients} cost[i] * ingredient_used [p,u,i];
> >
> >
> >
> > Each ingredient consists of several elements in different concentrations.
> > Each of the products has an aim value for concentration of each of the
> > elements in the product:
> >
> > Subject to {p in Products, e in Elements}: sum {u in Unit_operations, i in
> > Ingredients} (ingredient_used [p,u,i]*concentration[i,e]) = aim[p,e];
> >
> >
> >
> > This problem I can model and solve, but I need to add some more constraints.
> >
> > One constraint is that there is a maximum number of ingredients that can be
> > kept in stock at a given unit operation. As an example, at the first unit
> > operation, I cannot keep more than 10 ingredients in stock, but the amount
> > per ingredient is unlimited.
> >
> >
> >
> > How could I translate this into a mathprog constraint?
> >
> >
> >
> > Regards,
> >
> > Wouter
> >
> >
> >
> >
> >
> > **********************************************************************
> >
> >
> >
> > This transmission is confidential and must not be used or disclosed by
> > anyone other than the intended recipient. Neither Tata Steel Europe Limited
> > nor any of its subsidiaries can accept any responsibility for any use or
> > misuse of the transmission by anyone.
> >
> >
> >
> > For address and company registration details of certain entities within the
> > Tata Steel Europe group of companies, please visit
> > http://www.tatasteeleurope.com/entities
> >
> >
> >
> > **********************************************************************
> >
> > _______________________________________________
> >
> > Help-glpk mailing list
> >
> > address@hidden
> >
> > https://lists.gnu.org/mailman/listinfo/help-glpk
>
> **********************************************************************
>
> This transmission is confidential and must not be used or disclosed by anyone
> other than the intended recipient. Neither Tata Steel Europe Limited nor any
> of its subsidiaries can accept any responsibility for any use or misuse of
> the transmission by anyone.
>
> For address and company registration details of certain entities within the
> Tata Steel Europe group of companies, please visit
> http://www.tatasteeleurope.com/entities
>
> **********************************************************************
>