Rekursive Produktion

Neue Frage »

graugraugrau Auf diesen Beitrag antworten »
Rekursive Produktion
Meine Frage:
Es gibt eine Fabrik, die in je 20 sek 6 Güter herstellt. Die Produktionsmenge kann mit den produzierten Gütern erhöht werden. Das erste Leveln kostet 6 Güter.
Jedes weitere Leveln kostet 1Gut mehr. Die Erhöhung der Produktion pro Level ist ein Gut. Man muß bedenken, daß beim Leveln möglicherweise noch nicht genug Güter produziert wurden.
Die Frage: welches ist die kürzeste Zeit um 1200 Güter im Lager zu haben und wieviele Level werden gemacht.

Meine Ideen:
Ich habe bei der Aufgabe leider aufgegeben, wollte eine Gleichung erstellen, ist mir nicht gelungen
Elvis Auf diesen Beitrag antworten »

Bei dieser Aufgabe aufgeben ist feige. Man muss nur systematisch für jeden Zeittakt alle Möglichkeiten aufschreiben. Wegen 1200/6=200 ist man spätestens nach 200 Zeitschritten fertig. Also liegt ein endliches Problem vor, das in endlicher Zeit lösbar ist.
graugraugrau Auf diesen Beitrag antworten »

Das ist richtig. Das habe ich natürlich gemacht. Die Antworrt ist 43 Level, wenn ich mich nicht vertan habae. In 7 min sind die 1200 erreicht.
Ich will aber eine Gleichung hierfür haben, und da bin ich bei dem möglichen leeren Lager kleben geblieben.
IfindU Auf diesen Beitrag antworten »

Wenn ich es richtig verstehe, kannst du alle 20 Sekunden aufleveln, da die Kosten immer um 1 wachsen, aber auch die Produktion. Es ist immer besser direkt aufzuleveln oder für immer damit aufzuhören. Wenn wir mal aufleveln, brauchen wir Sekunden um aufzuleven, und wenn Sekunden um dann das Lager aufzufühlen.

Definieren wir also , so ist die Zeit in Sekunden bei mal aufleveln danach das Lager aufgefüllt zu haben. Betrachten wir die kanonische reelle Fortsetztung, , so können wir die Ableitung bilden und sehen, dass ist.

Das hat für genau einen Vorzeichenwechsel und ist am Anfang monoton fallend und danach monoton wachsend. D.h. man kann die Nullstelle der Ableitung betrachten. Wenn die Nullstelle eine natürliche Zahl ist, hat man das Mininum der Level gefunden. Wenn nicht, kann es aufgrund der Monotonie nur die benachbarten natürlichen Zahlen das Minimum erreichen.
Elvis Auf diesen Beitrag antworten »

Meines Erachtens ist die Aufgabe unterbestimmt.
1. Vergeht Zeit durch Leveln ?
2. Wenn ja: Vergeht durch n mal Leveln ein mal Zeit oder n mal Zeit ?
HAL 9000 Auf diesen Beitrag antworten »

Ein "brutaler" Weg, der die Erkenntnis von IfindU "Levelerhöhungen gleich alle am Anfang, später keine mehr" überhaupt nicht mit zu Rate zieht, wäre der folgende rekursive:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
import sys

def minSteps(level,startGoods,targetGoods):
  if startGoods >= targetGoods:
      return 0
  if (level,startGoods,targetGoods) in stepsDict:
      return stepsDict[(level,startGoods,targetGoods)]
  steps = 1 + minSteps(level,startGoods+level,targetGoods)
  if startGoods >= level:
      nextLevelSteps = minSteps(level+1,startGoods-level,targetGoods)
      if nextLevelSteps < steps:
          steps = nextLevelSteps
  stepsDict[(level,startGoods,targetGoods)] = steps
  return steps

if __name__ == '__main__':
  stepsDict = dict()
  sys.setrecursionlimit(3000)
  goods = 1200
  steps = minSteps(6,0,goods)
  print(f"Minimale Schrittzahl für {goods} Güter = {steps}")
Prozedur minSteps bestimmt ausgehend von level und schon produzierter Güteranzahl startGoods die Minimalanzahl von Schritten (von jeweils 20 Sekunden) bis zum Erreichen oder Übertreffen von Güteranzahl targetGoods.


Bei Zielanzahl 12000 (übrigens mit Ergebnisschrittzahl 64) muss dazu die maximale Rekursionstiefe von Python massiv erhöht werden. Mir ist bewusst, dass dieses Vorgehen im vorliegenden Fall der reinste Overkill ist, aber es ist leicht anpassbar, sollten sich die Rahmenbedingungen derart ändern, dass die Erkenntnis von IfindU nicht mehr zutreffend ist. Das maximal erreichte Level habe ich oben nicht mitprotokolliert, kann man leicht nachrüsten - dieses Level ist übrigens bei 1200 Gütern nicht eindeutig bestimmt, d.h., es gibt mehrere mögliche Lösungen bei gleicher Schrittzahl 64.


EDIT: Obiges alternativ als Variante mit explizitem Funktionswertcache (was ich mir von Finn_ abgeguckt habe):

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
import sys

def cache(fc):
    def cache_fc(f):
        def f_cached(a,b,c):
            if not (a,b,c) in fc: fc[(a,b,c)] = f(a,b,c)
            return fc[(a,b,c)]
        return f_cached
    return cache_fc

@cache({})
def minSteps(level,startGoods,targetGoods):
  if startGoods >= targetGoods:
      return 0
  steps = 1 + minSteps(level,startGoods+level,targetGoods)
  if startGoods >= level:
      nextLevelSteps = minSteps(level+1,startGoods-level,targetGoods)
      if nextLevelSteps < steps:
          steps = nextLevelSteps
  return steps

if __name__ == '__main__':
  sys.setrecursionlimit(10000)
  goods = 1200
  steps = minSteps(6,0,goods)
  print(f"Minimale Schrittzahl für {goods} Güter = {steps}")
 
 
graugraugrau Auf diesen Beitrag antworten »

Es vergeht durch das Leveln keine Zeit.
Die erste Ableitung bringt 28,64 also 29 mal.
Nur , da das ständige Leveln von den ersten 20 sek an immer den Vorrat aufbraucht sind wir auch bei Level 29 mit 0 im Lager ,oder?

Level Produktion Levelkosten Lagerinhalt Zeit
0 6 6 0 0
1 6 6 0 20
2 7 7 0 40
graugraugrau Auf diesen Beitrag antworten »

Zum Programm: Wie finde ich mittels des Python3Programms von Dir , die minimalst benötigte Zeit?
Und... Ich denke die Summe von 2 Gleichungen die 1200 ergeben könnte stimmen. Eine für das nichtleveln und mehrfach vergehende 20sek-Intervalle und die zweite mit leveln und das Aufsummieren der Güter. Daraus die Zeit als Minimum finden
HAL 9000 Auf diesen Beitrag antworten »

Zitat:
Original von graugraugrau
Zum Programm: Wie finde ich mittels des Python3Programms von Dir , die minimalst benötigte Zeit?

Der Code basiert auf folgendem Rekursions-Gedanken: Entweder
1) führt man einen Schritt (Produktion von level Gütern) aus,
oder
2) erhöht man das Level (was die vorhandene Güterzahl um die Anzahl level reduziert). Dieser Fall ist nur möglich, wenn man bereits genügend Güter produziert hat.

Man nimmt nun die geringere Anzahl Schritte aus beiden Fällen.
IfindU Auf diesen Beitrag antworten »

Zitat:
Original von graugraugrau
Nur , da das ständige Leveln von den ersten 20 sek an immer den Vorrat aufbraucht sind wir auch bei Level 29 mit 0 im Lager ,oder?
0


Genau. D.h. man levelt erstmal bis 28 oder 29 auf. Und dann muss man das ganze Lager füllen.

Mit und Sekunden. Leider habe ich nicht beachtet, dass man ja alle 20 Sekunden nur neue Sachen bekommt. Weswegen man das auf das nächste Vielfache von 20 aufrunden muss, d.h. beide brauchen am Ende Sekunden.

Edit: Bei deinen vorgeschlagenen 43 Level bräuchte man 1360 Sekunden, also etwa eine Minute mehr.
HAL 9000 Auf diesen Beitrag antworten »

Sowohl mit 24-mal leveln sowie weiteren 40 Produktionszyklen a 30 Gütern, als auch mit 34-mal leveln sowie weiteren 30 Produktionszyklen a 40 Gütern landet man punktgenau bei 1200 Gütern nach den insgesamt 64 * 20 = 1280 Sekunden.

Ebenso führen sämtliche Levelerhöhungen zwischen 25 und 33 zum Ziel, bei denen hat am Ende der 1280 Sekunden sogar noch etwas mehr als die benötigten 1200 Güter produziert. Das Maximum dieser Überzahl wird bei Level 29 erreicht: 35 Produktionszyklen a 35 Güter ergibt 1225 Güter, d.h. 25 mehr als nötig.
graugraugrau Auf diesen Beitrag antworten »

Es gibt also einen Lösungsbereich. Um die Güter möglichst gering zu halten nimmt man dann am besten 24 mal leveln und 40 mal aufsummieren. Klasse. Danke
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »