2017-03-05 11 views
0

だから、私はn質問の合計を持っている、各質問いくつかの点があります。Pythonの逆戻り辞書

私はuv質問の間、蓄積xyポイント間を持っている質問のすべての可能なセットを作成する必要がある、と私はバックトラックを使用していることを行う必要があります。 012 = "" Q1:5、 "Q2":3、 "Q3":4、 "Q4":10、 "Q5":6、 "Q6" ":7}、6つの質問があるので、最初の質問(" Q1 ")は5点などあります

私はコーディングを開始しましたが、バックトラック機能自体を作成する方法はわかりません。それが意味をなさなければ、すべての可能性をどのように通過するのか。

questions = {"Q1":5, "Q2":3, "Q3": 4, "Q4" : 10, "Q5" : 6, "Q6" : 7} 
u = 3 # 
v = 5 # between u and v questions 


x = 5 # 
y = 100 #between x and y points 


def get_points(ar): 
    s = 0 
    for key, value in ar.items(): 
     s = s + int(value) 
    return s 


def get_NOQuestions(ar): 
    return len(ar) 



def reject(candidate): 
    if (get_points(candidate) > y and get_NOQuestions(candidate) < v) or (get_NOQuestions(candidate) >= v and get_points(candidate) < x): 
     return False 
    return True 



def accept(candidate): 
    if get_points(candidate) >= x and get_points (candidate) <= y and get_NOQuestions(candidate) >= u and get_NOQuestions(candidate) <= v: 
     return True 
    return False 



def output(candidate): 
    print(candidate) 



ar = {} 

def backtracking(k): 
    for key, value in questions.items(): 
     ar[key] = value 
     if not reject(ar): 
      if accept(ar): 
       output(ar) 
      else: 
       backtracking(k+1) 

backtracking(0) 

これは、それが(それはこの形式で、それだけのためだなければならないことではない)あらゆる可能性を経由しないので、明らかに「バックトラッキング」機能が動作しない、私がこれまで持っているものである

私はおそらく、辞書のすべての項目を並べ替えることを考えています(長さの置換はuvの間にあります)、「受け入れる」機能の条件を満たすものを手に入れることを考えています。

答えて

0

reject()accept()のロジックを書き換える必要があります。入力したコードがif accept(ar)に届かないためです。紙でコードを実行しようとすると、あなたはそれを把握します。

また、私はこのような何かにget_points(arr)をリファクタリングお勧め:

def get_points(arr): 
    return sum(arr.values()) 

少ないロジック==バグも少ないです。

+0

実際のバックトラッキング機能自体はすべての可能性を通り抜けていると言っていますが、受け入れ機能と拒否機能は悪いですか?私はそれが疑わしいので、 提案のおかげでbtw :) – Hansewl