1. Trang chủ
  2. » Luận Văn - Báo Cáo

đồ án tốt nghiệp đại học lập trình động trong lý thuyết trò chơi

44 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lập trình động trong lý thuyết trò chơi
Tác giả Lê Thị Lâm Oanh
Người hướng dẫn TS. Phạm Hồng Phong
Trường học Trường Đại học Xây dựng Hà Nội
Chuyên ngành Khoa học máy tính
Thể loại Đồ án tốt nghiệp đại học
Năm xuất bản 2024
Thành phố Hà Nội
Định dạng
Số trang 44
Dung lượng 3,51 MB

Cấu trúc

  • CHƯƠNG 1: TỔNG QUAN VỀ LẬP TRÌNH ĐỘNG (9)
    • 1.1 Giới thiệu chung (9)
      • 1.1.1 Kháiniệmvềquyhoạchđộng (9)
      • 1.1.2 Lập trình động hoạt động như thế nIo? (9)
      • 1.1.3 Khinàosửdụnglậptrìnhđộng (10)
      • 1.1.4 Cácphươngpháplậptrìnhđộng (11)
      • 1.1.5 Ứngdụngcủalậptrìnhđộng (11)
    • 1.2 Đặc điểm của lập trình động (12)
    • 1.3 Lập trình động dựa trên các nguyên tắc (12)
    • 1.4 Các bước giải bIi toán bằng lập trình động (0)
      • 1.4.1 Xemxétbàitoán (13)
      • 1.4.2 Xácđịnhhệthứcxãhội (13)
      • 1.4.3 Tìmnghiệmtốiưu (13)
    • 1.5 Một số kỹ thuật giải bIi toán lập trình động (0)
  • CHƯƠNG 2: TÌM HIỂU VỀ LÝ THUYẾT TRÒ CHƠI (16)
    • 2.1 Các khái niệm chung (16)
    • 2.2 Trạng thái trò chơi (5)
    • 2.3 Đồ thị trạng thái của trò chơi (State graph) (19)
    • 2.4 Trò chơi tổ hợp cân bằng (20)
    • 2.5 Trò chơi hai người có tổng điểm bằng 0 (31)
  • CHƯƠNG 3: ỨNG DỤNG LẬP TRÌNH ĐỘNG TRONG LÝ THUYẾT TRÒ CHƠI N ĐỒNG XU (37)
    • 3.1 Giới thiệu về trò chơi n đồng xu (37)
    • 3.2 Các khía cạnh của lý thuyết trò chơi trong bIi toán nIy (37)
    • 3.3 BIi toán (38)
    • 3.4 Khởi tạo vI Định nghĩa (39)

Nội dung

BỘ GIÁO DỤC VÀ ĐÀO TẠOTRƯỜNG ĐẠI HỌC XÂY DỰNG HÀ NỘIKHOA CÔNG NGHỆ THÔNG TIN ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌCNGÀNH KHOA HỌC MÁY TÍNHLẬP TRÌNH ĐỘNG TRONG LÝ THUYẾT TRÒ CHƠISinh viên thực hiện Lê

TỔNG QUAN VỀ LẬP TRÌNH ĐỘNG

Giới thiệu chung

1.1.1 Kháiniệmvềquyhoạchđộng

Lậptrìnhđộng(DynamicProgramming)làmộtphươngphápđượcsửdụngtrong toánhọcvàkhoahọcmáytínhđểgiảiquyếtcácvấnđềphứctạpbằngcáchchia chúngthànhnhữngbàitoánconđơngiảnhơn.Bằngcáchgiảimỗibàitoánconchỉ mộtlầnvàlưutrữkếtquả,nótránhđượccácphéptínhdưthừa,dẫnđếngiảipháp hiệuquảhơnchonhiềubàitoán.

1.1.2 Lậptrìnhđộnghoạtđộngnhưthếnào?

Xácđịnhcácvấnđềphụ:chiavấnđềchínhthànhcácvấnđềphụnhỏhơn,độc lập.

Lưutrữgiảipháp:giảiquyếttừngbàitoánconvàlưutrữgiảiphpastrongmột bảnghoặcmảng.

Xâydựnggiảipháp:sửdụngcácgiảiphápđượclưutrữđểxâydựnggiảiphápcho vấnđềchính.

Tránhdưthừa:bằngcáchlưutrữlờigiải,quyhoạchđộngđảmbảorằngmỗibài toánconchỉđượcgiảimộtlần,giảmthờigiantínhtoán.

Ví dụ về lập trình động:XétbàitoántìmdãyFibonacci

ChuỗiFibonaccisửdụnglậptrìnhđộng:

Giảipháplưutrữ:TạomộtbảngđểlưutrữcácgiátrịcủaF(n)khichúng đượctínhtoán.

Xâydựnglờigiải:ĐốivớiF(n),hãytracứuF(n-1)vàF(n-2)trongbảngvà cộngchúnglại.

Tránhdưthừa:Bảngđảmbảorằngmỗibàitoáncon(vídụF(2))chỉđược giảimộtlần.

Bằngcáchsửdụnglậptrìnhđộng,chúngtacóthểtínhtoándãyFibonaccimột cáchhiệuquảmàkhôngcầnphảitínhtoánlạicácbàitoáncon.

1.1.3 Khinàosửdụnglậptrìnhđộng

Lậptrìnhđộnglàmộtkỹthuậttốiưuhóađượcsửdụngkhigiảiquyếtcácvấnđề baogồmđặcđiểmsau:

Cấutrúctốiưucónghĩalàchúngtakếthợpcáckếtquảtốiưucủacácbàitoán conđểđạtđượckếtquảtốiưucủabàitoánlớnhơn.

Xétvấnđềtìmđườngdẫnchiphítốithiểutrongbiểuđồcótrọngsốtừnút nguồnđếnnútđích.Chúngtachiabàitoánnàythànhcácbàitoánconnhỏ hơn:

Tìmđườngđicóchiphítốithiểutừnútnguồnđếnmỗinúttrung gian.

Tìmđườngđicóchiphítốithiểutừmỗinúttrunggianđếnnútđích. 1.1.3.2 Cácbàitoánconchồngchéo

Cácbàitoáncongiốngnhauđượcgiảilặpđilặplạiởcácphầnkhácnhaucủa bàitoán.

Vídụ:XétbàitoántínhdãyFibonacci.ĐểtínhsốFibonaccitạichỉsốn,chúng tacầntínhsốFibonaccitạichỉsốn-1vàn-2.Điềunàycónghĩalàbàitoáncon tínhsốFibonaccitạichỉsốn-1đượcsửdụnghailầntronglờigiảichobàitoán lớnhơnlàtínhsốFibonaccitạichỉsốn

1.1.4 Cácphươngpháplậptrìnhđộng

Lậptrìnhđộngcóthểđạtđượcbằnghaicáchtiếpcận:

1.1.4.1 Cáchtiếpcậntừtrênxuống(Top-Down)

Trongcáchtiếpcậntừtrênxuống,cònđượcgọilàghinhớ(memoization), chúngtabắtđầuvớilờigiảicuốicùngvàchianóthànhcácbàitoánconnhỏ hơnmộtcáchđệquy.Đểtránhtínhtoándưthừa,chúngtôilưutrữkếtquả củacácbàitoánconđãgiảitrongbảngghinhớ.

Phântíchcáchtiếpcậntừtrênxuống:

Bắtđầuvớilờigiảicuốicùngvàchiathànhcácbàitoánconnhỏhơn. Lưutrữlờigiảicủacácbàitoáncontrongmộtbảngđểtránhtínhtoán dưthừa.

Thíchhợpkhisốlượngbàitoánconlớnvànhiềubàitoánconđượcsử dụnglại.

1.1.4.2 Cáchtiếpcậntừdướilên(Bottom-Up)

Trongcáchtiếpcậntừdướilên,cònđượcgọilàlậpbảng(tabulation),chúng tabắtđầuvớicácbàitoánnhỏnhấtvàdầndầnxâydựngđếnlờigiảicuối cùng.Chúngtalưutrữukếtquảcủacácbàitoánconđãgiảitrongmộtbảngđể tránhtínhtoándưthừa.

Phântíchcáchtiếpcậntừdướilên:

Bắtđầuvớinhữngbàitoánnhỏnhấtvàdẫndầnxâydựnglờigiảicuối cùng. Điềnvàibảngcácgiảiphápchocácbàitoáncontheocáchtừdướilên. Thíchhợpkhisốlượngbàitoánconnhỏvàlờigiảitốiưucóthểđược tínhtrựctiếptừlờigiảicủabàitoánconnhỏhơn.

1.1.5 Ứngdụngcủalậptrìnhđộng

Lậptrìnhđộngcónhiềuứngdụng,baogồm:

Tốiưuhóa:bàitoánbalo,đườngđingắnnhất,mảngcontốiđa.

Khoahọcmáytính:dãyconchungdàinhất,chỉnhsửakhoảngcách,khớp chuỗi.

Nghiêncứuhoạtđộng:quảnlýhàngtồnkho,lậpkếhoạch,phânbổnguồn lực.

Đặc điểm của lập trình động

Lậptrìnhđộnglàmộttrongnhữngkỹthuậtmạnhmẽnhấtđểgiảiquyếtmộtloạivấn đềnhấtđịnh.

Cómộtcáchhayđểhìnhthànhcáchtiếpcậnvàquytrìnhtưduyrấtđơngiản,đồng thờiphầnmãhóacũngrấtdễdàng.

Vềcơbản,đólàmộtlýtưởngđơngiản,saukhigiảiquyếtmộtvấnđềvớimộtđầu vàonhấtđịnh,lưujeetsquảlàmtàiliệuthamkhảođểsửdụngchotươnglai. Lờigiảicủacácbàitoánconđượclưutrữutrongmộtbảnghoặcmảng(ghinhớ)hoặc theocáchtừdướilên(lậpbảng)đểtránhtínhtoándưthừa.

Lờigiảibàitoáncóthểđượcxâydựngtừlờigiảicủacácbàitoáncon.

Lậptrìnhđộngcóthểđượctriểnkhaibằngthuậttoánđệquy,trongđógiảiphápcho cácbàitoánconđượctìmthấyđệquyhoặcsửdụngthuậttoánlặp,giảiphápđược tìmthấybằngcáchgiảiquyếtcácbàitoáncontheomộtthứutựcụthể.

Lập trình động dựa trên các nguyên tắc

Đặctrungcấutrúccủalờigiảitốiưu,tứclàxâydựngmôhìnhtoánhọccủalờigiải. Xácđịnhđệquygiátrịcủagiảipháptốiưu.

Sửdụngphươngpháptiếpcậntừdướilên,tínhtoángiátrịcủalờigiảitốiưucho từngbàitoánconcóthểxảyra.

Xâydựnggiảipháptốiưuchobàitoánbanđầubằngcáchsửdụngthôngtinđược tínhtoánởbướctrước.

1.4 Cácbướcgiảibàitoánbằnglậptrìnhđộng

Các bước giải bIi toán bằng lập trình động

Bước2:Xácđịnhhệthứctruyhồichobàitoántốiưu.

Bước3:TìmnghiệmtốiưucủabàitoánbằnghaiphươngphápTop-Downhoặc Bottom-Up.

Xácđịnhxembàitoáncóthểchiathànhcácbàitoánconnhỏhơnkhông,cóthể giảiquyếtđộclậpvớinhau.

KiểmtraxembàitoáncóthỏamãnnguyênlýBellmanhoặccácđặcđiểmcủaquy hoạchđộnghaykhông.Nhữngđặcđiểmbaogồmbàitoánconchồngchéovàcấu trúctốiưuphụthuộc.

1.4.2 Xácđịnhhệthứcxãhội

Xâydựngmộthệthốngtruyhồiđểtínhtoángiátrịtốiưucủabàitoántừcácbài toánconnhỏhơn. Địnhnghãicáchbiểudiễncáctrạngtháivàcáchchuyểnđổigiữachúng. Xácđịnhcôngthứchoặcquytắcđểtínhtoángiátrịtốiưudựatrêncácgiátrịcủa cáctrạngtháicon.

Cóhaiphươngphápchínhđểtìmnghiệmtốiưucủabàitoán:Top-Down(Đệquy vớighinhớ)vàBottom-Up(Lậpbảng).

TrongphươngphápTop-Down,chúngtasửdụngđệquyvàlưutrữcácgiátrịđã tínhtoántrướcđóđểkhôngphảitínhlại.

TrongphươngphápBottom-Up,chúngtasửdụngmộtbảngđểlưutrữcácgiátrị tốiưuvàđiềnvàobảngtheothứtựcáctrườnghợpcơbảnđếnphứctạp.

1.5 Mộtsốkỹthuậtgiảibàitoánlậptrìnhđộng

Cóhaihướngtiếpcậnđểgiảiquyếtmộtbàitoánbằnglậptrìnhđộng

1.5.1Top-Down(Từtrênxuống–Ghinhớ)

TheohướngtiếpcậnTop-Downchúngtasẽbắtđầubằngbàitoánlớnnhấthaybài toánởmứctrêncùngsauđódùngphươngphápđệquyđểgọilờigiảichocácbài toánconởmứcthấphơntiếptheo.Quátrìnhtiếptụcchođếnkhigặpbàitoánnhỏ nhất.Đệquysẽtựđộngtổhợpkếtquảcácbàitoánconđểđượckếtquảbàitoánban đầu.Cáchnàyđòihỏitốnnhiềuthờinguyênđểghinhớtấtcảkếtquảcủacácbài toáncon.

Việcthựchiệncácloạighinhớphụthuộcvàocácthamsốthayđổichịutráchnhiệm giảiquyếtvấnđề.Cónhiềukíchthuốckhácnhaucủabộnhớđệmđượcsửdụng trongkỹthuậtghinhớ.Dướiđâylàmộttrongsốđó:

Ghinhớ1D:Hàmđệquychỉcómộtđốisốcógiátrịkhôngđổisaumỗilầngọihàm. Ghinhớ2D:Hàmđệquychỉcóhaiđốisốcógiátrịkhôngđổisaumỗilầngọihàm. Ghinhớ3D:Hàmđệquychỉcóbađốisốcógiátrịkhôngđổisaumỗilệnhgọihàm. Kếtluận:Ghinhớlàmộtkháiniệmlậptrìnhvàcóthểđượcápdụngchobấtkỳngôn ngữnào.Mụctiêutuyệtđốicủanólàtốiưuhóachươngtrình.Thôngthườngvấnđề nàyxuấthiệnkhicácchươngtrìnhthựchiệncácphéptínhnặng.Kỹthuậtnàyđược lưutrữtátcảkếtquảđượctínhtoántrướcđóđểkhôngphảitínhtoánlạichocùng mộtvấnđề.

1.5.2Bottom-Up(Từdướilên–Lậpbảng)

HướngtiếpcậnBottom-Upđầutiênchúngtagiảicácbàitoánconởmứcthấpnhất sauđódùngcáckếtquảnàyđểtínhbàitoánởmứctrên.Quátrìnhtiếptụcchođến khichúngtatìmđượckếtquảbàitoánmứccaonhất.Hướngnàykhôngđòihỏiphải lưulạikếtquảcủatấtcảcácbàitoáncon.

Chiếnlượctừdướilêntronglậptrìnhđộnglàlậpbảng

Kếtquảcủacácbàitoánconđượclưutrữtrongmộtbảng,thườnglàmộtmảng Sosánhviệclậpbảngvớiviệcghinhớvềđộphứctạpvềthờigian,việclậpbảng thườngsẽhiệuquảhơn.

Việclậpbảngđượcthựchiệntheocácbướcsau:

