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

Trí tuệ nhân tạo robocode tournament

16 1,3K 18

Đ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

Định dạng
Số trang 16
Dung lượng 572,45 KB

Nội dung

Trí tuệ nhân tạo robocode tournament

TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HỒ CHÍ MINH KHOA KHOA HỌC KỸ THUẬT VÀ MÁY TÍNH ────────────── * ───────────── BÀI TẬP LỚN MÔN: TRÍ TUỆ NHÂN TẠO ROBOCODE TOURNAMENT Nhóm robocode: Nhóm thực hành: Giáo viên hướng dẫn: PhướcKhoa A02-BA NGUYỄN HỮU THỊNH TP.HỒ CHÍ MINH, tháng năm 2015 MỤC LỤC I.GIỚI THIỆU VỀ ROBOCODE Robocode chương trình trò chơi mà mục tiêu tạo robot, robot mô xe tăng đấu trường chiến đấu để tìm cạnh tranh với robot khác, trang bị với hệ thống radar Một robot di chuyển tới, lui tốc độ khác di chuyển qua trái, qua phải Các radar tháp pháo chuyển sang trái sang phải độc lập với so với phần lại xe tăng Khẩu súng bắn Khi cài đặt trận đấu, ta xem trận đấu từ bên hình chơi dùng máy tính mô trận đấu mà không cần hiển thị đồ họa Người chơi lập trình robot, người không ảnh hưởng trực tiếp vào trò chơi mà thay vào người chơi phải lập trình cho robot thông minh xử lý phản ứng tất kiện xảy lĩnh vực chiến đấu Khi robot đối thủ lọt vào rađa, kiện sinh hành động phù hợp robot thực Robot lấy thông tin đối thủ vùng quét đa tốc độ, heading, lượng lại, tên gốc heading với robot đối thủ, khoảng cách với đối thủ Dựa vào thông tin mà rô bốt đưa hành động phù hợp Ví dụ, phát đối thủ vòng rađa, robot dùng súng để bắn Các robot trận với đội robot Bằng việc giao tiếp với robot khác, chúng trao đổi thông tin nơi có đối thủ phát dựa chiến lược chọn, robot chạy trốn từ đám đối thủ thông báo tin cho đồng minh thông tin đối thủ Các robot viết ngôn ngữ lập trình Java trò chơi Robocode chạy hệ điều hành hỗ trợ tảng Java, bao gồm tất hệ thống phổ biến Windows, Mac OS X, Linux etc Chiến trường Robocode nơi mà tất trận đấu diễn Mỗi điểm có tọa độ x tọa độ theo chiều ngang y tọa độ theo chiều dọc cặp tọa độ thay đổi tùy theo vị trí chiến trường Vị trí ban đầu (0, 0) chiến trường đặt bên trái chiến trường, tọa độ (x, y) chiến trường luôn cặp số thực dương 270 (getBattleFieldWidth(),  getBattleFieldHeight()) 90 (0,0) 180 II.HIỆN THỰC Robot nhóm sử dụng kế thừa từ lớp AdvancedRobot 1.CÁC PHƯƠNG THỨC JAVADOC TỪ MÃ NGUỒN ROBOCODE: setAdjustGunForRobotTurn(independent): Thiết lặp cho súng quay độc lặp với thân robot,nếu independent=true súng quay độc lặp với thân ngược lại - setAdjustRadarForGunTurn(independent): Thiết lặp cho Radar quay độc lặp với súng robot,nếu independent=true radar quay độc lặp với súng ngược lại - setAdjustRadarForRobotTurn(independent): Thiết lặp cho Radar quay độc lặp với thân robot,nếu independent=true radar quay độc lặp với thân ngược lại - setColors(Color bodyColor, Color gunColor, Color radarColor, Color bulletColor, Color scanArcColor) Thiết lặp màu sắc cho phận robot phận gôm:thân robot,súng,radar,đạn,vùng radar quét - getX(): Lấy tọa độ X robot - getY(): Lấy tọa độ Y robot - getBattleFieldWidth(): Lấy kích thước chiều ngang chiến trường (màn) - getBattleFieldHeight(): Lấy kích thước chiều cao chiến trường (màn) Ghi chú: Thường kích thước chiến trường mặc định 800x600 - setTurnRadarRight(degree):Thiệt lặp cho radar quay bên phải với góc degree Degree nằm từ 0->360 độ Nếu degree số âm setTurnRadarRight đổi thành setTurnRadarLeft - getRadarTurnRemaining(): Kiểm tra xem radar có quay không!Nếu không quay thực hành động quay trình bày - execute(): thực thi lệnh đưa vòng lặp while(true) - getEnergy():Lấy lượng robot - getHeading(): Lấy góc body robot mình,hình bên mô tả giá trị bodyHeading - getGunHeading(): Lấy góc súng robot mình,giá trị nằm khoảng tương tự getHeading() - getRadarHeading(): Lấy góc radar robot mình, giá trị nằm khoảng tương tự getHeading() - getVelocity(): Lấy vận tốc robot - setAhead(distance):Điều khiển robot thẳng với khoảng cách distance có kiểu double - setBack(distance):Điều khiển robot lùi với khoảng cách distance có kiểu double - setTurnRight(rotate):Điều khiển body robot xoay bên phải với góc rotate có kiểu double ,rotate nhận giá trị độ - setTurnGunRight(rotate): ):Điều khiển súng robot xoay bên phải với góc rotate có kiểu double ,rotate nhận giá trị độ - setFire(power): Thiết lặp bắn đạn cho robot,với viên đạn có kích thước power.Power nằm khoảng 0.1 Phần trình bày rõ bên cách thức thực ,cũng việc tính toán chi tiết ,tỷ mỹ TÍNH TOÁN TỌA ĐỘ ĐỐI PHƯƠNG Hình Theo hình ta có: X1= e.getDistance()*cos(apha)=e.getDistance()*sin(absoluteBearing) Y1= e.getDistance()*sin(apha)=e.getDistance()*cos(absoluteBearing) Với alpha = 90-(e.getBearing()+getHeading()) absoluteBearing = e.getBearing+getHeading() => Như thấy, giá trị X1 Y1 ta tính theo alpha absoluteBearing Vì theo tính chất ta có : cos(a)=sin(90-a) sin(a)=cos(90-a) Từ suy tọa độ đối phương là: (Position of Enemy) X= getX()+X1 Y=getY()+Y1 5.DỰ ĐOÁN ĐIỂM ĐẾN CỦA ĐỐI PHƯƠNG Hình - Dựa vào hình ta thấy dX0 dY0 sau tính là: θ1:90-(e.getBearing()+e.getHeading()); dX0=e.getBearing()*cos(θ1) dY0=e.getBearing()*sin(θ1) - Tương tự dựa vào hình ta xét tam giác ABC vuông B ta có : θ2: 90-e.getBearing(); dXem=Vem.t.cos(θ2) dYem=Vem.t.sin(θ2) Vem=e.getVelocity() // Đây vận tốc đối phương di chuyển - Ở t thời gian ta cần tìm ,để với vận tốc thời gian t đối phương di chuyển đến điểm nào? - Ta xét tiếp tam giác MDC vuông D.Ta có: MD2+DC2=MC2 (1) Với MD=dX1=dX0+dXem Và CD=dY1=dY0+dYem 10 MC=Vbt.t -Vbt vận tốc đạn bắn.Theo luật robocode ta có: Vbt=20-3*power Power lượng đạn mà bắn ,chính phần tử truyền vào hàm setFire(power) hay fire(power) Thay giá trị MD,MC,DC vào (1) ta được: (Vbt.t)2=(dX0+dXem)2+(dY0+dYem)2 Vbt2.t2-(dX0+dXem)2-(dY0+dYem)2=0 Vbt2.t2-(dX0+ Vem.t.cos(θ2))2-(dY0+ Vem.t.cos(θ2))2=0 [Vbt2-Vem2.cos2(θ2)-Vem2.sin2(θ2)].t2+[-2dX0.Vem.cos(θ2)-2dY0.Vem.sin(θ2)].t+ (-dX02-dY02) (*) - Theo lý thuyết toán học ta có: at2+bt+c = delta = b2-4ac - Nếu delta0 phương trình có nghiệm : t= - Áp dụng vào phương trình (*) ta có: b=+[-2dX0.Vem.cos(θ2)-2dY0.Vem.sin(θ2)] a=[Vbt2-Vem2.cos2(θ2)-Vem2.sin2(θ2)] c=(-dX02-dY02) - Hiện thực code cho ý tưởng sau: double Vem = egetVelocity; double Vbt = 20 - * power; double phi2 = Math.toRadians(eHeading); double phi1 = Math.toRadians(getHeading() + e.getBearing()); double dx = distance * Math.sin(phi1); 11 double dy = distance * Math.cos(phi1); double A = Math.pow(Vbt, 2) - Math.pow(Vem, 2); double B = -2 * dx * Vem * Math.sin(phi2) - * dy * Vem * Math.cos(phi2); double C = -Math.pow(dx, 2) - Math.pow(dy, 2); double D = B * B - * A * C; double t1, t2, t; if (D >= 0) { t1 = (-B + Math.sqrt(D)) / (2 * A); t2 = (-B - Math.sqrt(D)) / (2 * A); t = Math.max(t1, t2); } else { t = 0; } double dxem = Vem * t * Math.sin(phi2); double dyem = Vem * t * Math.cos(phi2); double dx1 = dx + dxem; double dy1 = dy + dyem; //For gun double degree = 90 - Math.toDegrees(Math.atan2(dy1, dx1)) getGunHeading(); degree = normalRelativeAngleDegrees(degree); setTurnGunRight(degree); //Bullet setFire(power); 12 DỰ ĐOÁN ĐẠN CỦA ĐỐI PHƯƠNG Hình Tương tự phần dự đoán điểm di chuyển đối phương ta có: (Vb.t)2=X2+Y2 (2) Vb vận tốc đạn đối phương Câu hỏi đặt làm ta lấy thông số nó? Như ta biết : Vb=20-3.power Vậy để có lượng viên đạn bắn đối phương ? Ta dùng biến để lưu lượng trước đối phương,và ta lấy lượng trước trừ lượng mà đối phương có ta có lượng viên đạn.Ban đầu lastEnergyOfEnemy luôn 100 double lastEnergyOfEnemy = 100; double newEnergyOfEnemy Nếu trường hợp đối phương không bắn đạn giá trị lượng trước lượng sau đối phương nhau,trong trường hợp ta di chuyển tùy theo ý thích không di chuyển ,vì đối phương không băn đạn 13 Nêu trường hợp lượng đối phương lớn lượng trước có ( có nghĩa robot đối phương cộng thêm lượng bắn trúng ) lượng cộng thêm max lượng power nhỏ lượng lúc sau,có nghĩa đối phương bị va tường, lúc ta cần cập nhật lại hai biến sau: if ((this.newEnergyOfEnemy >= this.lastEnergyOfEnemy) || (this.newEnergyOfEnemy + Rules.MAX_BULLET_POWER < this.lastEnergyOfEnemy)) { this.lastEnergyOfEnemy = this.newEnergyOfEnemy; } } - Ta lại có: X=X1+X0 Y=Y1+Y0 θ1:90-(e.getBearing()+e.getHeading()); (tương tự phần trên) d=e.getDistance() //Khoảng cách ta đối phương V=getVelocity() //Vận tốc robot ta di chuyển Với X1=d*cos(θ1) Y1=d*sin (θ1) θ2=90-getHeading() X2=V.t.cos(θ2) Y2=V.t.sin(θ2)  (Vb.t)2=(d.cos(θ1)+v.t.cos(θ2))2+(d.sin(θ1)+vtsin(θ2))2  (Vb.t)2=d2+V2t2+2.d.v.t.(sin(θ1)sin(θ2)+cos(θ1)cos(θ2))  (Vb2-V2)t2+[-2.d.v(sin(θ1).sin(θ2)+cos(θ1).cos(θ2))].t-d2=0 - Theo lý thuyết toán học ta có:  at2+bt+c =  delta = b2-4ac - Nếu delta0 phương trình có nghiệm : 14 (**)  t= - Áp dụng vào phương trình (**) ta có: b=[-2.d.v(sin(θ1).sin(θ2)+cos(θ1).cos(θ2))] a=(Vb2-V2) c=-d2 - Hiện thực code cho ý tưởng sau: powerOfBullet = this.lastEnergyOfEnemy - e.getEnergy(); if (powerOfBullet >= 0.1 && powerOfBullet = 0) { double t1 = -B + Math.sqrt(delta) / (2 * A); double t2 = -B + Math.sqrt(delta) / (2 * A); time = Math.max(t1, t2); } else { time = 0; } double xt = V * time * Math.sin(getHeadingRadians()) + getX(); //proposed x position of impact double yt = V * time * Math.cos(getHeadingRadians()) + getY(); //proposed y position of impact go(Math.atan2((yt - getY()), (xt - getX())), this.move, getHeadingRadians()); } 15 III.TÀI LIỆU THAM KHẢO http://robocode.sourceforge.net/docs/robocode/ 16 [...]... Math.cos(getHeadingRadians()) + getY(); //proposed y position of impact go(Math.atan2((yt - getY()), (xt - getX())), this.move, getHeadingRadians()); } 15 III.TÀI LIỆU THAM KHẢO http:/ /robocode. sourceforge.net/docs /robocode/ 16 ...MC=Vbt.t -Vbt chính là vận tốc của đạn chúng ta bắn.Theo luật robocode ta có: Vbt=20-3*power Power ở đây chính là năng lượng đạn mà chúng ta sẽ bắn ra ,chính là phần tử được truyền vào hàm setFire(power) hay fire(power) Thay các giá trị MD,MC,DC vào (1) ta được:

Ngày đăng: 20/05/2016, 15:37

TỪ KHÓA LIÊN QUAN

w