mirror of
https://github.com/larstvei/SMT-for-IN3070.git
synced 2024-11-26 11:38:31 +00:00
Optimize for capacities
This commit is contained in:
parent
4eb851b77a
commit
05f32f6364
@ -25,12 +25,12 @@ administration:
|
|||||||
Mine mattekunnskaper er tydeligvis fraværende. Jeg klarer ikke finne en
|
Mine mattekunnskaper er tydeligvis fraværende. Jeg klarer ikke finne en
|
||||||
fornuftig løsning på dette:
|
fornuftig løsning på dette:
|
||||||
|
|
||||||
| A: | 160 |
|
| A | 160 |
|
||||||
| B: | 150 |
|
| B | 150 |
|
||||||
| C: | 110 |
|
| C | 110 |
|
||||||
| D: | 60 |
|
| D | 60 |
|
||||||
| E: | 60 |
|
| E | 60 |
|
||||||
| F: | 30 |
|
| F | 30 |
|
||||||
|
|
||||||
Det er snakk om sensur i inf1300 med 283 besvarelser. D og E kan ikke rette
|
Det er snakk om sensur i inf1300 med 283 besvarelser. D og E kan ikke rette
|
||||||
mot hverandre. De bør helst rette mot B eller C.
|
mot hverandre. De bør helst rette mot B eller C.
|
||||||
@ -499,15 +499,52 @@ cry for help.
|
|||||||
with correcting $40$ and /actually/ willing to correct $52$. Therefore, we
|
with correcting $40$ and /actually/ willing to correct $52$. Therefore, we
|
||||||
can try to add some slack to the capacity.
|
can try to add some slack to the capacity.
|
||||||
|
|
||||||
|
In reality, the numbers from the original email were
|
||||||
|
|
||||||
|
| A | 158 |
|
||||||
|
| B | 150 |
|
||||||
|
| C | 108 |
|
||||||
|
| D | 60 |
|
||||||
|
| E | 60 |
|
||||||
|
| F | 15 |
|
||||||
|
|
||||||
|
But when we add them up, it turns out that they only have capacity to
|
||||||
|
correct $551$ exams (and we need $2*N = 566$).
|
||||||
|
|
||||||
|
We create a new instance with the original values.
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :tangle committees.py
|
||||||
|
def original_instance():
|
||||||
|
N = 283
|
||||||
|
# A B C D E F
|
||||||
|
C = [158, 150, 108, 60, 60, 15]
|
||||||
|
S = {3 : {1, 2}, 4 : {1, 2}}
|
||||||
|
A = {frozenset([3, 4])}
|
||||||
|
return (N, C, S, A)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
Now we can compute a "badness"-score (or weight) for the examiners
|
||||||
|
capacities, rather than just stating we cannot surpass their capacity.
|
||||||
|
|
||||||
#+BEGIN_SRC python :tangle committees.py
|
#+BEGIN_SRC python :tangle committees.py
|
||||||
def capacity_slack(comms, i, C):
|
def capacity_slack(comms, i, C):
|
||||||
a = sum(comms[c] for c in comms if i in c)
|
a = sum(comms[c] for c in comms if i in c)
|
||||||
return If(a > C[i], a - C[i], C[i] - a)
|
return If(a > C[i], a - C[i], C[i] - a)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
For the total weight of the capacities, we try to just sum the weights for
|
||||||
|
each examiner.
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :tangle committees.py
|
||||||
def capacity_weight(comms, C):
|
def capacity_weight(comms, C):
|
||||||
return sum(capacity_slack(comms, i, C) for i in range(len(C)))
|
return sum(capacity_slack(comms, i, C) for i in range(len(C)))
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
|
We can now add all of the optimization objectives, stating that it most
|
||||||
|
important to respect the capacities of the examiners, then prefer a small
|
||||||
|
number of committees, and lastly the /should/ requirement from the previous
|
||||||
|
section.
|
||||||
|
|
||||||
#+BEGIN_SRC python :tangle committees.py
|
#+BEGIN_SRC python :tangle committees.py
|
||||||
def optimize_instance(instance):
|
def optimize_instance(instance):
|
||||||
N, C, S, A = instance
|
N, C, S, A = instance
|
||||||
@ -527,6 +564,40 @@ cry for help.
|
|||||||
return o.model()
|
return o.model()
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
|
We now get something like:
|
||||||
|
|
||||||
|
#+BEGIN_EXAMPLE
|
||||||
|
0: 158/158
|
||||||
|
1: 158/150
|
||||||
|
2: 110/108
|
||||||
|
3: 60/60
|
||||||
|
4: 65/60
|
||||||
|
5: 15/15
|
||||||
|
|
||||||
|
0, 1: 158
|
||||||
|
2, 3: 45
|
||||||
|
2, 4: 65
|
||||||
|
3, 5: 15
|
||||||
|
#+END_EXAMPLE
|
||||||
|
|
||||||
|
If we were to prioritize the /should/ requirement over minimizing the number
|
||||||
|
of committees, then we would get something like:
|
||||||
|
|
||||||
|
#+BEGIN_EXAMPLE
|
||||||
|
0: 158/158
|
||||||
|
1: 151/150
|
||||||
|
2: 109/108
|
||||||
|
3: 64/60
|
||||||
|
4: 61/60
|
||||||
|
5: 23/15
|
||||||
|
|
||||||
|
0, 1: 26
|
||||||
|
0, 2: 109
|
||||||
|
0, 5: 23
|
||||||
|
1, 3: 64
|
||||||
|
1, 4: 61
|
||||||
|
#+END_EXAMPLE
|
||||||
|
|
||||||
* COMMENT Local variables
|
* COMMENT Local variables
|
||||||
# Local Variables:
|
# Local Variables:
|
||||||
# eval: (add-hook 'after-save-hook 'org-html-export-to-html nil t)
|
# eval: (add-hook 'after-save-hook 'org-html-export-to-html nil t)
|
||||||
|
Loading…
Reference in New Issue
Block a user