Προς το περιεχόμενο

Αλγόριθμος Τεχνητής Νοημοσύνης για το παιχνίδι της Ναυμαχίας


migf1

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

EDIT: Επισύναψη πηγαίου κώδικα (διαβάστε το readme.txt που περιέχει το συμπιεσμένο αρχείο για σύντομες οδηγίες, ή ρωτήστε με απευθείας σε αυτό εδώ το νήμα).

 

c_battle36_src.zip

 

Εδώ και 2-3 βδομάδες παλεύω να φτιάξω μια AI Engine για το γνωστό παιχνίδι της Ναυμαχίας. Ήθελα να φτιάξω κάτι δικό μου, αποφεύγοντας γνωστούς αλγόριθμους (Monte Carlo, NP Complete, ακόμα και Heuristics) αλλά τελικά αποδείχτηκε πολύ δυσκολότερο από ότι περίμενα.

 

Για να μη το κουράζω, εγκατέλειψα την ιδέα του δικού μου αλγόριθμου και βρήκα αυτό εδώ: http://arnosoftwaredev.blogspot.com/2008/06/battleship-game-algorithm-explained.html που μου φάνηκε πολύ ενδιαφέρον και ξεκίνησα να το υλοποιώ.

 

Συνοπτικά, χρησιμοποιεί 2 shooting modes, ένα trial (δοκιμαστικές βολές) που αποτελείται από 2 σκαναρίσματα του πλέγματος, προκειμένου να μεγιστοποιήσει τις πιθανότητες να χτυπήσει πλοίο, κι ένα sink mode (βολές βύθισης) που ενεργοποιείται όταν χτυπηθεί ένα πλοίο, προκειμένου να το βυθίσει.

 

Δοκιμαστικές Βολές:

 

Στο 1ο δοκιμαστικό σκανάρισμα υπολογίζει τις πιθανότητες που έχει το κάθε κελί του πλέγματος να φιλοξενεί κάποιο από τα εναπομείναντα πλοία του αντιπάλου, κι επιλέγει το κελί με την μεγαλύτερη πιθανότητα.

 

Αν υπάρχουν περισσότερα κελιά με ίδια πιθανότητα φιλοξενίας πλοίων, ενεργοποιεί το 2ο δοκιμαστικό σκανάρισμα, κατά το οποίο για κάθε κελί υπολογίζει τις πιθανότητες να υπάρχει πλοίο στα γειτονικά κελιά. Επιλέγει το κελί για το όποιο οι γείτονες έχουν τις περισσότερες πιθανότητες να φιλοξενούν πλοίο.

 

Τις πιθανότητες του 1ου σκαναρίσματος τις ονομάζει ship probabilities, ενώ τις πιθανότητες του 2ου σκαναρίσματος τις ονομάζει neighbor scores.

 

Μέχρι εδώ όλα ωραία και καλά!

 

Τώρα αρχίζουν οι απορίες όμως... αν στο 2ο δοκιμαστικό σκανάρισμα βρεθούν περισσότερα του 1ος κελιά με τοπ neighbor score, τότε λέει να κάνουμε το εξής:

 

So the neigbor score becomes our second target selection criteria, right after to the ship location probability.

 

If there are cells with equal ship location probability and equal neighbor score, we choose one that fits the checkerboard (by the way, applying the neighbor score almost naturally leads to a checkerboard as well, so this is just to go sure for special cases, e.g. a more or less empty battlefield). If more than one of the top-ranked cells fits the checkerboard, we'll randomly select any of them.

 

Checkboard ονομάζει τις κυψελωτές δοκιμαστικές βολές:

 

field3.png

 

Επομένως μιλάμε για 3 στάδια δοκιμαστικών βολών: ship probabilities, neighbor scores και checkboard.

 

Και κάπου εδώ αρχίζω να χάνω την μπάλα :lol:

 

Μέχρι στιγμής έχω φτιάξει τις ρουτίνες των 2 πρώτων δοκιμαστικών σκαναρισμάτων:

 

>
GPos ai_engine_trial_scan1( AiEngine *aiengine, int *multitop );
GPos ai_engine_trial_scan2( AiEngine *aiengine, int *multitop );

// επιστρέφουν τη θέση του τελευταίου top-ranked κελιού μετά το σκανάρισμα, με το multitop να είναι το πλήθος των top-ranked κελιών

καθώς κι ένα macro που υπολογίζει αν μια θέση υπακούει ή όχι στο κυψελωτό μοτίβο του checkboard:

 

>
AIGPOS_FITS_CHECKBOARD( pos ) ...

Το πρόβλημά μου είναι στο συνδυασμό τους, επειδή δεν καταλαβαίνω επακριβώς το κείμενο που έχω παραθέσει παραπάνω.

 

Αρχικά είχα καταλάβει πως καλούμε την ai_engine_trial_scan1() κι επιλέγουμε το top-ranked κελί που μας επιστρέφει. Αν μας επιστρέψει περισσότερα του 1ος top-ranked κελιά, τότε καλούμε την ai_engine_trial_scan2() κι επιλέγουμε το top-ranked κελί που μας επιστρέφει αυτή!

 

Ερώτηση 1η: στην ai_engine_trial_scan2() σκανάρουμε ξανά όλα τα κελιά του πλέγματος ή μονάχα όσο βγήκαν top-ranked στο 1ο σκανάρισμα; (εγώ μέχρι στιγμής σκανάρω από την αρχή όλο το πλέγμα, αλλά μάλλον κάνω... λαλακία).

 

Ερώτηση 2η: υπάρχει περίπτωση η ai_engine_trial_scan1() να ΜΗΝ βγάλει κανένα top-ranked κελί, να είναι δηλαδή όλα 0; Αν ναι, τι κάνουμε σε αυτή την περίπτωση; Επίσης, αν βγάλει μόνο ένα top-ranked κελί, υποθέτω το επιλέγουμε ανεξαρτήτως αν ταιριάζει ή όχι στο κυψελωτό μοτίβο, σωστά;

 

Ερώτηση 3η: αν η ai_engine_trial_scan2() ΔΕΝ βγάλει σκορ σε κανένα κελί (όλα 0) τι κάνουμε;

 

Ερώτηση 4η: αν η ai_engine_trial_scan2() βγάλει περισσότερα του 1ος top-ranked κελιά, τι ακριβώς πρέπει να κάνουμε γιατί έχω καταμπερδευτεί από το κείμενο. Προφανώς η απάντηση εδώ είναι σε συνάρτηησ με την απάντηση της 1ης ερώτησης, αλλά σε κάθε περίπτωση, τι εννοεί το κείμενο;

 

Αν π.χ. μας βγάλει 3 top-ranked κελιά το 2ο σκανάρισμα, χρειάζεται να τσεκάρουμε αν εκτός από ίδιο neighbor score έχουν και ίδιο ship probability; Αν στην ερώτηση 1 η απάντηση είναι "μονάχα τα κελιά που βγήκαν top-ranked στο 1ο σκανάρισμα" προφανώς συνεπάγεται πως έχουν ίδιο ship probability, αλλά αν η απάντηση της 1ης ερώτησης είναι "όλα τα κελιά από την αρχή", τότε θα πρέπει για κάθε κελί του πλέγματος να ξανατσεκάρουμε ποια έχουν ίδιο ship-probability και μετά ποια από αυτά έχουν και ίδιο neighbor-score... μου φαίνεται λίγο άκυρο αυτό, μάλλον στο 2ο σκανάρισμα πρέπει να τσεκάρουμε μονάχα όσα κελιά είχαν βγει top-ranked στο 1ο σκανάρισμα, ε;

 

Αυτά για αρχή, έχω κι άλλες απορίες αλλά ας ξεκινήσουμε από αυτές και βλέπουμε (αν δηλαδή ασχοληθεί κανείς :lol: ).

Επεξ/σία από migf1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 35
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Απάντηση 1 από ότι κατάλαβα : αν η ai_engine_trial_scan1() επιστρέψει πολλά αποτελέσματα (λογικό σαν πρώτη κίνηση του παιχνιδιού), βάζεις σαν ορίσματα στην ai_engine_trial_scan2() αυτά τα αποτελέσματα.

 

Απάντηση 2 δεν μπορώ να κρίνω σίγουρα γιατί δεν έχω διαβάσει όλη σου την συνάρτηση ούτε την συνάρτηση από το explain που έχει, αλλά και πάλι ανάμεσα σε 10 αριθμούς αν είναι και οι 10 0 δεν είναι ο top αριθμός το 0; σε αυτό κολλάω εγώ.

 

Απάντηση 3 λίγο πολύ το ίδιο με το από πάνω.

 

για την 4 δεν νομίζω ότι "αξίζει" να γράψω κάτι,

 

βασικά αν έχω καταλάβει καλά τι κάνει αυτός ο αλγόριθμός

με την 1η αναζήτηση ελέγχει αν έχει χτυπηθεί κάποιο πλοίο, άρα θα έχει οριζόντια ή κάθετα διαθέσιμες "σωστές" βολές,

με την 2η αναζήτηση αν δεν υπάρχουν χτυπημένα(μη βυθισμένα) πλοία , ψάχνει στο πλέγμα ανάλογα με τα "κενά" την πιθανή λύση να είναι κάποιο πλοίο,

π.χ. έχω βυθίσει όλα τα πλοία εκτός το 5αρι αλλά έχω μόνο σε μία οριζόντια γραμμή 7 κουτάκια διαθέσιμα, άρα χτυπάω το μεσαίο για αρχή και μετά ψάχνω τις άκρες.

Και με την 3η αναζήτηση βασίζεται στα σημεία τις εικόνας που έχει , γιατί εκεί ακόμα και το 2θέσιο καράβι δεν μπορεί να κρυφτεί.

εγώ αυτά κατάλαβα, αν πιστεύεις ότι δεν μπορώ να βοηθήσω το λες..

αν πιστεύεις πάλι ότι μπορώ ευχαρίστως να σε βοηθήσω :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ερώτηση 1η: στην ai_engine_trial_scan2() σκανάρουμε ξανά όλα τα κελιά του πλέγματος ή μονάχα όσο βγήκαν top-ranked στο 1ο σκανάρισμα; (εγώ μέχρι στιγμής σκανάρω από την αρχή όλο το πλέγμα, αλλά μάλλον κάνω... λαλακία).

 

Ερώτηση 2η: υπάρχει περίπτωση η ai_engine_trial_scan1() να ΜΗΝ βγάλει κανένα top-ranked κελί, να είναι δηλαδή όλα 0; Αν ναι, τι κάνουμε σε αυτή την περίπτωση; Επίσης, αν βγάλει μόνο ένα top-ranked κελί, υποθέτω το επιλέγουμε ανεξαρτήτως αν ταιριάζει ή όχι στο κυψελωτό μοτίβο, σωστά;

 

Ερώτηση 3η: αν η ai_engine_trial_scan2() ΔΕΝ βγάλει σκορ σε κανένα κελί (όλα 0) τι κάνουμε;

 

Ερώτηση 4η: αν η ai_engine_trial_scan2() βγάλει περισσότερα του 1ος top-ranked κελιά, τι ακριβώς πρέπει να κάνουμε γιατί έχω καταμπερδευτεί από το κείμενο. Προφανώς η απάντηση εδώ είναι σε συνάρτηησ με την απάντηση της 1ης ερώτησης, αλλά σε κάθε περίπτωση, τι εννοεί το κείμενο;

 

Αν π.χ. μας βγάλει 3 top-ranked κελιά το 2ο σκανάρισμα, χρειάζεται να τσεκάρουμε αν εκτός από ίδιο neighbor score έχουν και ίδιο ship probability; Αν στην ερώτηση 1 η απάντηση είναι "μονάχα τα κελιά που βγήκαν top-ranked στο 1ο σκανάρισμα" προφανώς συνεπάγεται πως έχουν ίδιο ship probability, αλλά αν η απάντηση της 1ης ερώτησης είναι "όλα τα κελιά από την αρχή", τότε θα πρέπει για κάθε κελί του πλέγματος να ξανατσεκάρουμε ποια έχουν ίδιο ship-probability και μετά ποια από αυτά έχουν και ίδιο neighbor-score... μου φαίνεται λίγο άκυρο αυτό, μάλλον στο 2ο σκανάρισμα πρέπει να τσεκάρουμε μονάχα όσα κελιά είχαν βγει top-ranked στο 1ο σκανάρισμα, ε;

 

Αυτά για αρχή, έχω κι άλλες απορίες αλλά ας ξεκινήσουμε από αυτές και βλέπουμε (αν δηλαδή ασχοληθεί κανείς :lol: ).

 

 

1) Σκανάρεις μόνο ότι βγάλει η πρώτη, τα οποία κελιά (που θα βγάλει η πρώτη) τα ταΐζεις στην δεύτερη.

 

2) Εάν δεν βγάλει κανένα, τότε (λογικά) είσαι στην αρχή. Δύο πολιτικές μπορείς να ακολουθήσεις. Είτε επιλέγεις εξαρχής ένα random είτε τα δίνεις όλα στην δεύτερη (εξαρτάται από το τι κάνει ακριβώς η δεύτερη, εάν π.χ. εκπαιδεύεται από τις απαντήσεις του χρήστη τότε, και μετά από κάποια στάδια, θα ήταν εύλογο να τα δίνεις όλα στην δεύτερη. Εάν σου βγάλει ένα, τότε το επιλέγεις.

 

3, 4) Εάν βγάλει σκορ το ίδιο σε όλα, έστω και εάν είναι 0, τα περνάς στην 3η.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλημέρα,

 

στη 2η παράγραφο του αρχικού μου ποστ έχω δώσει ένα link που εξηγεί αναλυτικά τη λογική του αλγόριθμου (αυτή που γράφω συνοπτικά σε επόμενη παράγραφο). Οι απορίες μου είναι για τις δοκιμαστικές βολές, αυτές δηλαδή που ρίχνει μέχρι να χτυπήσει κάποιο πλοίο (του οποίου προφανώς δεν γνωρίζει το μήκος)... άμα χτυπήσει κάποιο πλοίο, τότε μπαίνει σε sink shooting mode, για το οποίο δεν έχω παραθέσει συνάρτηση.

 

Άρα οι 2 συναρτήσεις που έχω παραθέσει δεν υπολογίζουν χτυπημένα ή βυθισμένα πλοία, υπολογίζουν πιθανότητες να υπάρχει κάποιο πλοίο στο καθένα από τα κελιά του πλέγματος. Αντιστοιχούν στα 2 δοκιμαστικά στάδια που περιγράφει το link.

 

Για να απαντηθούν οι ερωτήσεις χρειάζεται πρώτα να διαβαστεί το link που έχω δώσει. Το πρόβλημά μου δεν είναι στην υλοποίηση των συναρτήσεων αλλά στη λογική που διέπει τον συνδυασμό και την προτεραιότητά τους στη ροή του προγράμματος.

 

Για παράδειγμα, δεν είμαι σίγουρος για την σωστή απάντηση στην ερώτηση 1, γιατί ενδέχεται να υπολογίζει σωστές πιθανότητες 2ου σταδίου ακόμα κι αν σκαναριστούν όλα τα κελιά από την αρχή.

 

Επίσης, το αν το 0 πρέπει ή όχι να υπολογίζεται ως top-rank σε οποιοδήποτε από τα 2 στάδια είναι κάτι που δεν το ξεκαθαρίζει το link και δυσκολεύομαι να το ξεκαθαρίσω και μόνος μου. Προς το παρόν ΔΕΝ το θεωρώ valid ως top-rank σε κανένα από τα 2 δοκιμαστικά στάδια. Αν π.χ. το 2ο σκανάρισμα δώσει 0 ως top-rank, τότε κάνω roll-back στα αποτελέσματα του 1ου σκαναρίσματος για να επιλέξω κάποιο από αυτά (όποιο υπακούει στο κυψελωτό μοτίβο), ενώ αν δώσει 0 ως top-rank το 1ο σκανάρισμα, τότε διαλέγω το 1ο ελεύθερο κελί που ακολουθεί το κυψελωτό μοτίβο, αλλιώς κάποιο που δεν το ακολουθεί.

 

Βασικά έκανα αυτό το ποστ γιατί ο αλγόριθμος έχει "λεπτομέρειες" που δεν περιγράφονται επαρκώς στο link και χρειάζομαι βοήθεια. Πάντα τα πολλά μυαλά είναι καλύτερα του ενός :)

 

...

3, 4) Εάν βγάλει σκορ το ίδιο σε όλα, έστω και εάν είναι 0, τα περνάς στην 3η.

Ως 3η εννοείς το κυψελωτό μοτίβο, σωστά; Διότι έχω ένα θέμα με αυτό, με μπερδεύει πολύ. Προτείνεις να του συμπεριφερθώ πάντα ως 3η εναλλακτική δηλαδή;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Διάβασα στα πεταχτά το link σου.

 

Συνεχίζω να έχω τις ίδιες απαντήσεις.

 

Εάν δεις, ως checkerboard παίρνει, στο worst case scenario, όλο το board χωρισμένο στα μισά με τέτοιο τρόπο ώστε να μην μπορεί να κρυφτεί πλοίο. Άρα, εάν το πρώτο βήμα, η πρώτη Fcn, σου βγάλει το ίδιο σε όλα, π.χ. είσαι ακόμα στην αρχή, την δώσεις στην δεύτερη, που δεν έχει πληροφορία για κάποιο γειτονικό πλοίο, και αυτή βγάλει το ίδιο σε όλα (έστω και 0) και άρα τα περάσεις στην τρίτη... θα σου βγάλει κάποιο από το checkerboard το οποίο θα διαλέξεις randomly.

 

Εν γένει, ο αλγόριθμος είναι απλός.

 

Εάν κάποια βγάλει μόνο ένα, το επιλέγεις. Αλλιώς το περνάς στην επόμενη. Εάν τελειώσουν οι fcns επιλέγεις randomly.

 

Υ.Γ. Ναι, ως 3η επιλογή εννοώ το "checkerboard fcn".

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Thanks ρε συ timon, θα το δοκιμάσω έτσι και θα ενημερώσω (από αύριο μάλλον).

 

ΥΓ. Κι εμένα απλός μου φάνηκε ο αλγόριθμος, για αυτό και τον ξεκίνησα.. αλλά στην πορεία κάπου χάθηκα. Προσπαθώ να την κάνω αυτόνομη την ai-engine.

 

 

 

>
/* ==================================================================================
* AI-ENGINE releated Macros & Custom Types
* ==================================================================================
*/

#define AIGPOS_FITS_CHECKBOARD( gpos )						\
(	   ( ( (gpos) / GRID_NCOLS ) % 2 == 0 && (gpos) % 2 == 0 )		\
|| ( ( (gpos) / GRID_NCOLS ) % 2 != 0 && (gpos) % 2 != 0 )		\
)

typedef enum AiEngineModeType {
//	AIENGINE_NOMODE		= -1,
AIENGINE_MODETYPE_TRIAL	= 0,
AIENGINE_MODETYPE_SINK	= 1,
} AiEngineModeType;

#define VALID_AIENGINEMODE( mode )			\
( (mode) != AIENGINE_MODETYPE_TRIAL && (mode) != AIENGINE_MODETYPE_SINK )

typedef struct AiEngineModeTrial {
int	scan1toprank;		/* max # of possibs to host a ship, in trial    */
GPos	*scan1cands;		/* selection candidates from 1st scan           */
int	scan2toprank;		/* max score of neighbors' sums in trial mode   */
GPos	*scan2cands;		/* selection candidates from 2nd scan           */
} AiEngineModeTrial;

typedef struct AiEngineModeSink {
int	toprank;		/* max score of neighbors' sums in sinking mode */
FleetIndex	shipfid;	/* fid of the ship under attack from the AI     */
int 	numhits;
GPos	pos1sthit, poslasthit;
CompassDir hitdir;
} AiEngineModeSink;

typedef struct AiEngineMode {
AiEngineModeType  type;
AiEngineModeTrial trial;
AiEngineModeSink  sink;
} AiEngineMode;

typedef enum AiGCellState {
AIGCELL_STATE_UNKNOWN		= 0,
AIGCELL_STATE_IMPOSSIBLE	= 1,
AIGCELL_STATE_WATER		= 2,
AIGCELL_STATE_SHIP		= 3
} AiGCellState;

typedef struct AiGCell {
AiGCellState	state;		/* UNKNOWN, WATER, IMPOSSIBLE, STATE_SHIP	*/
int		try1rank;	/* # of possibilities to host a ship, in trial  */
int		try2rank;	/* score of neighbors' sums in trial mode       */
int		sinkrank;
} AiGCell;

typedef int AiShipLength;

typedef struct AiEngine {
AiEngineMode	mode;		/* trial-shot or sinking-shot                   */
AiShipLength	*shiplengths;
AiGCell		*grid;		/* AI grid, of dimensions equal to the play grid*/
} AiEngine;

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θα ήταν ενδιαφέρον, όταν τελειώσεις, εάν μπορέσεις να βάλεις και εκμάθηση μέσα. Π.χ., αφού έχει παίξει 3 - 4 παιχνίδια, να μαθαίνει πώς περίπου βάζει τα πλοία ο αντίπαλος και να αποφασίζει βάσει των όσων έχει μάθει.

 

Αυτό θα βοηθήσει και στην αρχή, όπου δεν έχει κανένα δεδομένο σχετικά με το board και το πώς είναι populated.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κάτσε να το τελειώσω πρώτα όπως είναι τώρα, γιατί έχει και το sink mode μετά και (συμπεριλαμβανομένων των σχολίων) είμαι ήδη στις 4500 γραμμές κώδικα, σε 5 αρχεία :lol: ... 4 .c κι ένα .h

 

Πάντως η τοποθέτηση των πλοίων του παίκτη γίνεται randomly από τον υπολογιστή, αλλά δίνω τη δυνατότητα στον παίκτη να τα μετακινήσει σε άλλες θέσεις ή/και να κάνει re-generate randomly όσες φορές θέλει όλο το grid του πριν ξεκινήσει το παιχνίδι.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

...

Άρα, εάν το πρώτο βήμα, η πρώτη Fcn, σου βγάλει το ίδιο σε όλα, π.χ. είσαι ακόμα στην αρχή, την δώσεις στην δεύτερη, που δεν έχει πληροφορία για κάποιο γειτονικό πλοίο, και αυτή βγάλει το ίδιο σε όλα (έστω και 0) και άρα τα περάσεις στην τρίτη... θα σου βγάλει κάποιο από το checkerboard το οποίο θα διαλέξεις randomly.

...

Πολύς πονοκέφαλος :(

 

Αυτό που έχω κάνει bold στην παράθεση δεν μου ισχύει πάντα. Δηλαδή, υπάρχουν περιπτώσεις όπου το 2ο σκανάρισμα βγάζει πολλά top-ranked κελιά, αλλά κανένα τους δεν ταιριάζει στο checkboard pattern. Πανάθεμά το!

 

Το σχετικό Αγγλικό κείμενο (αυτό που έχω παραθέσει στο 1ο ποστ) υπονοεί πως όταν υπάρχουν πολλά top-ranked αποτελέσματα στο 2ο σκανάρισμα κάποιο θα ταιριάζει στο checkboard pattern, αλλά δεν :(

 

Δεν ξέρω αν φταίει πως δεν έχω υλοποιήσει ακόμα το sink-mode, αλλά έχω βγάλει τα μάτια μου ήδη, κι έχω αρχίσει να σπάζομαι :lol:

 

Οπότε τι γίνεται τώρα, να το βάλω να επιλέγει κάποιο από τα αποτελέσματα του 2ου σκαν κι ας μην υπακούει στο chekcboard; Ή μήπως έχει γίνει αλλού η στραβή και το 2ο σκαν δίνει πάντα έστω 1 αποτέλεσμα on checkboard? Βασικά, όταν βγάζει μονάχα 1 top-ranked αποτέλεσμα το 2ο σκαν, πολύ συχνά δεν υπακούει στο checkboard pattern.

 

ΥΓ. Που είσαι ρε παπι που ήθελες να ζωντανέψει το section? :lol:

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

1. Μην λες "AI" γιατί πρώτον δεν είναι AI (δεν έχει καμία δυνατότητα για learning, είναι ένα πολύ απλό rules-based engine) και δεύτερον αυτό έχει σαν αποτέλεσμα να ακούγεται λίγο σαν μέγιστος ντεβελοπερ material... :-D

2. Νομίζω ότι θα σε βοηθήσει πάρα πολύ να κάνεις λίγο καλύτερη αρχιτεκτονική στον κώδικα (επι τη ευκαιρία 4500 γραμμές?!?!?!?)

3. Αν βάλεις τον κώδικα στο GitHub θα μπορούμε να γουστάρουμε όλοι μαζί

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

1. Μην λες "AI" γιατί πρώτον δεν είναι AI (δεν έχει καμία δυνατότητα για learning, είναι ένα πολύ απλό rules-based engine) και δεύτερον αυτό έχει σαν αποτέλεσμα να ακούγεται λίγο σαν μέγιστος ντεβελοπερ material... :-D

2. Νομίζω ότι θα σε βοηθήσει πάρα πολύ να κάνεις λίγο καλύτερη αρχιτεκτονική στον κώδικα (επι τη ευκαιρία 4500 γραμμές?!?!?!?)

3. Αν βάλεις τον κώδικα στο GitHub θα μπορούμε να γουστάρουμε όλοι μαζί

4500 γραμμές όλο μαζί ρε συ, όχι το engine. Τον κώδικα ευχαρίστως να τον ανεβάσω, θα το κάνω ένα rar-άκι αν είναι, αν και στις εν λόγω ρουτίνες πειραματίζομαι ακόμα και πολλά σημεία είναι χύμα... θα του βάλω σχόλια (να κάνω κι ένα break γιατί ζαλίστηκα) και θα τον ανεβάσω.

 

Btw, AI δεν είναι μόνο ότι μαθαίνει, είναι και ότι μεγιστοποιεί σε κάθε επανάληψη τις πιθανότητες επιτυχίας του. Οπότε μια χαρά ΑΙ-Engine είναι κι αυτό!

 

http://en.wikipedia.org/wiki/Artificial_intelligence

 

AI textbooks define the field as "the study and design of intelligent agents"[2] where an intelligent agent is a system that perceives its environment and takes actions that maximize its chances of success.[3] John McCarthy, who coined the term in 1956,[4] defines it as "the science and engineering of making intelligent machines."[5]

Η αρχιτεκτονική πιθανότητα θέλει αλλαγή, αλλά την έχω αλλάξει τουλάχιστον 3-4 φορές μέχρι τώρα (άσχετα από τον συγκεκριμένο αλγόριθμο). Και ακόμα είναι WIP, οπότε ο κώδικας που θα ανεβάσω θα πρέπει να εκληφθεί ως τέτοιος και όχι ως τελικός.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Btw, AI δεν είναι μόνο ότι μαθαίνει, είναι και ότι μεγιστοποιεί σε κάθε επανάληψη τις πιθανότητες επιτυχίας του. Οπότε μια χαρά ΑΙ-Engine είναι κι αυτό!

 

Ο πρήχτης defacer ξαναχτυπά...

 

Σαν λογικός συλλογισμός αυτό δεν στέκει. Αν υποθέσουμε ότι "αυτοκίνητο" ονομάζεται "όχημα με ρόδες που κινείται καίγοντας βενζίνη", εσύ τώρα λες ότι το πατίνι έχει ρόδες άρα είναι αυτοκίνητο.

 

Αντιπαράδειγμα: αν γράψεις ένα πρόγραμμα που παίζει τέλεια τρίλιζα, είναι AI? Αν παίξουμε το παιχνίδι "ο καθένας λέει έναν αριθμό από το ένα ως το 10 και ο μεγαλύτερος κερδίζει" και γράψεις ένα πρόγραμμα που λέει πάντα "10", είναι AI?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ρε συ defacer, μην παίζεις με τον πόνο μου... μου έχουν βγει τα μάτια με τη μ@λ@κία... κι όχι τίποτε άλλο, έχω αρχίσει και κάνω ένα σωρό μ@λ@κίες και στον κώδικα.

 

Να τον ποστάρω χύμα τον κώδικα χωρίς σχόλια; (φοβάμαι μην χάσετε την μπάλα).

 

ΥΓ. Για το AI...

 

In artificial intelligence, an intelligent agent (IA) is an autonomous entity which observes and acts upon an environment (i.e. it is an agent) and directs its activity towards achieving goals (i.e. it is rational).[1] Intelligent agents may also learn or use knowledge to achieve their goals. They may be very simple or very complex: a reflex machine such as a thermostat is an intelligent agent,[2] as is a human being, as is a community of human beings working together towards a goal.

"may" ;)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλά δεν επιμένω.

 

Να ποστάρεις εδώ νομίζω πως είναι λίγο μη πρακτικό... copy paste και κόντρα copy paste σε αρχεία στον υπολογιστή του ο καθένας και αλλαγές και copy paste πίσω; Εγώ προσωπικά αν είμαι αναγκασμένος να πρηχτώ έτσι απλά προσπερνάω.

 

Just say no. Github. :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλά δεν επιμένω.

 

Να ποστάρεις εδώ νομίζω πως είναι λίγο μη πρακτικό... copy paste και κόντρα copy paste σε αρχεία στον υπολογιστή του ο καθένας και αλλαγές και copy paste πίσω; Εγώ προσωπικά αν είμαι αναγκασμένος να πρηχτώ έτσι απλά προσπερνάω.

 

Just say no. Github. :)

 

Ένα unrar θα κάνετε στο σκληρό σας και στο φάκελο που θα δημιουργηθεί θα γράψετε: make :P

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...