32
Triết lí Multi-agent = Fifo chỉ là medium để thông qua đó container truyền message cho nhau, tập hợp các container tự phán xét kết quả theo kiểu bồi thẩm đoàn. Fifo chỉ làm trọng tài một cách passive, nghĩa là khi có request từ container nào đó trong channel. Để thực hiện vai trò trọng tài, Fifo cũng không tự quyết định, mà chọn đại vài container (trong channel khác, nhưng cùng game) để làm bồi thẩm đoàn. Quyết định theo nguyên tắc > 50% hoặc trung bình cộng. Topics of research in MAS include: 1. beliefs, desires, and intentions (BDI), 2. cooperation and coordination, 3. organization, 4. communication, 5. negotiation, 6. distributed problem solving, 7. multi-agent learning. 8. scientific communities 9. dependability and fault-tolerance

Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Embed Size (px)

DESCRIPTION

Bản chất của message (2/2)‏ Cải tiến: Để đỡ mất thời gian, ngay khi Fifo nhận được message từ đầy đủ mọi người, sẽ public luôn chứ không cần chờ đến thời điểm TTP. A gửi message B gửi message Đến thời điểm public này A và B mới biết nội dung message của nhau

Citation preview

Page 1: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Triết líMulti-agent = Fifo chỉ là medium để thông qua đó container truyền message cho nhau, tập hợp các container tự phán xét kết quả theo kiểu bồi thẩm đoàn.

Fifo chỉ làm trọng tài một cách passive, nghĩa là khi có request từ container nào đó trong channel.

Để thực hiện vai trò trọng tài, Fifo cũng không tự quyết định, mà chọn đại vài container (trong channel khác, nhưng cùng game) để làm bồi thẩm đoàn. Quyết định theo nguyên tắc > 50% hoặc trung bình cộng.

Topics of research in MAS include:

1. beliefs, desires, and intentions (BDI), 2. cooperation and coordination, 3. organization, 4. communication, 5. negotiation, 6. distributed problem solving, 7. multi-agent learning. 8. scientific communities 9. dependability and fault-tolerance

Page 2: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Bản chất của message (1/2)

Truy về bản chất:

Q: Tại sao con gà băng qua đường? À quên, tại sao container gửi message đến Fifo?

A: Vì nó muốn tất cả các container khác nhận được message sau khoảng thời gian TTP (= time to public) nào đó.

Có 2 loại game: TTP = 0, > 0. Cho player thay đổi TTP trước khi game bắt đầu, nhưng giá trị default của TTP đã > 0 thì player chỉ có thể chọn giá trị > 0, đã > 0 thì > 0 suốt.

Lấy Glaborous làm ví dụ minh họa cho dễ hiểu:

A gửi

messa

ge

B gửi

messa

ge Đến thời điểm public này

A và B mới biết nội dung

message của nhau

Page 3: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Bản chất của message (2/2)

Cải tiến: Để đỡ mất thời gian, ngay khi Fifo nhận được message từ đầy đủ mọi người, sẽ public luôn chứ không cần chờ đến thời điểm TTP.

A gửi

messa

ge

B gửi

messa

ge

Đến thời điểm public

này

A và B mới biết nội

dung

message của nhau

Page 4: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Bản chất của timeout

Con người ta ai cũng đều bận rộn và sốt ruột => ai cũng muốn sau khi mình move, đối thủ làm ơn move nhanh nhanh giùm cái!

Nên cho player số 1 thay đổi được timeout T ngay khi trận đấu bắt đầu (mọi người có thể thương lượng thông qua chat).

Q: TTP và T khác nhau thế nào?A: TTP có thể = 0, còn T chắc chắn phải > 0. Khi TTP > 0, thì ý nghĩa của TTP và T như nhau => đặt TTP làm T.

Page 5: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Kết luận về TTP và T

Phân loại game theo TTP, lưu default value trên Fifo (<- tên game cũng lưu trên Fifo cho thống nhất, tránh trường hợp mỗi người đặt một kiểu)Trường hợp TTP = 0: Sau thời gian T mà không move thì sẽ bị xử thua, cho phép player 1 thay đổi giá trị của TTrường hợp TTP > 0: Lấy TTP làm T, xử lí gần giống như trênVì tồn tại latency, nên Fifo sẽ cộng thêm thời gian L vào TKhi hiển thị, thì về mặt usability, chỉ dùng thống nhất 1 từ quen thuộc là timeout.

Page 6: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Trạng thái game

Chỉ có 1 trong 5 trạng thái:OVER: Ván đấu kết thúc, đang tính kết quảNEWABLE: Ai click New game trước thì sẽ làm player 1NEW: Ai nhanh tay accept thì được vào chơiPLAY: Để tránh gian lận, số player đang chơi chỉ có giảm chứ không tăng, nghĩa là nếu player X đang chơi mà resign hoặc logout rồi login lại mà game vẫn chưa kết thúc, thì ngồi làm khán giả đi XDRAW: Na ná như NEW, cầu hòa

Page 7: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Biến

Lưu ở container:Trạng thái gameDanh sách tất cả playerDanh sách player đang chơi, có thứ tựDanh sách các move từ đầu game đến giờ

Lưu ở Fifo:

Page 8: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Tương tác container-Fifo

Container

Fifo

logout

disconnect

Enqueue

BroadcastonXxx

Sau khi enqueue cũng phải chờ đến khi onXxx thì mới được hành độngTrừ vài message đặc biệt, nói chung Fifo không quan tâm nội dung message là gìTrừ onDisconnect, onXxx là method trên container để Fifo gọiLogout: container cứ thế mà ngắt connection, không phải báo gì cả

onDisconnect Lấy thông tin gameLogin

Chat

NEW

PLAY

DRAW

OVER Tất cả container

Page 9: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Chuyển trạng thái

NEWNEWABLE

PLAYDRAW

Login

newInit

newJoin +Đủ playerplayOver

drawInit

drawAccept +Đủ player

drawRefuse

onLogout là event đặc biệt, có thể xảy ra ở tất cả trạng thái, container cần xử lí thích hợp tùy trạng thái và tùy player vừa logout có đang tham gia game hay không

newTimeoutnewLeave/logout + 0 player

Hình này vẽ state transition trên Fifo khi có tác động từ container. Trạng thái trên container luôn trễ 1 nhịp so với trên Fifo.

OVER

Tính xong kết quả

Page 10: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

onLogout

Không có nút để logout, user chỉ cần refresh trang web, close cửa sổ... là xong=> Nên có nút (click cái là close connection) vì nhiều khi cùng cửa sổ embed vài game

onLogout(nick)

Page 11: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Lấy thông tin game và login

Container Fifo

getGameInfo

login

onGameInfo

onLoginMe

onLogin

Page 12: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

getGameInfo, onGameInfo

getGameInfo:Vì chưa có kết nối, nên phải dùng connect(). Lấy thông tin game xong, connection bị ngắt ngay. Tạm thời chỉ trả về tên game, các thông tin khác (nổi tiếng được nhiều người chơi...) xem trên web.

URL:<FIFO_URL>/info

params cho connect():Version của containerID của gameVersion của gameLocale

onGameInfo:COULD_NOT_CONNECTWRONG_CLIENT_VERSION: Container cũ, nên refresh trang webWRONG_GAME_ID: Không tồn tại game với ID nàyWRONG_GAME_VERSION: Game cũ, nên refresh trang web[tên game theo locale (không có thì dùng mặc định là en-US)]

Page 13: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

loginCần kiểm tra lại version, vì có thể đang login thì container được nâng cấp! Vì chưa có kết nối, nên phải dùng connect(). Connection bị ngắt ngay nếu thất bại, còn không thì được giữ suốt.

URL:<FIFO_URL>/<game ID><SEPARATOR><channel>

params cho connect():Version của container, gameNick, password (rỗng nếu là guest)

onLoginMe:COULD_NOT_CONNECTWRONG_CLIENT_VERSION: Container cũ, nên refreshWRONG_ID: Không tồn tại game với ID nàyWRONG_VERSION: Game cũ, nên refreshLOGIN_WRONG_CLIENT_VERSION: Những người đang trong channel dùng container cũLOGIN_WRONG_VERSION: Những người đang trong channel dùng game cũDUPLICATE_NICK: Trong channel đã có sẵn player trùng nickWRONG_NICK_OR_PASSWORD[trạng thái game, nP, TTP hoặc T, total, danh sách gốc player đăng kí chơi, danh sách move]

Page 14: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

onLogin

onLogin(player vừa login)Nếu là guest thì nick sẽ bị gán thêm GUEST_SUFFIX là “ (guest)” để bà con biếtTạm thời chỉ có thông tin về nick, các thông tin khác (số lần thắng hòa thua... xem trên mạng <- players/<nick thay vì id>)

Page 15: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Chat

Container Fifo

chat

onChat

Page 16: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

chat, onChat

chat(msg)

onChat([nick, msg])

Page 17: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Các hình ở dưới ứng với trạng thái ở trên container

Page 18: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Trạng thái OVERContainer Fifo

onResult

newInit

onNewInit

onResult: kết quả của trận đấu trước sau khi Fifo tính toán xongKhi chưa có kết quả, thì không được bắt đầu trận đấu mới, chờ đi em!OnLogout: không cần xử lí

Page 19: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Trạng thái NEW

Container Fifo

onNewJoin

newJoin

newLeave

onNewLeavenewTimeout

onNewTimeout

onLogout: khi xảy ra sẽ phát sinh onNewLeave

Page 20: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

newInit, onNewInit

newInit(nPlayers, ttpOrT, total):Nếu đang ở state OVER thì dc phép

Fifo:Ghi lại thời điểm để xử lí khi có container gửi newTimeout để kiện

onNewInit(nick, nPlayers, ttpOrT, total):Ghi lại thời điểm để có thể kiện

Page 21: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Trạng thái PLAYContainer Fifo

playMove

onPlayMove

onPlayOver

Chỉ những player trong danh sách playNicks (không phải playNicks0) mới được gọi playMove và playOverNhững gì ảnh hưởng đến kết quả, đều phải ghi vào fifo để có thể playback y xì:Đang chơi thì leave/resignLogout: Fifo sẽ xử lí sao cho nhìn từ game, cứ tưởng chỉ là leave/resignplayOver được gửi đi nếu container thấy timeout hoặc game.onMove báo là game overKhi nhận được playOver, Fifo sẽ gửi onPlayOver và chuyển ngay sang OVER, kết quả trận đấu sẽ được thông báo sau, sau khi tính toán!

playOver

Page 22: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

playMove(index, time, data)index: index của player trong nicks0time: thời điểm [s] tính từ lúc lần move trướcdata: nội dung nước đi

Khi gặp move không hợp lệ, sẽ báo game over ngay, lí do:

Chỉ có thể không hợp lệ do nhầm turn (tham số index), hoặc data không hợp lệ (tham số data)Data không thể nhầm, vì game phải biết luậtTurn cũng không thể nhầm, lí do:

Nếu là turn-based game, thì hiển nhiên thứ tự turn đã biết trước, không thể nhầm

Nếu là game kiểu TTP > 0, thì thứ tự turn không tính

Player nào chơi không hợp lệ tất nhiên sẽ bị xử thua

Page 23: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Timeout khi PLAYCó 2 kiểu:Timeout do quá thời gian cho 1 nước điTimeout do quá total time

Timeout do container và game hợp tác xử lí ngay ở từng move, Fifo không cần xử lí :)

Timeout != OVER, ví dụ có 5 player, nếu chỉ 1 player timeout thì game có thể vẫn không OVER=> cũng như playLeave, timeout cần được xử lí như move bình thường

----------------------------------------

Đối với game TTP > 0, để tránh Fifo phải dùng scheduler rất nặng, dùng giải pháp sau:Fifo: chỉ khi nhận được N move thì mới broadcastContainer: Hoặc nếu quá TTP mà không thấy move từ Fifo thì kiện, hoặc nếu sắp hết TTP thì gửi default move lên

