首位交易循環(huán)機制(TTCM)的Python實現(xiàn)

Xc.Li
Feb.2016

算法原理

首位交易循環(huán)機制的算法,略。

Python實現(xiàn)

學(xué)校和學(xué)生的數(shù)據(jù)結(jié)構(gòu)

  • 學(xué)校 class School

    • counter:計數(shù)器
    • pointer:指向
    • preference:偏好向量
    • available:學(xué)校是未滿員
    • 函數(shù):refresh
      用于每次刷新學(xué)校的指向和偏好向量
  • 學(xué)生 class Student

    • preference:偏好向量
    • pointer:指向
    • available:學(xué)生是否已經(jīng)找到學(xué)校
    • result:保存學(xué)生最終去的學(xué)校
    • 函數(shù):refresh
      用于每次刷新學(xué)生的指向和偏好向量

學(xué)校

class School(object):
def __init__(self, quantity, preference):
    self.counter = quantity
    self.pointer = preference[0]
    self.preference = preference
    self.available = True
    print self.counter, self.pointer, preference

學(xué)生

class Student(object):
def __init__(self, preference):
    self.preference = preference
    self.pointer = preference[0]
    self.available = True
    self.result = None

學(xué)校和學(xué)生的刷新

學(xué)校

class School 里的函數(shù):

def refresh(self):
original_preference = self.preference
self.preference = []
for item in original_preference:
    if student_list[item].available is True:
        self.preference.append(item)
try:
    self.pointer = self.preference[0]
except:
    print 'ok'

學(xué)生

class Student 里的函數(shù):

def refresh(self):
original_preference = self.preference
self.preference = []
for item in original_preference:
    if school_list[item].available is True:
        self.preference.append(item)
self.pointer = self.preference[0]

窮舉構(gòu)環(huán)

從學(xué)校出發(fā)枢希,根據(jù)學(xué)校和學(xué)生的指向向circle列表中添加元素聊替。
判斷方式:

  1. 如果某元素和起始元素相同則終止程序谊娇,找到一個完整的環(huán)
    處理方式是調(diào)用School.refresh和Student.refresh刷新狀態(tài),調(diào)用Handle(circle)處理環(huán)始鱼。

  2. 如果環(huán)的長度大于10(僅舉例),則認(rèn)為是死循環(huán)(例如s2-i1-s1-i1-s1-....)脆贵,也終止程序医清。

    while True:

    count = 0
    for j in range(1, student_num + 1, 1): #careful
    if student_list['i' + str(j)].available is False:
    count += 1
    if count == student_num:
    break

    i = 1
    circle = []
    while i <= school_num:
    school_name = 's' + str(i)
    if school_list[school_name].available is False:
    continue
    # circle.append(school_name)
    while True:
    student_name = school_list[school_name].pointer
    circle.append(student_name)
    school_name = student_list[student_name].pointer
    circle.append(school_name)
    if school_name == 's' + str(i):
    flag = 1
    break
    if len(circle) > 10:
    flag = 0
    circle = 'Error'
    break
    if flag == 1:
    handle(circle)
    for j in range(1, school_num + 1, 1): # careful
    school_list['s' + str(j)].refresh()
    for j in range(1, student_num + 1, 1): # careful
    student_list['i' + str(j)].refresh()
    print circle
    circle = []
    i += 1

環(huán)的處理

對于每個環(huán)內(nèi)的學(xué)生i,將目前指向pointer賦值給結(jié)果result保存卖氨,把available賦值為False会烙,以示退出。
對于每個環(huán)內(nèi)的學(xué)校s筒捺,counter減1柏腻。判斷counter是否為0,如果是則把available賦值為False系吭,以示退出五嫂。

def handle(circle):
for item in circle:
    if item[0] == 'i':
        student_list[item].available = False
        student_list[item].result = student_list[item].pointer
    if item[0] == 's':
        school_list[item].counter -= 1
        if school_list[item].counter == 0:
            school_list[item].available = False
            print 'school out!'

運行

測試

number of schools:輸入0
演示:

C:\Python27\python.exe D:/OneDrive/Python/TTCM.py
number of schools:0 #這里輸入0
test
2 i1 ['i1', 'i2', 'i3', 'i4', 'i5', 'i6', 'i7', 'i8']
2 i3 ['i3', 'i5', 'i4', 'i8', 'i7', 'i2', 'i1', 'i6']
3 i5 ['i5', 'i3', 'i1', 'i7', 'i2', 'i8', 'i6', 'i4']
3 i6 ['i6', 'i8', 'i7', 'i4', 'i2', 'i3', 'i5', 'i1']
['i1', 's2', 'i3', 's3', 'i5', 's1']
Error #表示找不到環(huán)
Error
['i6', 's4']
school out!
['i2', 's1']
school out!
['i4', 's3', 'i7', 's2']
Error
ok #學(xué)校滿員
ok
ok
ok
['i8', 's4']
1 s2
2 s1
3 s3
4 s3
5 s1
6 s4
7 s2
8 s4

數(shù)據(jù)輸入

number of schools:學(xué)校個數(shù)(整數(shù))
number of students:學(xué)生個數(shù)(整數(shù))
quantity of school:學(xué)校招生人數(shù)(整數(shù))
enter the preference of school:學(xué)校偏好,例如i1,i2,i3
enter the preference of student:學(xué)生偏好肯尺,例如s1,s2,s3

完整代碼

基于Python2.7

# -*- encoding:utf-8 -*-
# 首位交易循環(huán)機制
# Designed By Xc.Li @ Feb.2015


class School(object):
    def __init__(self, quantity, preference):
        self.counter = quantity
        self.pointer = preference[0]
        self.preference = preference
        self.available = True
        print self.counter, self.pointer, preference

    def refresh(self):
        original_preference = self.preference
        self.preference = []
        for item in original_preference:
            if student_list[item].available is True:
                self.preference.append(item)
        try:
            self.pointer = self.preference[0]
        except:
            print 'ok'


class Student(object):
    def __init__(self, preference):
        self.preference = preference
        self.pointer = preference[0]
        self.available = True
        self.result = None

    def refresh(self):
        original_preference = self.preference
        self.preference = []
        for item in original_preference:
            if school_list[item].available is True:
                self.preference.append(item)
        self.pointer = self.preference[0]

# input and initialize

school_num = int(raw_input("number of schools:"))
if school_num == 0:
    print 'test'
    school_num = 4
    school_list = {
        's1': School(2, ['i1', 'i2', 'i3', 'i4', 'i5', 'i6', 'i7', 'i8']),
        's2': School(2, ['i3', 'i5', 'i4', 'i8', 'i7', 'i2', 'i1', 'i6']),
        's3': School(3, ['i5', 'i3', 'i1', 'i7', 'i2', 'i8', 'i6', 'i4']),
        's4': School(3, ['i6', 'i8', 'i7', 'i4', 'i2', 'i3', 'i5', 'i1'])
    }
    student_num = 8
    student_list = {
        'i1': Student(['s2', 's1', 's3', 's4']),
        'i2': Student(['s1', 's2', 's3', 's4']),
        'i3': Student(['s3', 's2', 's1', 's4']),
        'i4': Student(['s3', 's4', 's1', 's2']),
        'i5': Student(['s1', 's3', 's4', 's2']),
        'i6': Student(['s4', 's1', 's2', 's3']),
        'i7': Student(['s1', 's2', 's3', 's4']),
        'i8': Student(['s1', 's2', 's4', 's3'])
    }

else:
    student_num = int(raw_input("number of students:"))
    # school initialize
    i = 1
    school_list = {}
    while i <= school_num:
        school_name = 's' + str(i)
        print school_name
        quantity = int(raw_input("quantity of school:"))
        preference = raw_input("enter the preference of school:")
        preference = preference.split(",")
        school_list[school_name] = School(quantity, preference)
        i += 1

    # student initialize
    i = 1
    student_list = {}
    while i <= student_num:
        student_name = 'i' + str(i)
        print student_name
        preference = raw_input("enter the preference of student:")
        preference = preference.split(",")
        student_list[student_name] = Student(preference)
        i += 1


def handle(circle):
    for item in circle:
        if item[0] == 'i':
            student_list[item].available = False
            student_list[item].result = student_list[item].pointer
        if item[0] == 's':
            school_list[item].counter -= 1
            if school_list[item].counter == 0:
                school_list[item].available = False
                print 'school out!'
k = 0
while True:

    count = 0
    for j in range(1, student_num + 1, 1):  # fuck it!
        if student_list['i' + str(j)].available is False:
            count += 1
    if count == student_num:
        break

    i = 1
    circle = []
    while i <= school_num:
        school_name = 's' + str(i)
        if school_list[school_name].available is False:
            continue
        # circle.append(school_name)
        while True:
            student_name = school_list[school_name].pointer
            circle.append(student_name)
            school_name = student_list[student_name].pointer
            circle.append(school_name)
            if school_name == 's' + str(i):
                flag = 1
                break
            if len(circle) > 10:
                flag = 0
                circle = 'Error'
                break
        if flag == 1:
            handle(circle)
            for j in range(1, school_num + 1, 1):  # careful
                school_list['s' + str(j)].refresh()
            for j in range(1, student_num + 1, 1):  # careful
                student_list['i' + str(j)].refresh()
        print circle
        circle = []
        i += 1
for k in range(1, student_num + 1, 1):
    print k, student_list['i' + str(k)].result
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沃缘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子则吟,更是在濱河造成了極大的恐慌槐臀,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氓仲,死亡現(xiàn)場離奇詭異水慨,居然都是意外死亡得糜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門讥巡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掀亩,“玉大人,你說我怎么就攤上這事欢顷〔酃鳎” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵抬驴,是天一觀的道長炼七。 經(jīng)常有香客問我,道長布持,這世上最難降的妖魔是什么豌拙? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮题暖,結(jié)果婚禮上按傅,老公的妹妹穿的比我還像新娘。我一直安慰自己胧卤,他們只是感情好唯绍,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枝誊,像睡著了一般况芒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叶撒,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天绝骚,我揣著相機與錄音,去河邊找鬼祠够。 笑死压汪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哪审。 我是一名探鬼主播蛾魄,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼湿滓!你這毒婦竟也來了滴须?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤叽奥,失蹤者是張志新(化名)和其女友劉穎扔水,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朝氓,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡魔市,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年固惯,在試婚紗的時候發(fā)現(xiàn)自己被綠了笤成。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滞项。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡筹麸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出将宪,到底是詐尸還是另有隱情绘闷,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布较坛,位于F島的核電站印蔗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏丑勤。R本人自食惡果不足惜华嘹,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望法竞。 院中可真熱鬧耙厚,春花似錦、人聲如沸岔霸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秉剑。三九已至,卻和暖如春稠诲,著一層夾襖步出監(jiān)牢的瞬間侦鹏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工臀叙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留略水,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓劝萤,卻偏偏與公主長得像渊涝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子床嫌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,437評論 0 23
  • 一 在考慮街亭守將時 馬謖為圖虛名 請求守衛(wèi) 諸葛亮雖有憂慮 最終還是答應(yīng)了 這是一過 用人不疑疑人不用 二 諸葛...
    簡單明了閱讀 257評論 0 2
  • test
    genspring閱讀 200評論 0 1
  • 天突然變冷跨释,中午還下起了大雪。薄衫單衣在雪里走了一遭回來竟然有點發(fā)暈厌处,鼻涕直流鳖谈。羽絨棉襖都已經(jīng)洗好收進(jìn)了柜子,懶得...
    覺夢2016閱讀 286評論 0 1
  • 故事里說阔涉,王子愛上了巫婆卻拋棄了白雪公主缆娃,王后善妒的嘴臉從此徹底暴露無遺捷绒,她瘋狂的虐待著白雪公主,直到七個小矮人都...
    心事于你閱讀 455評論 0 2