Dmitri,

One unanswered question is to equalize the bin weights as much as possible
subject to tighest packing. Below is a solution.  There's probably a more
elegant formulation.

In any event, you now have solutions to special cases of your more general
multiobjective problem.

 -- minimize maximum weight of any bin
 -- tightest packing subject to maximum weight on any bin
 -- equalize bin weights subject to tightest packing

Jeff

set BINS := 1..3;
set ITEMS := 1..8;

param weight{ITEMS};
param M := 1000;

var wmax >= 0;
var wmin >= 0;
var x{i in ITEMS, b in BINS} binary;
var Imin{b in BINS};
var Imax{b in BINS};

s.t. A{i in ITEMS}: sum{b in BINS} x[i,b] = 1;
s.t. B{b in BINS}: sum{i in ITEMS} weight[i]*x[i,b] <= wmax;
s.t. C{b in BINS}: sum{i in ITEMS} weight[i]*x[i,b] >= wmin;
s.t. D{b in BINS, i in ITEMS}: Imin[b] <= i*x[i,b] + M*(1-x[i,b]);
s.t. E{b in BINS, i in ITEMS}: Imax[b] >= i*x[i,b];
s.t. F{b in BINS, c in BINS : b < c}: Imax[b] <= Imin[c];

minimize obj: wmax-wmin;

solve;

for {b in BINS}: {
    printf "Bin %d: total weight %d\n", b, sum{i in ITEMS} weight[i]*x[i,b];
    printf {i in ITEMS : x[i,b] = 1}: "     item %d (%d)\n", i, weight[i];
    printf "\n";
}

data;

param weight :=
    1    40
    2    60
    3    30
    4    70
    5    50
    6    40
    7    15
    8    25 ;

end;

Bin 1: total weight 100
     item 1 (40)
     item 2 (60)

Bin 2: total weight 100
     item 3 (30)
     item 4 (70)

Bin 3: total weight 130
     item 5 (50)
     item 6 (40)
     item 7 (15)
     item 8 (25)




On Sun, Jan 27, 2013 at 2:57 PM, Dmitri Goutnik <[email protected]> wrote:

> Jeff,
>
> Wow, thanks a lot! That is exactly what  I was looking for.
>
> Best regards,
> Dmitri
>
> On 27/01/2013, at 14:17, Jeffrey Kantor <[email protected]> wrote:
>
> Dmitri,
>
> This is a problem with two objectives which, depending on problem data,
> may conflict with each other. So the best we can do is to find tradeoffs
> between the conflicting objectives. Here's one solution where alpha is a
> parameter expressing the relative significance of the two objectives.
>
> set BINS := 1..3;
> set ITEMS := 1..8;
>
> param weight{ITEMS};
>
> var wmax >= 0;
> var x{i in ITEMS, b in BINS} binary;
>
> s.t. A{i in ITEMS}: sum{b in BINS} x[i,b] = 1;
> s.t. B{b in BINS}: sum{i in ITEMS} weight[i]*x[i,b] <= wmax;
>
> minimize obj: wmax + alpha*sum{b in BINS, i in ITEMS}
> (card(BINS)-b)*i*x[i,b];
>
> solve;
>
> for {b in BINS}: {
>     printf "Bin %d: total weight %d\n", b, sum{i in ITEMS}
> weight[i]*x[i,b];
>     printf {i in ITEMS : x[i,b] = 1}: "     item %d (%d)\n", i, weight[i];
>     printf "\n";
> }
>
> data;
>
> param weight :=
>     1    40
>     2    60
>     3    30
>     4    70
>     5    50
>     6    40
>     7    15
>     8    25 ;
>
> end;
>
> Bin 1: total weight 110
>      item 1 (40)
>      item 4 (70)
>
> Bin 2: total weight 110
>      item 2 (60)
>      item 5 (50)
>
> Bin 3: total weight 110
>      item 3 (30)
>      item 6 (40)
>      item 7 (15)
>      item 8 (25)
>
>
> Another solution would be to solve the problem in two phases.  The first
> phase determines the minimum weight for each bin (for this data, 110), a
> second phase that seeks the tightest packing subject to a bound on bin
> weight that's greater than or equal to the minimum possible weight. Here's
> a solution to that problem where a bound of 130 is used:
>
> set BINS := 1..3;
> set ITEMS := 1..8;
>
> param weight{ITEMS};
> param wmax;
>
> var x{i in ITEMS, b in BINS} binary;
>
> s.t. A{i in ITEMS}: sum{b in BINS} x[i,b] = 1;
> s.t. B{b in BINS}: sum{i in ITEMS} weight[i]*x[i,b] <= wmax;
>
> minimize obj: sum{b in BINS, i in ITEMS} (card(BINS)-b)*i*x[i,b];
>
> solve;
>
> for {b in BINS}: {
>     printf "Bin %d: total weight %d\n", b, sum{i in ITEMS}
> weight[i]*x[i,b];
>     printf {i in ITEMS : x[i,b] = 1}: "     item %d (%d)\n", i, weight[i];
>     printf "\n";
> }
>
> data;
>
> param wmax := 130;
>
> param weight :=
>     1    40
>     2    60
>     3    30
>     4    70
>     5    50
>     6    40
>     7    15
>     8    25 ;
>
> end;
>
>
> Bin 1: total weight 100
>      item 1 (40)
>      item 2 (60)
>
> Bin 2: total weight 100
>      item 3 (30)
>      item 4 (70)
>
> Bin 3: total weight 130
>      item 5 (50)
>      item 6 (40)
>      item 7 (15)
>      item 8 (25)
>
>
>
> On Sun, Jan 27, 2013 at 1:55 PM, Dmitri Goutnik <[email protected]> wrote:
>
>> Hi Jeff,
>>
>> Thanks, yes that would be preferable packing. My goal is to pack items as
>> "tightly" as possible while preserving even (within some predefined margin)
>> weight distribution between bins.
>>
>> Best regards,
>> Dmitri
>>
>> On 27/01/2013, at 13:40, Jeffrey Kantor <[email protected]> wrote:
>>
>> Hi Dmitri,
>>
>> This could be done through the objective function. But before going
>> there, I'm wondering a bit
>> about the solution you're showing for your example.  Wouldn't you want
>> move item 7 from Bin 3 to Bin 2 to meet your primary objective?
>>
>> Jeff
>>
>>
>> On Sun, Jan 27, 2013 at 1:34 PM, Dmitri Goutnik <[email protected]> wrote:
>>
>>> Hello everyone,
>>>
>>> I modified bpp.mod to pack items in predefined number of bins of
>>> unlimited capacity so that weight is (approximately) evenly distributed
>>> between bins. In addition to weight, each item has an "order" or
>>> "position". Is there a way to write an additional model constraint so that
>>> items are preferably packed in compact order, e.g. items with sequential
>>> positions should go to the the same container? For example, for this
>>> solution:
>>>
>>> Bin 1: total weight 110
>>>         item 1 (40)
>>>         item 4 (70) <--
>>>
>>> Bin 2: total weight 90
>>>         item 5 (50)
>>>         item 6 (40)
>>>
>>> Bin 3: total weight 130
>>>         item 2 (60) -->
>>>         item 3 (30)
>>>         item 7 (15)
>>>         item 8 (25)
>>>
>>> is there a way to add such constraint so item 2 would preferably be
>>> packed to bin 1?
>>>
>>> Thanks,
>>> Dmitri
>>> _______________________________________________
>>> Help-glpk mailing list
>>> [email protected]
>>> https://lists.gnu.org/mailman/listinfo/help-glpk
>>>
>>
>>
>>
>
>
_______________________________________________
Help-glpk mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/help-glpk

Reply via email to