[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Help-glpk] Invert a set-of-sets with mutually exclusive elements
From: |
Michael Hennebry |
Subject: |
Re: [Help-glpk] Invert a set-of-sets with mutually exclusive elements |
Date: |
Fri, 27 May 2016 01:54:03 -0500 (CDT) |
User-agent: |
Alpine 1.00 (DEB 882 2007-12-20) |
I think the following will do approximately what OP wants.
param sn0 integer ;
param names0{ 0..sn0-1 } symbolic ;
set breaks := setof{ j in 0..sn0-1 : "break" == names0[j] } j ;
set names := setof { j in 0..sn0-1 : names0[j] != "break" } names0[j] ;
param name2index0{ name in names } :=
min { j in 0..sn0-1 : names0[j]==name } j ;
param name2subsetindex{ name in names } :=
sum { j in breaks : name2index0[name]< j } 1 ;
param sizeofbreaks := sum { j in breaks } 1 ;
set index2subset{ j in 0..sizeofbreaks } :=
setof { name in names : j == name2subsetindex[name] } name ;
set name2subset{ name in names } := index2subset[name2subsetindex[name]] ;
var x >= 0 ;
minimize z : x ;
display names0 ;
display sizeofbreaks ;
display names ;
display name2subsetindex ;
display name2subset ;
data ;
param sn0 := 9 ;
param names0 default break ,
0 fred
1 greg
2 break
3 hank
5 ivan
;
end ;
I know of no convenient way to remove all the explicit indices.
Building up names0 from an 8 x whatever array would eliminate most of them.
Also, replacing the break's with subset
indices might result in a tidier model.
--
Michael address@hidden
"Sorry but your password must contain an uppercase letter, a number,
a haiku, a gang sign, a heiroglyph, and the blood of a virgin."
-- someeecards