Page 24: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

judge(index, dt, nP, ttpOrT, total, moves)

Ban đầu, điểm được khởi tạo < 0

Qua mỗi move, điểm được update, nếu điểm >= 0 thì user này được coi là “chơi xong”

Khi judge, nếu điểm mọi người đều >= 0 thì trả luôn kết quả về

Nếu không, thằng reporter rất bậy, xử lí theo thuật toán sau:

1. Nếu game chỉ có 2 player, gán điểm của reporter = 0, player kia = 3

2. Nếu không, gán điểm của những người < 0 thành 1, reporter = 0

Chú ý: report có thể là thằng đã “chơi xong” (ngồi không quấy rối :P)

Page 25: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Trạng thái DRAW

Container Fifo

proposeDraw

onProposeDraw

acceptDraw

refuseDraw onAcceptDraw

onRefuseDraw

Page 26: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

URL dùng khi kết nối

Vì ngay từ bản chất, RTMP cấu trúc theo /scope1/scope2/... nên để tránh tạo nhiều scope không cần thiết mà vẫn thỏa mãn nhu cầu, dùng mẹo sau:Chỉ dùng 1 cấp scope cho mỗi channelKhông dùng <FIFO_URL>/<game ID>/<channel>Dùng <FIFO_URL>/<game ID><SEPARATOR><channel>, vì game ID luôn là số, nên chỉ cần chọn separator không phải là số là xong

Page 27: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Delare game over – On game over

2 cái này không ứng với nhau

Khi 1 thằng declare game over thì game chắc chắn kết thúc, Fifo:Tạm ngưng không forward những message liên quan đến chơi gameChọn bồi thẩm đoàn, cho biết nội dung message của tất cả message từ khi new game đến thời điểm đó, rồi hỏi bồi thẩm đoàn nên phán xử ra saoDựa vào phán xử của bồi thẩm đoàn, ra quết địnhGhi quyết định về ván game vào DBGửi One game over đến tất cả container trong channel

Page 28: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

AMF0

Hiện Red5 chưa hỗ trợ AMF3, cho nên

nc = new NetConnection();nc.objectEncoding = ObjectEncoding.AMF0;

Page 29: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

SharedObject

Để set, phải dùng setProperty, gán hash không tác dụng:

so.setProperty("name", value);

Để get:

public function soSync(event:SyncEvent):void {var list:Array = event.changeList;for (var i:int = 0; i < list.length; i++) {

var info:Object = list[i];for (var key:Object in info) {

trace += ("i: " + i + ", " + key + ": " + info[key]); }

}}

Page 30: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Loader&loaded interaction (1/2)

public var varOne:String = "This is a public variable";

public function setVarOne(newText:String):void {varOne=newText;

}

You can use Application.application to get a reference to the host application. This is the top tier application so if you have nested a stack of SWF's this is the shortest way to get to the top.

parentapplication gets the immediate parent but you can also step up the hierarchy using that property.

Also check out applicationdomain and securitydomain / trustContent to ensure that your applications can talk to each other.

http://www.mail-archive.com/[email protected]/msg34758.html

Page 31: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

Loader&loaded interaction (2/2)

<mx:SWFLoader id="myLoader" width="300" source="local.swf"complete="initNestedAppProps();"/>

private var loadedSM:SystemManager;

private function initNestedAppProps():void {loadedSM = SystemManager(myLoader.content);

}

private function test():void {lbl.text=loadedSM.application["lblOne"].text;loadedSM.application["lblOne"].text = "I was just updated";local(loadedSM.application).setVarOne("Updated varOne!");

}

http://livedocs.adobe.com/flex/2/docs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000543.html

Page 32: Triết l Multi-agent = Fifo chỉ l medium để thng qua đ container truyền message cho nhau, tập hợp cc container tự phn xt kết quả theo kiểu bồi thẩm

htmlText

Dùng <br /> để xuống dòng rất chuối, dòng trắng từa lưa tùm lum tòe loe!=> Dùng <p>...</p>