2016-11-20 2 views
-1

Die folgende Funktion in der openAI Turnhalle Blackjack-Umgebung verwendet wird (siehe https://github.com/openai/gym/blob/master/gym/envs/toy_text/blackjack.py)„Falsch - True“ in Python

def cmp(a, b): 
    return (a > b) - (a < b) 

Wenn die Funktion indirekt über ein import gym und Laden die Blackjack-Umgebung über

genannt wird
env = gym.make('Blackjack-v0') 

gibt es ein unerwünschtes Verhalten. Die Funktion wird in der Blackjack-Klasse z.B. dies wie:

cmp(11, 19) 

Jetzt ist der Rückgabewert True, was offensichtlich falsch ist. Das gewünschte Ergebnis ist -1

Das ist seltsam und vielleicht zu einigen Optimierungen tun? Kannst du erklären warum?

S.S .: Aufgrund des Fehlers gewinnt der Spieler (Agend) immer ein Blackjack Spiel, wenn er "bleibt".

S.S .: Das Einwerfen in einen Float ist in der Turnhalle viel geeigneter, da der Datentyp float sein sollte. In diesem Fall funktioniert es.

def cmp(a, b): 
    return float(a > b) - float(a < b) 
+0

"Wenn die Funktion indirekt über ein Importstudio aufgerufen wird" Was bedeutet das? Wie ist 'cmp (11, 19)' indirekt? –

+0

https://github.com/openai/gym/blob/master/gym/__init__.py enthält keine Aufrufe von 'cmp' - wovon genau sprichst du im Zusammenhang mit' import gym' plz? – Aprillion

+0

env = gym.make ('Blackjack-v0') –

Antwort

-1

Python automatisch die boolean Ergebnisse von (a > b) auf eine ganze Zahl 1 und (a < b)-0 konvertieren, wenn in der Tat a wegen der Minuszeichen größer ist. In diesem Fall entspricht dies der Berechnung 1 - 0, die 1 zurückgeben sollte. Es gibt wahrscheinlich mehr Code, der das in einen True verwandelt, aber diese Funktion sollte nur 1, 0, oder -1 zurückgeben.

+0

das OP weiß, was es 'nur zurückgeben soll 'und will debuggen, warum es nicht tut – Aprillion

-2

In Python benötigen Sortierfunktionen jetzt eine key, aber in anderen Sprachen erfordern Sortierfunktionen Vergleichsfunktionen wie die in Ihrer Frage.

Der Ergebniswert sollte negativ sein, wenn < b, Null, wenn a == b, und posititve wenn a> b.

Das ist genau das, was diese Funktion macht. Denken Sie daran, dass False als 0 und True als 1 ausgewertet wird.

+0

' Ergebnis Wert sollte ... 'zu erreichen, was in Python? – Aprillion

+0

@Aprillion Der Rückgabewert von -1/0/+ 1 ist typisch für Vergleichsfunktionen, die z. in C Sprache qsort(), oder in Perl, wo es einen speziellen '<=>' Operator dafür gibt. Auch Python 2 verwendet solche Funktionen (jetzt Old-Style genannt), z. in 'list.sort', aber Python 3 führte den Schlüsselparameter (und einen Konverter' functools.cmp_to_key') ein. Wer auch immer diese Funktion geschrieben hat, IMHO das war sein Ziel. – VPfB

+0

aus dem GitHub-Link: 'belohnung = cmp (score (self.player), score (self.dealer)); Wenn self.natural und is_natural (self.player) und Belohnung == 1: Belohnung = 1.5' – Aprillion

0

Der Grund für das Verhalten war nicht der "indirekte" Aufruf der Funktion. In blackjack.py Die Funktion wird mit numpy ints, wie dieser

def cmp(a, b): 
    return (a > b) - (a < b) 

cmp (np.array ([10]), np.array ([19]))

Array verwendet ([True], dtype = bool)

Verwandte Themen