Saturday, February 13, 2010

dotA Itemkauf Optimierung

Mein Mitbewohner ließ nicht locker,
spielte täglich dieses dotA.

Nach jedem Itemkauf fragte er sich,
ob sich das nicht besser machen lies.

Hier ein ZIMPL Skript zum optimieren,
bitte schreib es fertig, sonst ists zum genieren.

Flott sagt dir SCIP dann ganz korrekt,
wo du am besten dein Gold hinsteckst.




# zimpl model for optimizing buying dotA items
# copyright 2010: harald schilly
# license: CC-BY-NC-SA 3.0


# helden
set helden := { 1 to 5 };


# freie plätze zum einkaufen
param frei[helden] :=  <1> 6, <2> 4, <3> 4, <4> 2, <5> 6;


# welche items es gibt
set items := { 1 to 3} ;


# kosten pro item
param itemcost[items] := <1> 100, <2> 50, <3> 63;


# menge der fähigkeiten die jeder item pushen kann
set abilities := { 1 to 4 };


# was jeweils besser wird
param itempower[abilities * items] := 
  |   1,  2,   3 |
|1|   5,  1,   0 |
|2|   0,  1,   4 |
|3|   1,  1,   8 |
|4|   1,  4,  10 |;


# basiswert der zum maximum einer spalte addiert wird
# notwendig in der zielfunktion für die gewichtung
param baseval := 1;


# gesamtbuget an gold
param budget := 500;


# die variablenmatrix
var buy[helden * items] integer >= 0 <= 6;


# man kann nur so viel kaufen wie geld da ist
subto costs:
  sum <h,i> in helden * items: 
    buy[h,i] * itemcost[i] <= budget;


# man kann nur so viel kaufen wie der
# held noch freie plätze hat
subto maxperheld: 
  forall in helden:
    sum in items: buy[h, i] <= frei[h];


# ich will die fähigkeiten meines teams maximieren
maximize obj: sum <h,i,a> in helden * items * abilities:
  (itempower[a, i] / (baseval + max <a> in abilities: itempower[a,i])) * buy[h, i];




No comments:

Post a Comment