Xácđịnhcácyếutốcầntốiưuvàxácđịnhrõràngvấnđềcầngiảiquyết. Tạomộtbảngđểchứakếtquảcủacácbàitoáncon(thườnglàmộtmảng).Sự cốxácđịnhkíchthướccủabảng.

Tạotrườnghợpcơsởhoặcgiátrịbanđầuchobảng.Nhữngconsốnàyđại diệnchocâutrảlờichocácbàitoánconnhỏnhất. Điềnvàobảngtừcácbàitoánconnhỏnhấtđếnbàitoánlớnnhấtbằngcáchsử dụngphéplặp(thườnglàcácvònglặp).Dựatrêncácbàitoánconđãtínhtoán trướcđó,hãyxácđịnhlờigiảichotừngbàitoáncon.

Khibảngđượcđiềnđầyđủ,kếtquảcuốicùngthườngđượctìmthấyởmục cuốicùngcủabảng.

Kếtluận:Lậpbảnglàmộtkỹthuâthmạnhmẽtrongquyhoạchđộngđểgiảiquyết cácvấnđềphứctạpmộtcáchhiệuquảbằngcáchlưutrữkếtquảcácbàitoáncon trongmảng.

1.5.2 Sosánhlậpbảngvàghinhớ

Ghinhớ:Cáchtiếpcậntừtrênxuống

Lưutrữkếtquảcủalệnhgọi

Hàmtriểnkhaiđệquy

Rấtphùhợpchocácbàitoáncótậphợpđầuvàotươngđốinhỏ Đượcsửdụngkhicácbàitoánconcócácbàitoánconchồngchéo.

Lậpbảng:Cáchtiếpcậntừdướilên

Lưutrữkếtquảcủacácbàitoáncontrongmộtbảng

Phùhợpchoáccbàitoáncótậphợpđầuvàolớn Đượcsửdụngkhicácbàitoánconkhôngtrùngnhau.

Tìnhtrạng Quan hệ  chuyển trnagj  thái  rất Quanhệchuyểntrạngtháidễnghĩ

Một số kỹ thuật giải bIi toán lập trình động

Mãsố Mã trở  nên phứuc  tạp  khi yêu cầunhiềuđiềukiện

Mãdễdàngvàítphứctạphơn

Tốcđộ Nhanh  chóng, vì  truy  cập trực tiếpvàocáctrạngtháitrướcđó từbảng

Chậmdocónhiềulệnhgọiđệquy vàbáocáotrảvề

Giảiquyếtvấn đềphụ

Nếu  một  số  bài  toán  con  trong khônggianbài

Tiếpcận Lậpbảng là mộtcách tiếp cận lặpđilặplại

Ghinhớlàmộtcáchtiếpcậnđệ quy

Bảng1:Sosánhlậpbảngvàghinhớ

TÌM HIỂU VỀ LÝ THUYẾT TRÒ CHƠI

Trạng thái trò chơi

3 3 TrạngtháiW-Lcủađồthịtrạngthái

2 2 Trạngtháicủatròchơitrênđồthịtrạngthái

4 4 ĐồthịtrạngtháicócácsốGrundy

5 5 Trạngtháikhởiđầucủatròchơimêcung

6 6 TrạngtháikhởiđầucủatròchơimêcungcósốGrundy

7 7 Trạngtháikhởiđầutròchơiphụ

8 8 TrạngtháikhởiđầucủatròchơiphụcósốGrundy

1 Tínhcấpthiếtcủađềtài

Trongcuộcsống,tấtcảchúngtađềucólýdocánhânchosựlựachọncủamình. Chúngtalựachọndựatheotìnhhuốnghoặcnhữnggìchúngtanghĩlàphùhợp vớibảnthânmìnhhoặccảvớinhữngngườikhác.Mụcđíchchínhcủacácsựlựa chọnnàylàlàmnhữnggìtốtnhất(haycólợinhất)chobảnthân.Lý thuyết trò chơi (Game theory)đãrađờitừđó,làmôhìnhđểnghiêncứucáctìnhhuống mangtínhmâuthuẫnmàtrongđócácbênthamgiasẽlựachọncáchànhđộng khácnhauđểcốgắnglàmtốiưuhóacáckếtquảnhậnđược.Ngàynay,nóđượcáp dụngrộngrãitrongmọikhíacạnhcủađờisống,đặcbiệtlàtrongkinhtế,chínhtrị, lýluận,khoahọcmáytính, Vìthế,ngườinàonắmrõđượccácquytắcvàáp dụnghiệuquảLýthuyếttròchơisẽcónhiềukhảnăngnângcaođượcquyềnlực, địavịtrongxãhội,cũngnhưkiếmvàtiếtkiệmđượcnhiềutiềnhơn.

LýthuyếttròchơilàmộtcôngcụthuộcToánhọcứngdụng,vìthếnócóthểđược biểudiễndướidạngtoán.Tuynhiênởbàiviếtnày,tôichỉmuốngiảithíchmột cáchđơngiảnvàchỉramộtsốcácứngdụngcủaLýthuyếttròchơitrongthựctế. Nhìnchung,“Tròchơi”(Game)ởđâychínhlàcáctìnhhuốngđòihỏinhững ngườithamgia(hayngườichơi)phảiđưaracácquyếtđịnh,vídụnhưliệusẽra đấm,kéohaylákhioẳntùtì;quyếtđịnhsẽmuahaybánkhiđầutưchứngkhoán; quyếtđịnhsẽtấncônghayphòngngựtrongtrậnbóng; Điềuquantrọnglàkết quảvàlợiíchđạtđượcsẽphụthuộcvàoquyếtđịnhcủatấtcảcácbênthamgia,ví dụtôirađấmthìđốiphươngphảirakéothìtôimớithắng;hoặckhitôimuachứng khoánthìnhữngngườikháccũngphảimuatheothìtôimớicólãi.Dođó,xây dựngmôhìnhLýthuyếttròchơisẽgiúpchúngtađưarađượcphươngántốtnhất khibịbuộcphảilựachọn.

Các  dạng  cơ  bản  của  Lý  thuyết  trò  chơi  có  thể  bao  gồm  dạng  đối  xứng(Symmetric),  tổng  bằng  không  (Zero-sum),  đồng  thời  (Simultaneous),  Tuy nhiên,nhìnchungthìnógiúptathấyđượcbảnchấtcủacáctìnhhuốngđượctạora vàcáclựachọncóthểgiúpgiảiquyếttìnhhuốngđómộtcáchtốtnhấtchochính mìnhcũngnhưnhữngngườikhác.Lýthuyếttròchơicóthểđượcápdụngvàorất nhiềutrườnghợpthựctếtrongcuộcsốngmộtcáchtươngtự.Dođóđềtài“Lập trìnhđộngtronglýthuyếttròchơi”đượcchọnđểthựchiệnđồántốtnghiệp.Lý thuyếttròchơivàlậptrìnhđộnglàhailĩnhvựccósựquanđiểmrấtmạnhmẽ trongkhoahọcmáytính.Sựkếthợpgiữachúngcungcấpcáccôngcụhữuíchđể nghiêncứu,phântíchvàgiảiquyếtcácvấnđềphứctạpliênquanđếntốiưuhóa chiếnlượcvàđưaraquyếtđịnhtrongcáctròchơivàứngdụngthựctế.Lậptrình độngtronglýthuyếttròchơicungcấpmộtloạtcácbàitoánphongphúvàđa dạng.TừviệctínhtoángiátrịGrundychocáctròchơiphứctạpnhưNim,đếntìm kiếmchiếnlượctốiưutrongcáctròchơibàncờnhưtic-tac-toe,chess,haytốiưu hóacácchiếnlượctrongcácmôhìnhthựctế,nhữngbàitoánnàythúvịvàmang tínhthửtháchcao.Nghiêncứuvàthựchiệncácbàitoánlậptrìnhđộngtronglý thuyếttròchơimanglạitrảinghiệmthúvịvàhấpdẫn.Việctìmhiểucáchmáy tính"suynghĩ"vàđưaraquyếtđịnhtrongcáctìnhhuốngđốikhángnhưtrongtrò chơimanglạisựhứngthúvàkhámpháliêntục.Tómlại,lựachọnđềtài"Lập trìnhđộngtronglýthuyếttròchơi"làmộtsựkếthợptuyệtvờigiữalýthuyếtvà thựctiễn,giúppháttriểnkỹnăngnghiêncứuvàlậptrìnhtronglĩnhvựclýthuyết tròchơivàkhoahọcmáytính.

