לכל השואלים על פיטנס ודאבל - סדר בבלגן

מנהלים: The Architect, The Architect

agman
הודעות: 34
הצטרף: 23:40 23/12/2008

לכל השואלים על פיטנס ודאבל - סדר בבלגן

שליחה על ידי agman » 21:13 12/02/2009

טוב, אז מכיון ששיש פה הרבה אנשים ששואלים שוב ושוב את אותה השאלה לגבי - מה זה לעזאזל floating point או מי זאת הנזירה הזאת שנמצאת ב-double ומה היא רוצה מהחיים שלנו, החלטתי לנסות לעשות קצת סדר בבלגן ולהבהיר את הדברים. (בתכל'ס זה לרכז את כל מה שכבר נאמר בצורה מסודרת)

קודם כל, אני לא מגלה שום דבר חדש, אבל fitness צריך להיות מטיפוס double ולא Double, ואפשר להבין את זה מהחתימה של השיטה getFitness... אז לא להתבלבל.

דבר שני, floating point, זוהי דרך קידוד של המחשב למשתנים ממשיים, או מה שאנחנו קוראים double, אז גם מהמושג הזה אין מה להיבהל, זה סתם עוד מושג...

דבר שלישי, Individual היא מחלקה אבסטרקטית, צריך להפנים את זה - אז לכל מי ששואל למה פיטנס הוא double ולא integer, זה בגלל ש-Individual היא בעיקרון מחלקה שמייצגת פתרון כלשהו לבעיה, ועוד לא ברור במשימה 1 אם הוא צריך להיות חיובי או ממשי. אבל מדרישות העבודה בהמשך, אפשר לראות שהוא צריך להיות מספר אי שלילי, מה שמוביל לדבר הבא:

דבר רביעי, מה זה הערך המיוחד הזה? או מי זאת הנזירה הזאת לעזאזל? אז אמנם לא למדנו, אבל ל-double יש ערך מיוחד שנקרא NaN, שמשמעותו Not a Number. כמו שיש null בכתובות, אז אפשר להגיד שזה משהו בסגנון לגבי מספרים ממשיים. עכשיו, שימו לב שאפשר להציב את הערך הזה לתוך fitness שלנו למרות שהוא מטיפוס double ולא Double. איך? פשוט כותבים:
fitness = Double.NaN

אז למה לעזאזל צריך גם שיטה שנקראת isNaN ומהו הכתיב הנכון להשתמש בה?
טוב, אז מסתבר שברגע שמאתחלים משתנה ל-NaN, אם נרצה לדעת שהמשתנה הזה הוא NaN, או אם נרצה להשוות בין שני משתנים שהם NaN, לא נוכל להשתמש ב- == שאנחנו מכירים, אלא רק בשיטה הזאת שנבנתה בדיוק לסיטואציה הזאת. הכתיב הנכון לשימוש הוא:
Double.isNaN ובתוך סוגריים את שם המשתנה (אחרי כמובן).

זה הכל.
מקווה שעזרתי למי שהיה צריך.
בהצלחה.

yurib
הודעות: 207
הצטרף: 18:30 19/11/2008

הסבר קצר על clone

שליחה על ידי yurib » 21:30 12/02/2009

כל הכבוד ! :)
אני בדיוק כתבתי הסבר קצר לגבי clone מאותה הסיבה, אז אם כבר, נאחד את הפוסטים.
במהלך העבודה אנחנו נדרשים לעבוד עם אובייקטים מסוג Individual, אלו כמובן לא יהיו אובייקטים שהם נטו Individual, אלא אובייקטים ממחלקה שירשה את Individual והשלימה את מה שחסר במחלקה האבסטרקטית, אבל אנחנו לא יודעים מהו המימוש של המחלקה הסופית, אנחנו יודעים רק שהיא ירשה מ Individual, אז איך לדוגמא ניצור עותק חדש של אותו אובייקט ? בד"כ היינו קוראים לבנאי המעתיק שלו, אבל עכשיו שאנחנו לא יודעים לאיזו מחלקה הוא שייך, לאיזה בנאי נקרא ?
לעזרתינו באה השיטה clone. אנחנו לא יודעים איך האובייקט שאיתו אנחנו עובדים כרגע ממומש ומה הוא מכיל, אבל אנחנו כן יודעים מממש את clone, ומה השיטה הזו עושה בעצם ? היא מחזירה לנו העתק של אותו אובייקט, כיוון שהיא כתובה בתת מחלקה שיורשת מ Individual, היא יודעת איך האובייקט שלו היא שייכת בנוי ויודעת איך להעתיק אותו.

קוד: בחירת הכל

public class MyClass{
	
	public Object copyObject(MyObject o) {
		// we would like to be able to return a copy of the object we receive
		// as a parameter, regardless of its type.
		Object copy;
		// usually we would just call the object's copy constructor, but we don't know
		// what is the type of the object, maybe its a Point, maybe its a Complex, maybe a Student...
		// which constructor should we call ?
		// since the object we have implements the Cloneable interface, we don't have to know.
		copy = o.clone();
		// MyObject knows how to create a copy of its self.
      return copy;
	}
}
איך נראה המימוש של clone() ? פשוט מאוד, אפשר ליצור אובייקט חדש מאותו הסוג ולהעתיק אליו את כל השדות, בד"כ נהוג לקרוא ל clone של מחלקת העל.

קוד: בחירת הכל

public class MyObject implements Cloneable {

  // all the fields and methods....

  public MyObject clone() {
    MyObject copy = null;
	try {
		copy = (MyObject)super.clone();
	} catch (CloneNotSupportedException e) {
		System.out.println(e.getMessage());
	}
    // copy the fields specific to MyObject
    return copy;
  }
}
}
ולסיכום, רק כדי לעודד אותכם קצת ולהראות שאלגוריתמיקה אבולוציונית יכולה להיות אפילו קצת מצחיקה: http://xkcd.com/534/ :)
נערך לאחרונה על ידי yurib ב 23:22 13/02/2009, נערך 7 פעמים בסך הכל.

sabagn
הודעות: 34
הצטרף: 16:51 19/11/2008

שליחה על ידי sabagn » 22:04 12/02/2009

שנייה אז מ agman ומהFAQ אני מבין שהבדיקה צריכה להיות ככה:
(if (Double.isNaN(fitness והמשתנה fitness יהיה מסוג double

ומיורי הבנתי שהבדיקה צריכה להיות:
(()if (this.fitness.isNaN והמשתנה fitness יהיה מסוג Double

שתי השיטות עוברות קומפיליציה... אבל מה נכון?

תודה.

yurib
הודעות: 207
הצטרף: 18:30 19/11/2008

שליחה על ידי yurib » 22:09 12/02/2009

שתיהן, באפשרות אחת אתה קורא לשיטה של האובייקט ואילו באחרת אתה קורא לשיטה סטטית של המחלקה.
תאורטית, כשאתה עובד עם אובייקט נכון (נהוג) יותר לקרוא לשיטות שלו, ואילו לשיטה הסטטית כאשר אתה עובד עם משתנה מטיפוס אחר, אבל במקרה הזה זה באמת לא משנה.

yossib
הודעות: 10
הצטרף: 20:32 30/11/2008

שליחה על ידי yossib » 22:17 12/02/2009

תודה על העזרה, יורי ניסיתי את מה שאתה אומר וזה לא מתקמפל זה אומר שחסר . או ) באותה שורה, זה מתקמפל לך?

yurib
הודעות: 207
הצטרף: 18:30 19/11/2008

שליחה על ידי yurib » 22:22 12/02/2009

כן, אם דרך אחד עובדת לך והאחרת לא אז לך על זו שעובדת, זה באמת לא משנה.

yossib
הודעות: 10
הצטרף: 20:32 30/11/2008

שליחה על ידי yossib » 22:29 12/02/2009

אני מתכוון שניסיתי את הקוד של ה-clone
יכול להיות שלא הבנתי אבל רשום לך למטה שאתה מחזיר tmp ולא השתמשת בו בכלל.
ורשמתי בדיוק את אותו הקוד וזה לא התקמפל לי
אתה יכול להסביר את הקטע הזה שאתה קורא לסופר לא הבנתי...[/quote]

agman
הודעות: 34
הצטרף: 23:40 23/12/2008

שליחה על ידי agman » 22:34 12/02/2009

יורי קבוצת תמיכה בע"מ....

yurib
הודעות: 207
הצטרף: 18:30 19/11/2008

שליחה על ידי yurib » 22:59 12/02/2009

אני מתנצל, היו סוגריים מיותרים בדוגמא שלי כפי שהמתרגל ציין. תיקנתי את זה.
וה tmp אמור להיות copy, תיקנתי גם את זה.
ובנוסף צריך גם כמובן לתפוס את החריגה שנזרקת ע"י clone(), הספתי גם את זה.
ממש מנצל על ההטעיה, פשוט כתבתי את הקוד ישירות פה בפורום, אני מניח שהייתי צריך להריץ את זה קודם...

Doron_x
הודעות: 31
הצטרף: 19:34 30/11/2008

שליחה על ידי Doron_x » 23:09 12/02/2009

כל הכבוד לשניכם,
זה עזר מאוד תודה.

saboniko
הודעות: 3
הצטרף: 20:21 31/12/2008

שליחה על ידי saboniko » 23:11 12/02/2009

שאלה קטנה, אמרו שהערך של פיטנס הוא לא שלילי, אז למה לא לאתחל אותו למס' שלילי פשוט??

למה להשתמש בdouble.NAN הזה או וואטאבר?

thelegend
הודעות: 95
הצטרף: 21:02 15/12/2008

איך...

שליחה על ידי thelegend » 23:20 12/02/2009

איך עשית את זה דביק?????????????????????? אהה agman או שבמקרה אחד המתרגלים ראה את ההודעה הזאת ועשה אותה דביק?

agman
הודעות: 34
הצטרף: 23:40 23/12/2008

שליחה על ידי agman » 23:28 12/02/2009

saboniko כתב:שאלה קטנה, אמרו שהערך של פיטנס הוא לא שלילי, אז למה לא לאתחל אותו למס' שלילי פשוט??

למה להשתמש בdouble.NAN הזה או וואטאבר?
להגיד לך את האמת, שאלה מצוינת...

אני כתבתי את כל התוכנית שלי בהתבסס על זה שהערך של פיטנס הוא מינוס 1.
הכל עבד מצוין.
עד שבאתי לפורום, ונדהמתי לגלות, :o , שיש משהו שנקרא NaN ואולי כדאי לאתחל את פיטנס למשהו הזה.
עכשיו שמנסים להבין את ההגיון, דווקא אפשר למצוא אותו באיזשהו מקום...
נזכור ש-Individual היא מחלקה אבסטרקטית שמתארת פתרון פרטי כלשהו של אלגוריתם אבולציוני. אז זה שבמקרה שלנו הוא תמיד אי שלילי, לא אומר שבבעיות אחרות גם נרצה שזה יהיה המצב. יכול להיות שנעדיף לחשב פיטנס כמספר ממשי... בתרגיל הזה, כנראה שאין בכך צורך, ואפשר פשוט להשתמש במשתנה טבעי... אז אין בעיה - דורסים את EVALUATE והכל טוב...

thelegend
הודעות: 95
הצטרף: 21:02 15/12/2008

אחד שלא מבין הרבה

שליחה על ידי thelegend » 23:55 12/02/2009

אני בכלל לא מבין למה הפיטנס צריך להיות NaN או למה הוא בכלל יכול להיות כזה הרי פיטנס זה כולה מספר שמראה כביכול על איכות האינדבידואל זה הכל אז איך יכול להיות שהוא לא יהיה מספר בעבודה הזאת??

thelegend
הודעות: 95
הצטרף: 21:02 15/12/2008

אבל

שליחה על ידי thelegend » 01:09 13/02/2009

השיטה getFitness זה לא getter???
ואם היא צריכה לדעת כמו שאתה אומר על אינדיבידואל משהו אז אני צריך לעשות
( אינדיבידואל הוא בעל ערך מספרי)if ואם כן או לא מה אז הרי השיטה getFitness היא לא שיטה בוליאנית אז מה להחזיר ומה לעשות בהקשר הזה עם evaluate אני קצת מבולבל כנראה מההסבר באנגלית על מה שצריך לעשות או משהו כזה, אפשר קצת עזרה?
תודה

נעול

חזור אל “- מבוא למדעי המחשב”