简体   繁体   中英

PULP Optimization with unique parts only counting towards objective function?

I'm hoping someone can get me started in the right direction. I have a pandas dataframe like this:

在此处输入图片说明

The columns are machines, and the rows are groups. 1 means that machine has that group, 0 means it does not. The real dataframe is much larger with more overlap in the groups.

What I need to be able to do is specify a limit on the number of machine columns chosen, while maximizing the number of unique groups selected. So in example: what 3 machines could I select that would cover the most unique groups? There's no penalty for selecting a group twice, but it doesn't help at all either.

I've tried doing this with python's PuLP package, but I'm struggling to write an objective function that only rewards unique group contributions (it basically tries to maximize the total number of groups, not the unique).

I'm real stuck here, any help is appreciated!

I think it is always useful to first write down a mathematical model. Something like:

在此处输入图片说明

This model can now easily be transcribed in PuLP. You can relax y to be continuous between 0 and 1 (this may help some solvers). The results for K=3 should look like:

----     34 VARIABLE x.L  machine on/off

A 1.000,    C 1.000,    D 1.000


----     34 VARIABLE y.L  groups covered

group1 1.000,    group2 1.000,    group3 1.000,    group4 1.000


----     34 VARIABLE z.L     =        4.000  number of groups covered

Vary K to study the trade-offs (you could make some nice plots of K vs z ).

Note: this problem is a little bit like a set covering problem, and it solves very fast. With 200 groups, 100 machines, K=20, random data in the data frame this solves in 2.5 seconds (the MIP model has 201 equations and 300 binary variables):

----     27 VARIABLE x.L  machine on/off

m1   1.000,    m5   1.000,    m10  1.000,    m14  1.000,    m17  1.000,    m21  1.000,    m28  1.000,    m29  1.000
m36  1.000,    m41  1.000,    m50  1.000,    m52  1.000,    m79  1.000,    m81  1.000,    m82  1.000,    m83  1.000
m85  1.000,    m92  1.000,    m93  1.000,    m100 1.000


----     27 VARIABLE y.L  groups covered

group1   1.000,    group2   1.000,    group3   1.000,    group4   1.000,    group5   1.000,    group6   1.000
group7   1.000,    group8   1.000,    group10  1.000,    group11  1.000,    group12  1.000,    group13  1.000
group14  1.000,    group15  1.000,    group16  1.000,    group18  1.000,    group19  1.000,    group20  1.000
group21  1.000,    group22  1.000,    group23  1.000,    group25  1.000,    group26  1.000,    group28  1.000
group29  1.000,    group31  1.000,    group32  1.000,    group33  1.000,    group34  1.000,    group35  1.000
group37  1.000,    group38  1.000,    group39  1.000,    group40  1.000,    group41  1.000,    group42  1.000
group43  1.000,    group44  1.000,    group45  1.000,    group46  1.000,    group47  1.000,    group48  1.000
group49  1.000,    group50  1.000,    group51  1.000,    group52  1.000,    group53  1.000,    group54  1.000
group55  1.000,    group56  1.000,    group57  1.000,    group58  1.000,    group59  1.000,    group60  1.000
group62  1.000,    group63  1.000,    group64  1.000,    group65  1.000,    group67  1.000,    group68  1.000
group69  1.000,    group70  1.000,    group71  1.000,    group74  1.000,    group75  1.000,    group76  1.000
group77  1.000,    group78  1.000,    group79  1.000,    group80  1.000,    group81  1.000,    group82  1.000
group83  1.000,    group84  1.000,    group85  1.000,    group86  1.000,    group87  1.000,    group88  1.000
group89  1.000,    group90  1.000,    group91  1.000,    group92  1.000,    group94  1.000,    group95  1.000
group96  1.000,    group97  1.000,    group98  1.000,    group99  1.000,    group100 1.000,    group102 1.000
group103 1.000,    group104 1.000,    group105 1.000,    group106 1.000,    group107 1.000,    group108 1.000
group109 1.000,    group110 1.000,    group111 1.000,    group112 1.000,    group113 1.000,    group114 1.000
group115 1.000,    group116 1.000,    group117 1.000,    group118 1.000,    group119 1.000,    group120 1.000
group121 1.000,    group122 1.000,    group123 1.000,    group124 1.000,    group126 1.000,    group127 1.000
group128 1.000,    group129 1.000,    group130 1.000,    group131 1.000,    group132 1.000,    group133 1.000
group134 1.000,    group135 1.000,    group136 1.000,    group137 1.000,    group138 1.000,    group139 1.000
group140 1.000,    group141 1.000,    group142 1.000,    group143 1.000,    group144 1.000,    group146 1.000
group147 1.000,    group148 1.000,    group150 1.000,    group151 1.000,    group152 1.000,    group153 1.000
group155 1.000,    group156 1.000,    group157 1.000,    group158 1.000,    group159 1.000,    group160 1.000
group161 1.000,    group162 1.000,    group163 1.000,    group164 1.000,    group165 1.000,    group166 1.000
group167 1.000,    group168 1.000,    group169 1.000,    group170 1.000,    group171 1.000,    group173 1.000
group176 1.000,    group177 1.000,    group178 1.000,    group179 1.000,    group180 1.000,    group181 1.000
group182 1.000,    group183 1.000,    group186 1.000,    group187 1.000,    group188 1.000,    group189 1.000
group190 1.000,    group191 1.000,    group192 1.000,    group194 1.000,    group196 1.000,    group197 1.000
group198 1.000,    group199 1.000,    group200 1.000


----     27 VARIABLE z.L        =      177.000  number of groups covered

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM