systematisches Ausprobieren in rechteckigen Bereich

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Kandalius
User
Beiträge: 3
Registriert: Freitag 28. Oktober 2016, 14:20

Hallo,

ich sitze an einer Aufgabe, die ich nicht ganz hinbekomme. Bin noch ein absoluter Anfänger und habe Schwierigkeiten mein Problem zu lösen. Den Fehler habe ich entdeckt, bekomme ihn aber nicht gelöst. Mit einer doppelten for-Schleife habe ich mir eine Tabelle erstellt, die ich durch if-Bedingungen transformiert habe um strings darin verwenden zu können. Es geht um die Darstellung vom Gewinn... blabla.

Code: Alles auswählen

# vorgegeben

x_vol = 2
y_vol = 1
x_gew = 1.5
y_gew = 1
x_preis = 3
y_preis = 5


# einzugeben

g_Cola_x = float(input("Gewinn pro Colaflasche: "))
g_Wein_y = float(input("Gewinn pro Weinflasche: "))
Kapital = float(input("Verfuegbares Kapital: "))


# Rahmenbedingungen

Handwagen_vol = 88
Handwagen_gew = 70
max_cola = int(Kapital / x_preis)
max_wein = int(Kapital / y_preis)





# Test_Verarbeitung

print("    ", end="")
for wein in range(0,max_wein + 1):
    print("%6d" % wein, end="")
print()
print("    ",end="")
print("------"*max_wein)


for cola in range(0,max_cola + 1):
	print("%2s |" %cola, end="")
	for wein in range(0,max_wein + 1):
		if cola * x_vol + wein * y_vol > Handwagen_vol:
			if cola * x_gew + wein * y_gew > Handwagen_gew:
				if cola * x_preis + wein * y_preis > Kapital:
					Kombination = str("VGK")
				else:
					Kombination = str("VG")
			else:
				Kombination = str("V")
		else:
			if cola * x_gew + wein * y_gew > Handwagen_gew:
				if cola * x_preis + wein * y_preis > Kapital:
					Kombination = str("GK")
				else:
					Kombination = str("G")
			else:
				if cola * x_preis + wein * y_preis > Kapital:
					Kombination = str("V")
				else:
					Kombination = cola*g_Cola_x + wein*g_Wein_y
		print("%6s" %Kombination, end="")
	print()
Nun wollte ich mir aus der Tabelle den höchsten Gewinn ausgeben lassen. Meine Idee war es eine Variable s.B. max_gew = 0 vor der Schleife zu initialisieren und durch eine if-Abfrage in der Schleife durch Ausprobieren den höchsten Wert zu ermitteln. Ich habe mir das folgendermaßen gedacht.

Code: Alles auswählen

if Kombination >= max_gew:
	max_gew = Kombination

print(max_gew)
Das funktioniert aber nicht. Ich bekomme eine Fehlermeldung die iwas mit strings und floats anzeigt.

"" TypeError: unorderable types: float() < str() ""

Meine vermutung ist, dass ich mit den if-abfragen in den for-schleifen Kombination einen string zugewiesen habe und er den nicht mit der anderen if-abfrage vergleichen kann, von wegen prüfe ob ein float größer ist als ein integer. Wie gesagt es ist nur eine Vermutung. Wenn ich richtig liege, bitte ich um tipps, was ich zu machen habe. Ich bin echt noch ein Anfänger und verzweifle total.
Danke schonmal

mfg
BlackJack

@Kandalius: Ob ein Gleikommawert grösser ist als eine ganze Zahl kann geprüft werden, aber dieser Vergleich mit Zeichenketten und Zahlen, egal ob Gleitkommawert oder Integerwert, sind halt nicht definiert. Was soll denn bei ``'hallo' > 42.23`` als sinnvolles Ergebnis heraus kommen?

Und was soll der `str()`-Aufruf bei ``str('V')`` (und den anderen ähnlichen Aufrufen) bewirken?
BlackJack

@Kandalius: Das sieht alles ein bisschen unübersichtlich aus mit den vielen Verzweigungen innerhalb der Schleifen. Ein rechteckiger Bereich macht auch nicht wirklich Sinn, weil ab einem bestimmten Wert in der jeweiligen Schleife ja jeder weiter links/unten in der Tabelle mindestens eine der Beschränkungen sprengt. Man sollte die Schleifendurchläufe beenden sobald dieser Punkt erreicht ist.

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
from itertools import count


class Product(object):

    def __init__(self, description, volume, weight, price, profit):
        self.description = description
        self.volume = volume
        self.weight = weight
        self.price = price
        self.profit = profit

    def __str__(self):
        return '{0.description} = {0.profit:.2f}'.format(self)

    def __add__(self, other):
        return Product(
            '{0} + {1}'.format(self.description, other.description),
            self.volume + other.volume,
            self.weight + other.weight,
            self.price + other.price,
            self.profit + other.profit
        )

    def __mul__(self, amount):
        return Product(
            '{0} {1}'.format(amount, self.description),
            self.volume * amount,
            self.weight * amount,
            self.price * amount,
            self.profit * amount
        )


class Limits(object):

    def __init__(self, volume, weight, price):
        self.volume = volume
        self.weight = weight
        self.price = price

    def check(self, product):
        return (
            self.volume >= product.volume
            and self.weight >= product.weight
            and self.price >= product.price
        )


def iter_profits():
    one_cola = Product('cola', 2, 1.5, 3, 0.12)
    one_wine = Product('wine', 1, 1, 5, 0.2)
    limits = Limits(88, 70, 100)
    for cola_count in count():
        cola = one_cola * cola_count
        if not limits.check(cola):
            break
        for wine_count in count():
            products = cola + one_wine * wine_count
            if not limits.check(products):
                break
            print(products)
            yield (products.profit, cola_count, wine_count)


def main():
    print(max(iter_profits()))


if __name__ == '__main__':
    main()
Antworten