Mụcđíchchínhcủanghiêncứunàylànângcaohiểubiếtvềlýthuyếttròchơivà cácphươngpháptínhtoántronglýthuyếtnày.Lýthuyếttròchơilàmộtlĩnhvực quantrọngtrongkhoahọcmáytính,vàviệcnghiêncứuvềlậptrìnhđộngtrong ngữcảnhnàygiúpcủngcốkiến thứcvềcácthuậttoánvàkỹthuậtquantrọng.Nghiêncứuvềlậptrìnhđộngtronglýthuyếttròchơicungcấpcơhộiápdụngcác kiếnthứcvàkỹnăngvàogiảiquyếtcácvấnđềthựctế.Vídụ,ápdụngcácthuật toánlậptrìnhđộngđểtốiưuhóachiếnlượctrongcácứngdụnggame,hoặctrong cáclĩnhvựckhácnhưtrítuệnhântạovàtốiưuhóa.Tăngcườngkỹnănglậptrình vàkhảnănggiảiquyếtcácbàitoánphứctạp.Việcthựchiệncácthuậttoánlập trìnhđộngtrongcáctròchơicạnhtranh(competitiveprogramming)cũnggiúprèn luyệntưduylogicvàsángtạo.

3 Kếtcấucủađềtài

Chương1:Tổngquankiếnthứcvềlậptrìnhđộng.

Chương2:Tìmhiểuvềlýthuyếttròchơi.

Chương3:Tìmhiểutròchơinđồngxu.

CHƯƠNG 1: TỔNG QUAN VỀ LẬP TRÌNH ĐỘNG

1.1.1 Kháiniệmvềquyhoạchđộng

Lậptrìnhđộng(DynamicProgramming)làmộtphươngphápđượcsửdụngtrong toánhọcvàkhoahọcmáytínhđểgiảiquyếtcácvấnđềphứctạpbằngcáchchia chúngthànhnhữngbàitoánconđơngiảnhơn.Bằngcáchgiảimỗibàitoánconchỉ mộtlầnvàlưutrữkếtquả,nótránhđượccácphéptínhdưthừa,dẫnđếngiảipháp hiệuquảhơnchonhiềubàitoán.

1.1.2 Lậptrìnhđộnghoạtđộngnhưthếnào?

Xácđịnhcácvấnđềphụ:chiavấnđềchínhthànhcácvấnđềphụnhỏhơn,độc lập.

Lưutrữgiảipháp:giảiquyếttừngbàitoánconvàlưutrữgiảiphpastrongmột bảnghoặcmảng.

Xâydựnggiảipháp:sửdụngcácgiảiphápđượclưutrữđểxâydựnggiảiphápcho vấnđềchính.

Tránhdưthừa:bằngcáchlưutrữlờigiải,quyhoạchđộngđảmbảorằngmỗibài toánconchỉđượcgiảimộtlần,giảmthờigiantínhtoán.

Ví dụ về lập trình động:XétbàitoántìmdãyFibonacci

ChuỗiFibonaccisửdụnglậptrìnhđộng:

Giảipháplưutrữ:TạomộtbảngđểlưutrữcácgiátrịcủaF(n)khichúng đượctínhtoán.

Xâydựnglờigiải:ĐốivớiF(n),hãytracứuF(n-1)vàF(n-2)trongbảngvà cộngchúnglại.

Tránhdưthừa:Bảngđảmbảorằngmỗibàitoáncon(vídụF(2))chỉđược giảimộtlần.

Bằngcáchsửdụnglậptrìnhđộng,chúngtacóthểtínhtoándãyFibonaccimột cáchhiệuquảmàkhôngcầnphảitínhtoánlạicácbàitoáncon.

1.1.3 Khinàosửdụnglậptrìnhđộng

Lậptrìnhđộnglàmộtkỹthuậttốiưuhóađượcsửdụngkhigiảiquyếtcácvấnđề baogồmđặcđiểmsau:

Cấutrúctốiưucónghĩalàchúngtakếthợpcáckếtquảtốiưucủacácbàitoán conđểđạtđượckếtquảtốiưucủabàitoánlớnhơn.

Xétvấnđềtìmđườngdẫnchiphítốithiểutrongbiểuđồcótrọngsốtừnút nguồnđếnnútđích.Chúngtachiabàitoánnàythànhcácbàitoánconnhỏ hơn:

Tìmđườngđicóchiphítốithiểutừnútnguồnđếnmỗinúttrung gian.

Tìmđườngđicóchiphítốithiểutừmỗinúttrunggianđếnnútđích. 1.1.3.2 Cácbàitoánconchồngchéo

Cácbàitoáncongiốngnhauđượcgiảilặpđilặplạiởcácphầnkhácnhaucủa bàitoán.

Vídụ:XétbàitoántínhdãyFibonacci.ĐểtínhsốFibonaccitạichỉsốn,chúng tacầntínhsốFibonaccitạichỉsốn-1vàn-2.Điềunàycónghĩalàbàitoáncon tínhsốFibonaccitạichỉsốn-1đượcsửdụnghailầntronglờigiảichobàitoán lớnhơnlàtínhsốFibonaccitạichỉsốn

1.1.4 Cácphươngpháplậptrìnhđộng

Lậptrìnhđộngcóthểđạtđượcbằnghaicáchtiếpcận:

1.1.4.1 Cáchtiếpcậntừtrênxuống(Top-Down)

Trongcáchtiếpcậntừtrênxuống,cònđượcgọilàghinhớ(memoization), chúngtabắtđầuvớilờigiảicuốicùngvàchianóthànhcácbàitoánconnhỏ hơnmộtcáchđệquy.Đểtránhtínhtoándưthừa,chúngtôilưutrữkếtquả củacácbàitoánconđãgiảitrongbảngghinhớ.

Phântíchcáchtiếpcậntừtrênxuống:

Bắtđầuvớilờigiảicuốicùngvàchiathànhcácbàitoánconnhỏhơn. Lưutrữlờigiảicủacácbàitoáncontrongmộtbảngđểtránhtínhtoán dưthừa.

Thíchhợpkhisốlượngbàitoánconlớnvànhiềubàitoánconđượcsử dụnglại.

1.1.4.2 Cáchtiếpcậntừdướilên(Bottom-Up)

Trongcáchtiếpcậntừdướilên,cònđượcgọilàlậpbảng(tabulation),chúng tabắtđầuvớicácbàitoánnhỏnhấtvàdầndầnxâydựngđếnlờigiảicuối cùng.Chúngtalưutrữukếtquảcủacácbàitoánconđãgiảitrongmộtbảngđể tránhtínhtoándưthừa.

Phântíchcáchtiếpcậntừdướilên:

Bắtđầuvớinhữngbàitoánnhỏnhấtvàdẫndầnxâydựnglờigiảicuối cùng. Điềnvàibảngcácgiảiphápchocácbàitoáncontheocáchtừdướilên. Thíchhợpkhisốlượngbàitoánconnhỏvàlờigiảitốiưucóthểđược tínhtrựctiếptừlờigiảicủabàitoánconnhỏhơn.

1.1.5 Ứngdụngcủalậptrìnhđộng

Lậptrìnhđộngcónhiềuứngdụng,baogồm:

Tốiưuhóa:bàitoánbalo,đườngđingắnnhất,mảngcontốiđa.

Khoahọcmáytính:dãyconchungdàinhất,chỉnhsửakhoảngcách,khớp chuỗi.

Nghiêncứuhoạtđộng:quảnlýhàngtồnkho,lậpkếhoạch,phânbổnguồn lực.

1.2 Đặcđiểmcủalậptrìnhđộng

Lậptrìnhđộnglàmộttrongnhữngkỹthuậtmạnhmẽnhấtđểgiảiquyếtmộtloạivấn đềnhấtđịnh.

Cómộtcáchhayđểhìnhthànhcáchtiếpcậnvàquytrìnhtưduyrấtđơngiản,đồng thờiphầnmãhóacũngrấtdễdàng.

Vềcơbản,đólàmộtlýtưởngđơngiản,saukhigiảiquyếtmộtvấnđềvớimộtđầu vàonhấtđịnh,lưujeetsquảlàmtàiliệuthamkhảođểsửdụngchotươnglai. Lờigiảicủacácbàitoánconđượclưutrữutrongmộtbảnghoặcmảng(ghinhớ)hoặc theocáchtừdướilên(lậpbảng)đểtránhtínhtoándưthừa.

Lờigiảibàitoáncóthểđượcxâydựngtừlờigiảicủacácbàitoáncon.

Lậptrìnhđộngcóthểđượctriểnkhaibằngthuậttoánđệquy,trongđógiảiphápcho cácbàitoánconđượctìmthấyđệquyhoặcsửdụngthuậttoánlặp,giảiphápđược tìmthấybằngcáchgiảiquyếtcácbàitoáncontheomộtthứutựcụthể.

Đồ thị trạng thái của trò chơi (State graph)

Xétmộttròchơigậykhác,khitrongmỗitrạngtháik,tađượcphéploạibỏsốlượngx gậybấtkỳnàosaochoxnhỏhơnkvàchiahếtchok

Vídụtrongtrạngthái8chúngtacóthểbỏ1,2hoặc4gậy,nhưngtrongtrạngthái7 chúngtachỉđượcloạibỏ1gậy.

Hìnhsauchỉracáctrạngthái1…9củatròchơibằngđồthịtrạngthái,khimỗiđỉnhlà mộttrạngtháivàcáccạnhlàcácđườngđigiữachúng.

Hình2:Trạngtháicủatròchơitrênđồthịtrạngthái

Trạngtháicuốicùngtrongtròchơinàyluônlàtrạngthái1,làtrạngtháithuavìkhông cónướcđihợplệ.Việcphânloạicáctrạngthái1…9nhưsau:

Bảng3:TrạngtháiL-Wcủađồthịtrạngthái

Trongtròchơinày,tấtcảcáctrạngtháisỗchẵnlàcáctrạngtháisốchẵnđềulàtrạng tháithắngvàtấtcảcáctrạngtháisốlẻlàtrạngtháithua.

Trò chơi tổ hợp cân bằng

Trò chơi tổ hợplàtròchơigồm:hai người chơi (ở đây gọi người chơi trước là và𝐴 người chơi sau là 𝐵),mộttập hữu hạn các trạng thái𝑆(viếttắtcủaState)cóthểđạt đượccủatròchơi.Mỗingườichơicómộttập các bước di chuyển hợp lệ𝑄 đểdi chuyểntừtrạngtháinàysangtrạngtháikhác(gọilàluậtchơi)vàmộttậpcáctrạng tháikếtthúcgọilà𝑇⊂𝑆(viếttắtcủaTerminal).Haingườichơisẽluânphiêndi chuyểntừtrạngtháinàysangtrạngtháikhác.Ngườiđếnđượctrạngtháikếtthúc trướcsẽlàngườichiếnthắng.

Tròchơitổhợpcânbằnglàtròchơiđốikhángthỏamãnnhữngđiềukiệnsau:

Cómộttậphữuhạncácvịtrícóthểxảyra(cáctrạngthái)củatròchơi Cóquyluậtchơiápdụngchohaingườichơilàcânbằng,nghĩalàmỗi ngườichơiđếnlượtmìnhđềucóquyềnchọnmộtphépdichuyểnhợplệtùy ý

Haingườichơilầnlượt,mỗilầnthựchiệnmộtphépdichuyểnhợplệ Tròchơikếtthúckhiđạttớivịtríkếtthúc.Thôngthườngquyđịnhngười chơidichuyểnđượccuốicùnglàngườichiếnthắng,ngườinàođếnlượtmà kdichuyểnđượcnữathìthua

Nếutròchơikhôngbaogiờkếtthúcsẽcómộtthôngbáorútthăm.Cóthể bổsungthêmđiềukiệnnàođóđểtròchơikếtthúckhoongcângthôngbáo rútthămnhưPtròchơisẽkếtthúckhiđãcóđủsốlầndichuyểnnhấtđịnh màkhôngaithắngthìhaiđấuthủhòa.

2.4.2TậpP,tậpNvàcáchtìm Đểthuậntiệnchoviệcxâydựngthuậttoán(giànhthắng)củatròchơi,ngườitađưara kháiniệmtậpPvàtậpN.Đólàhaitậpthỏamãncáctínhchấtsau:

N:tậpcáctrạngtháix Ssaochonếutrạngtháibanđầucủatròchơilà xthìngười chơi trướcluônchiếnthắng

P:tậpcáctrạngtháix Ssaochonếutrạngtháibanđầucủatròchơilà xthìngười chơi sauluônởtrạngtháithắng.

Từđịnhnghĩatrên,NvàPsẽthỏamãnbatínhchấtsau:

TậpPphảichứatoànbộtrạngtháikếtthúc

VớimỗitrạngtháisthuộctậpN,tồntạiítnhấtmộttrạngtháis’đếnđượctừsmà thuộctậpP

VớimỗitrạngtháisthuộctậpP,tấtcảcáctrạngtháis’đếnđượctừsphảithuộcN Ràngbuộcđầutiênxácđịnhtrườnghợpcơbảnnhất.Hairàngbuộcsausẽgiúpchúng taliêntụcđệquytừtrườnghợpcơbảnđểxâydựngđượctậpPvàNhoànchỉnh.Ta sẽthấyrõđiềunàyởphầnThuật toán xác định tập vI NP

KhixâydựngđượctậpPvàNtheocácràngbuộctrên,tacóthểdễdàngxâydựng chiếnthuậtthắngchongườichơiAnhưsau(dođâylàtròchơitổhợpcânbằngnên chiếnthuậtthắngcủaBcũngsẽtươngtự):

1 Nếu𝐴bắt đầu ở trạng thái thuộc N,luôn đi tới trạng thái thuộc Pđể épBđivàotrạngtháithuộcN.Dongườithắnglàngườiđivàotrạngtháikết thúc,màtrạngtháikếtthúclạithuộcPnênchắcchắnAsẽthắng.

2 NếuAbắtđầuởtrạngtháithuộcP,Achỉcóthểkéodàivánđấuvàđợisơ hởcủaB(BđivàovịtríthuộcN)vàdùngchiếnthuậtthắngởtrườnghợp đầu.TuynhiênnếuBcũngchơitốiưuthìchắcchắnAsẽthua.

2.4.3TổngNimvàtròchơiNim

TổngNimcủahaisốnguyênkhôngâmlàkếtquảcủaphépcộngkhôngnhớcủahai sốđótronghệcơsố2(còngọilàcộngtheomodun2).

Số3hệthậpphânviếtdướidạng cơsố2là

Số5hệthậpphânviếtdướidạng cơsố2là

Số8hệthậpphânviếtdướidạng cơsố2là

TổngNimcủachúnglà: 1110(là14tronghệthậpphân)

Phéptoán (tínhtổngNim)làxorcótínhchấtkếthợp,giaohoán.Đặcbiệt: 0 a=a,a a=0,dođónếua b=a cthìb=c

TròchơiNimlàmộttròchơiđơngiảnnhưngcómộtvaitròquantrọngtronglý thuyếttròchơi,vìnhiềutròchơikháccóthểđượcchơibằngchiếnlượctươngtự. Đầutiênchúngtasẽtậpchungvàonim,sauđóchúngtasẽtạorachiếnlượcchocác tròchơikhác.

Cónđốnggậytrongnim,vàmỗiđốngbaogồmmộtsốcâygậy.

Ngườichơilầnlượtdichuyểnvàởmỗilượt,ngườichơichọnmộtđốngcònchứa gậyvàloạibỏsốlượnggậybấtkỳkhỏiđó

Ngườichiếnthắnglàngườiloạibỏcâygậycuốicùng.

Chúngtacóthểdễdàngphânloạibấtkỳtrạngtháinimnàobằngcáchtínhtổngnims

=x1 x2 … xn,trongđó làphéptoánxor.

Cáctrạngtháicótổngnim=0làtrạngtháithuavàtấtcảcáctrạngtháikháclàtrạng tháithắng.

Trạng thái thua:trạngtháicuốicùng[0,0,…0]làtrạngtháithua,vàtổngnimcủa nólà0.

Trongcáctrạngtháithuakhác,baogồmbấtkỳnướcđinàodẫnđếntrạngtháithắng, vìkhigiátrịxkthayđổi,tổngnimcũngthayđổi,dođótổngnimkhác0saunướcđi.

Trạng thái thắng:chúngtacóthểdichuyểnđếntrạngtháithuanếucómộtđốngbất kỳmàxk s0nênnólàvịtríN

Trạngthái[4,12,8]tươngứngvới4 12 8=0nênnólàvịtríP

TừđịnhlýsuyrachiếnthuậtgiànhthắngtrongtròchơiNimchuẩnnhưsau: Giảsửhiệntạilà(x1,x2,…,xn)tươngứngvớitổngNimlà: g=x1 x2 … xn>0

Cóthểchứngminhsẽtồntạithànhphầnximàxi’=g xi xi.Cáchđểgiànhchiến thắnglàgiảmxithànhx’i.

Trạngtháimới(x1,x2,…,x(i-1),x’i,x(i+1),…,xn)cótổngNimlàg’=0vì: g’=x1 x2 … x(i-1) x(i+1) … xn

QuađịnhlýBouton,chúngtacómộtcáchxácđịnhPvàNdựatrêntổngNim,vàtừ việcchứngminhđịnhlýBouton,takhôngchỉbiếtđượctrạngtháithắng–thuacủa tròchơimàcòncóthểxâydựngđượcmộtchiếnthuậtthắngcụthể.

2.4.6Tròchơitrênđồthị

Mộtsốđồchơicóthểmôtảbằngđồthịcóhướng.Mỗivịtrícủatròchơiđượccoi nhưmộtđỉnhcủađồthịvàmỗiphépdichuyểnhợplệđượcxemnhưmộtcũngdẫntừ đỉnhnàysangđỉnhkhác.ChúngtasẽđinhjnghĩahàmSprague–Grundy(SG)đểxác địnhđượccácvịtríPhoặcNcủatròchơitrênđồthị. ĐồthịtròchơilàđồthịcóhướngG=(X,F)vớiXlàtậpđỉnhkhôngrỗng–làtậpcác vịtrícủatròchơivàFlàhàmtrêntậpXsaochovớimỗix XthìF(x)làmộttập conthuộcXtứclàx X F(x) X.CácđỉnhthuộcF(x)đượcgọilàcácđỉnhcó thểtớitừđỉnhx.NếuF(x)rỗngthìxlàđỉnhkếtthúc.Mộtphépdichuyểnhợplệlàđi từđỉnhxtớimộtđỉnhthuộcF(x).

Tròchơitổhợpcânbằngcó2ngườiđượcmôphỏngtrênđồthịG=(X,F)vớiđỉnh xuấtphátx0 Xvàtuântheocácquytắcsau:

(1) Ngườichơithứunhấtđitrướcvàbắtđầutừđỉnhx0

(2) Haingườichơilầnlượtthựchiệnphépdichuyểntrênđồthị (3) Tạivịtríx,ngườichơiđượcdichuyểnđếnbấtkìy F(x)

(4) Ngườichơinàođếnlượtphảinhậnđỉnhkếtthúclàngườithua.

2.4.7ĐịnhlýSprague–Grundy ĐịnhlýSprague–Grundyphátbiểurằng:mọitròchơitổhợpcânbằngkếtthúctrong hữuhạnbướcđềutươngđươngvớitròchơiNimmộtcột,trongđótrạngtháixcủatrò chơihiệntạitươngứngvớitrạngtháitròchơiNimmộtcộtcóg(x)viênsỏi,trongđó g(x)làgiátrịcủaSprague–Grundycủax.

Trò chơi hai người có tổng điểm bằng 0

2.5.1ĐịnhlýMinimax ĐịnhlýMinimaxlàmộtlýthuyếtcơbảntronglĩnhvựctròchơivàtrítuệnhân tạo,đặcbiệtlàtrongcáctròchơihaingườicótínhcạnhtranhvàcóthôngtinhoàn toàn(zero-sumgames).Địnhlýnàynóivềmốiquanhệgiữahaingườichơitrong tròchơinàyvàmôtảcáchtốiưuhóachiếnlượccủamỗingườichơi.

Các yếu tố chính của định lý Minimax lI:

Zero-sum game (trò chơi tổng điểm bằng 0):ĐịnhlýMinimaxápdụngchocác tròchơizero-sum,nghĩalàtổngsốđiểmcủacácngườichơilàkhôngđổisaumỗi nướcđi.Nếumộtngườichơiđạtđượclợiích,thìngườichơicònlạisẽchịuthiệt hạitươngứng.

Tối ưu hóa chiến lược:ĐịnhlýMinimaxchobiếtcáchmỗingườichơinênlựa chọnnướcđitốiưunhấtdựatrêncáclựachọncósẵncủađốiphương.Mụctiêulà tốiđahóalợiíchcủangườichơihiệntại,đồngthờitốithiểuhóalợiíchtốiđacủa đốiphương.

Cây quyết định (game tree):ĐịnhlýMinimaxđượcápdụngtrêncâyquyếtđịnh củatròchơi,trongđómỗinútđạidiệnchomộttìnhhuốngtròchơisaumỗinước đi.Cácnútláđạidiệnchocáctrạngtháikếtthúccủatròchơi. ĐịnhlýMinimaxlàmộtkháiniệmquantrọngtronglýthuyếttròchơi,đặcbiệtlà trongcáctròchơitổng-không(zero-sumgame)giữahaingườichơi,nơilợiích củamộtngườichínhlàtổnthấtcủangườikia.Địnhlýnàyđượcpháttriểnbởi JohnvonNeumann,vànóđặtnềntảngchohiểubiếtvềchiếnlượctốiưutrongcác tìnhhuốngcạnhtranh.

Giải thích Định lý Minimax: ĐịnhlýMinimaxkhẳngđịnhrằngtrongmộttròchơitổng-khôngvớithôngtin hoànchỉnh,cómộtgiátrịcụthể(gọilàgiátrịMinimax)màtạiđó:

Ngườichơithứnhất(gọilà"Maximizer")cóthểđảmbảorằng,vớichiếnlượctối ưucủamình,ítnhấtsẽthuđượcgiátrịnàybấtkểchiếnlượccủangườichơithứ hai.

Ngườichơithứhai(gọilà"Minimizer")cóthểngănchặnngườichơithứnhấtthu đượcnhiềuhơngiátrịnàyvớichiếnlượctốiưucủamình.

Công thức: maxx∈X miny∈Y f x y( , )=miny∈Y maxx∈X f x y( , )

Trongđó: xvà làcácchiếnlượccủahaingườichơi.y f x y( , )làhàmchitrả,đolườngkếtquảcủatròchơidựatrênsựlựachọnchiếnlược củacảhaingườichơi.

Ngườichơi"Maximizer"tìmcáchtốiđahóagiátrịtốithiểumàhọcóthểbịép nhận.

Ngườichơi"Minimizer"tìmcáchtốithiểuhóagiátrịtốiđamàđốithủcóthểđạt được. Ý nghĩa: Địnhlýnàycungcấpcơsởchochiếnlượctốiưukhicácngườichơiđốiđầunhau vớimụctiêuhoàntoànđốilập.Nóchophépmỗingườichơixácđịnhcáclựachọn tốiưucủahọkhibiếtđốithủcũngsẽchơimộtcáchtốiưu.Điềunàyđặcbiệtquan trọngtronglậpkếhoạchchiếnlượcvàraquyếtđịnh,từtròchơicờtớiđàmphán kinhdoanh,vàthậmchílàtronglĩnhvựcquânsự.

Trongcáctròchơithực tếnhưtròchơichọnđồngxu, việcápdụngđịnhlý Minimaxgiúpngườichơixácđịnhnhữnglựachọnmanglạilợiíchtốithiểuan toànnhấttrongkịchbảnxấunhất,từđóđảmbảokếtquảtốtnhấtcóthểkhicảhai bêncạnhtranhđềuchơitốiưu.

Cách áp dụng công thức Minimax trong bIi toán:

Công thức cập nhật dp[i][j]: dp i j[ ][ ]=max(min(A,B),min(C,D))

A =coins[i dp i]+ [ +2][ ]:Điểmsốkhingườichơichọnđồngxui,vàsauđój đốithủchọnđồngxui+1.

B =coins[i dp i]+ [ +1][ −1]:Điểmsốkhingườichơichọnđồngxui,vàđốij thủchọnđồngxu j

C =coins[j dp i]+ [ +1][ −1]:Điểmsốkhingườichơichọnđồngxuj,vàđốij thủchọnđồngxu i

D =coins[j dp i j]+ [ ][ −2]:Điểmsốkhingườichơichọnđồngxuj,vàsauđó đốithủchọnđồngxuj-1.

Maximization:Ngườichơichọngiữahailựachọn(chọnđồngxu hoặcj)i đểtốiđahóađiểmsốtốithiểumàhọcóthểthuđược.Điềunàythểhiệnvai tròcủa"Maximizer"trongMinimax.

Minimization:Đốithủsẽcốgắngtốithiểuhóađiểmsốmàngườichơicó thểthuđượctronglượttiếptheobằngcáchchọnđồngxutốiưucủahọ. Điềunàythểhiệnvaitròcủa"Minimizer".

Chiến lược tối ưu:Chiếnlượcnàyđảmbảorằngdùđốithủcólựachọnnhưthế nào,ngườichơicũngđãchọnđượclựachọntốtnhấtcóthểdựatrêngiảđịnhđối thủchơitốiưu.

Cân bằng Nash:Trạngtháitrongđókhôngcóngườichơinàocóđộngcơđểthay đổichiếnlượccủamìnhmộtcáchđơnphương.

Cân bằng Nashlàmộtkháiniệmquantrọngtronglý thuyết trò chơi mang lại kết quả tối ưutrongtrườnghợpngườichơikhông đi chệchkhỏichiếnlượcban đầucủahọ.Điềunàyđượcthựchiệnđểđáplạiviệckhôngcóđộngcơnàocung cấpchongườichơivềsựsailệchnhưvậy.TròchơinàyđượcđặttheotêncủaNhà toánhọcJohnNash,ngườixácđịnhlờigiảicủamộttròchơikhônghợptáccósự thamgiacủahaingườichơitrởlên.

Bởivìchiếnlượcvẫntốiưuvàngườidùngkhôngnhậnđượcbấtkỳưuđãinào cũngbiểuthịrằngnhữngngườichơiđãbiếtvềchiếnlượccủanhauvàdođósẽ khôngđichệchhướngchútnào.

Vìngườichơikhácvẫnkhôngthayđổichiếnlượccủamìnhnênmộtcánhân khôngthểnhậnđượclợiíchgiatăngnàotừsựsailệchđó.Một trò chơi có thể có nhiều hoặc không có điểm cân bằng Nash.

CânbằngNashcungcấpmộtgiải pháp tối ưuđểđạtđượckếtquảmong muốnbằngcáchkhôngđichệchkhỏichiếnlượcbanđầucủahọ.

ỨNG DỤNG LẬP TRÌNH ĐỘNG TRONG LÝ THUYẾT TRÒ CHƠI N ĐỒNG XU

Giới thiệu về trò chơi n đồng xu

Bốicảnh:cónđồngxutrênbàn,mỗiđồngxucógiátrịkhácnhau.Haingườichơi thaynhauchọnmộtđồngxutừmộttronghaiđầucủadãyxu

Mụctiêu:mỗingườicốgắngthuthậpsốtiềnnhiềunhấtcóthể.Ngườichiếnthắng làngườicótổngsốtiềnnhiềuhơnkhitấtcảcácđồngxuđềuđãđượcchọn.

Chiếnlược:sửdụnglậptrìnhđộngđẻxácđịnhchiếnlượctốiưucủamỗingười chơi.Mỗiquyếtđịnhsedựavàotrạngtháihiệntạicủatròchơivàgiátrịdựkiến củacácnướcđitươnglai.

Các khía cạnh của lý thuyết trò chơi trong bIi toán nIy

Chiến lược Tối ưu:Trongbàitoánnày,mỗingườichơicầnphảixemxétchiến lượctốiưukhôngchỉdựatrêngiátrịhiệntạimàcòndựatrêncáclựachọntiếp theocủađốithủ.Chiếnlượcnàydựatrênviệcdựđoánvàphảnứnglạihànhđộng củađốithủ,điểnhìnhcholýthuyếttròchơi.

Dự đoán hInh động của đối thủ:Ngườichơikhôngchỉtínhtoánlựachọndựa trêngiátrịtrựctiếpcủađồngxumàcòncầnphảidựđoánlựachọntốiưucủađối thủđểtốiđahóakếtquảcủamìnhtrongtươnglai.Điềunàyđòihỏiviệcxemxét tấtcảcáckhảnăngvàlựachọnphảnứngtốtnhất.

Minimax Algorithm:Côngthứctínhgiátrịdp[i][j]trongtròchơichọnđồngxu phảnánhthuậttoánMinimax,nơimỗingườichơicốgắngtốiđahóalợiíchtối thiểumàhọcóthểnhậnđượcdựatrênsựlựachọntốiưucủađốithủ.Trongđó, ngườichơisẽchọnđộngtháimàtốiđahóalợiíchtốithiểucóthểđạtđược,dựa trêngiảđịnhrằngđốithủcũngchơitốiưu.

Nash Equilibrium:Trongbốicảnhnày,mỗingườichơichọnđồngxusaocho khôngcólựachọntốthơnnếubiếttrướclựachọncủađốithủ,đạtđếnđiểmcân bằngNash,nơikhôngaicóthểcảithiệnvịthếcủamìnhbằngcáchthayđổiđơn phươnglựachọncủahọ.

BIi toán

VớitròchơiNđồngxu,chúngtacóthểmôphỏngchiếnlượcsửdụnglậptrình độngthôngquamộtvídụcụthể.Giảsửcó4đồngxucógiátrịlầnlượtlà2,4, 6và8.Chúngtasẽtìmchiếnlượctốiưuchongườichơiđầutiên,ngườicố gắngthuthậpsốtiềnnhiềunhất.

Bước 1: Xác định các trạng thái vI giá trị

Mỗitrạngtháicủatròchơiđượcbiểudiễnbởicácđồngxucònlạitrênbàn.Chúng tasẽxâydựngmộtmatrậndptrongđódp[i][j]làsốtiềntốiđamàngườichơiđầu tiêncóthểthuđượckhichỉcòncácđồngxutừvịtríiđếnj.

Bước 2: Xây dựng bảng lập trình động

Cáchtínhtoándp[i][j]sẽdựatrênviệcngườichơiđólựachọnđồngxuởđầui hoặccuốij

Nếungườichơichọnđồngxui,đốithủsẽtốiưuhóasốtiềnmàhọcóthểthuđược từđoạn[i+1,j],vìvậysốtiềnngườichơinàythuđượcsẽlàcoins[i]+(tổngđoạn -dp[i+1][j]).

Tươngtự,nếuchọnđồngxuj,sốtiềnsẽlàcoins[j]+(tổngđoạn-dp[i][j-1]).Trongđótổngđoạnlàtổnggiátrịcủađồngxutừiđếnj.

Bước 3: Tính toán bảng giá trị

Giảsửcácđồngxucógiátrịnhưđãđềcập:[1,2,3,4].Tasẽxâydựngbảngdp dựatrêncáctrườnghợpcơbản:

Khii==j,tứcchỉcómộtđồngxu,dp[i][j]=coins[i]vìngườichơisẽchọnđồng xuđó.

1 Biến a:Đâylàtrườnghợpsaukhingườichơihiệntạichọnđồngxuởvịtrí ,đốii thủcóthểchọnđồngxutiếptheoởi+1.Nếuđiềunàyxảyra,lựachọntiếptheo củangườichơihiệntạisẽlàtrongphạmvitừi+2đến  Biến lưugiátrịcủaj a dp[i+2][j],tứcsốtiềntốiđamàngườichơihiệntạicóthểthuđượctừđoạncònlại nếuđốithủchọnđồngxuởi+1.Nếui+2lớnhơn ,tứclàkhôngcònđồngxunàoj đểchọn,giátrịcủa sẽlà0,vìkhôngcònlựachọnnàokhảthi.a

2 Biến b:Đâylàtrườnghợpngườichơihiệntạichọnđồngxuở vàđốithủchọni đồngxuở hoặcngượclại.Sauđó,lựachọntiếptheocủangườichơihiệntạisẽlàj trongphạmvitừi+1đếnj-1.Biến lưugiátrịcủab dp[i+1][j-1],tứcsốtiềntốiđa màngườichơihiệntạicóthểthuđượctừđoạncònlại.Nếui+1lớnhơnj-1,không cònđồngxunàogiữahaivịtrínày,giátrịcủa sẽlà0.b

3 Biến c:Đâylàtrườnghợpsaukhingườichơihiệntạichọnđồngxuởvịtrí ,đốij thủcóthểchọnđồngxutiếptheoởj-1.Sauđó,lựachọntiếptheocủangườichơi hiệntạisẽlàtrongphạmvitừ đếni j-2.Biến lưugiátrịcủac dp[i][j-2],tứcsố tiềntốiđamàngườichơihiệntạicóthểthuđượctừđoạncònlạinếuđốithủchọn đồngxuởj-1.Nếu lớnhơni j-2,tứclàkhôngcònđồngxunàođểchọn,giátrịcủa csẽlà0.

Khởi tạo vI Định nghĩa

3.4.1Khởitạomatrậndp

Mộtmatrậnkíchthước4x4vớitấtcảcácgiátrịkhởitạolà0.

Các trường hợp cơ bản:Đốivớidp[i][i] vớimọi  ,giátrịsẽbằnggiátrịcủai đồngxutạivịtríđó,vìchỉcómộtđồngxuđểchọn. dp[0][0]=2,dp[1][1]=4,dp[2][2]=6,dp[3][3]=8

Khitínhdp[i][j],chúngtađangcốgắngtìmsốtiềntốiđamàngườichơihiệntại cóthểthuđượcnếuhọbắtđầuchơitrongphạmvitừđồngxu đếnđồngxu i j

Trongcôngthứcnày: dp[i][j]=max(coins[i]+min(dp[i+2][j],dp[i+1][j-1]),coins[j]+min(dp[i+1][j- 1],dp[i][j-2]))

Ngườichơiđầutiên(lượtchọn ):i

Chọnđồngxu  ,sauđóđốithủsẽchọntốiưu(nghĩalà i min(dp[i+2][j], dp[i+1][j-1])).

Ngườichơithứhai(lượtchọn ):j

Chọnđồngxu ,sauđóđốithủsẽchọntốiưu(nghĩalàj min(dp[i+1][j-1], dp[i][j-2])).

Cácgiátrị , ,và đượcsửdụngđểtínhcáctrườnghợpkhácnhaumàđốithủcóa b c thểchọnsaulượtcủangườichơihiệntại: a=dp[i+2][j]:Đâylàsốtiềntốiđamàngườichơihiệntạicóthểthuđượcsaukhi họchọnđồngxuởvịtríivàđốithủchọnđồngxuởvịtríi+1.

Vídụ,nếui=0vàj=3,vàngườichơichọnđồngxuởvịtrí0(i),đốithủchọnđồng xuởvịtrí1(i+1),thìasẽlàgiátrịcủadp[2][3],làsốtiềntốiđamàngườichơicó thểthuđượctừhaiđồngxucònlại(6và8). b=dp[i+1][j-1]:Đâylàsốtiềntốiđamàngườichơihiệntạicóthểthuđượcnếu ngườichơichọnđồngxuởvịtríivàđốithủchọnđồngxuởvịtríj(hoặcngược lại).

Vídụ,bsẽlàgiátrịcủadp[1][2]nếungườichơichọnđồngxuởvịtrí0vàđốithủ chọnđồngxuởvịtrí3. c=dp[i][j-2]:Đâylàsốtiềntốiđamàngườichơihiệntạicóthểthuđượcnếuhọ chọnđồngxuởvịtríjvàđốithủchọnđồngxuởvịtríj-1.

Vídụ,csẽlàgiátrịcủadp[0][1]nếungườichơichọnđồngxuởvịtrí3vàđốithủ chọnđồngxuởvịtrí2.

3.4.3Tínhgiátrịtốiưuchocácđoạnđồngxucóđộdàilớnhơn1

Xétcáckhoảngcó2đồngxu(length=2)

Vớii=0,j=1 a=dp[2][1]=0(vìkhôngtồntại) b=dp[1][0]=0(vìkhôngtồntại) c=0 dp[0][1]=max(coins[0]+min(a,b),coins[1]+min(b,c))=max(2+0,4+0) 4

Xétcáckhoảngcó3đồngxu(length=3)

Vớii=0,j=2 a=dp[2][2]=6 b=dp[1][1]=4 c=dp[0][0]=2 dp[0][2]=max(coins[0]+min(a,b),coins[2]+min(b,c))=max(2+4,6+2) 8

Vớii=1,j=3 a=dp[3][3]=8 b=dp[2][2]=6 c=dp[1][1]=4 dp[1][3]=max(coins[1]+min(a,b),coins[3]+min(b,c))=max(4+6,8+4) 12

Xétkhoảngtừ0đến3(length=4)

Vớii=0,j=3 a=dp[2][3]=8 b=dp[1][2]=6 c=dp[0][1]=4 dp[0][3]=max(coins[0]+min(a,b),coins[3]+min(b,c))=max(2+6,8+4) 12

Giátrịtốiưucủatròchơilàdp[0][3]=12.

Giảibàitoántròchơinđồngxubằngphươngphápđệquy

Sosánhlậptrìnhđộngvàđệquy

Dễhiểuvàtriểnkhai Giảipháptrựctiếpdựatrênđịnhnghĩacủabàitoán Phùhợpvớicácbàitoáncókíchthướcnhỏhoặcgiảithuật đơngiản

Cóthểgặphiệntượngtrùnglặptínhtoánvìmộtsốtrượng hợpconđượctínhtoánnhiềulần

Hiệusuấtkhôngtốtđốivớicácbàitoáncókíchthướclớn. 3.4.2 Lậptrìnhđộng Ưuđiểm:

Loạibỏhiệntượngtrùnglặpbằngcáchlưutrữcáckếtquả củacácbàitoánconđãđượctínhtoán

Cảithiệnhiệusuấtnhờbộnhớlưutrữ Phùhợpvớicácbàicókíchthướclớn Nhượcđiểm:

PhứctạphơnsovớitriểnkhaiđệquyđơnthuầnYêucầunhiềubộnhớhơn.

Ngày đăng: 20/05/2024, 15:54

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN