אלגוריתם מאתגר

cpdebugger

New member
אלגוריתם מאתגר

שלום רב מצ"ב קובץ JPG המכיל דוגמא מטריצה בולאנית (שיושבת כולה בזכרון) מהסוג שאני מקבל כקלט. (המימוש לא משנה – יש גישה לכל תא ופונקציות שימושיות שכתבתי). תא ריק ערכו – 0 ותא שיש בו X ערכו -1 . בלוק מוגדר כריבוע התחום בין שתי שורות ROW1, ROW2 ובין שני טורים COL1, COL2 במטריצה. בלוק בלתי תלוי מורכב מ – X ים כך שלכל X ששייך לבלוק ערכי row,col ROW1 <= row<= ROW2 COL2<= col <= COL1 בהתעלם כרגע משתי נקודות בעיתייות 13,28 ו 9,28, יש לי אלגוריתם פשוט המזהה את הבלוקים הבלתי תלויים במטריצה: האלגוריתם יזהה את: בלוק ראשון תחום ע"י 1,1-5,6 בלוק שני תחום ע"י 6,7-11,11 בלוק שלישי (המלא) תחום ע"י 12,12-19,17 בלוק רביעי תחום ע"י 20,18-40,37 האלגוריתם בפסאודו קוד.
blocks = FindFirstlevelBlocks(m){ if (m==0){ // all elements of m are zeros blocks = struct(); // create an empty structure return; } row_ind = no. of the row that has the maximum sum; tmp_cols = all columns i such that m(row_ind, i) = 1; tmp_rows = (); cols = (); rows = (); while (length(tmp_rows) > length(rows) | length(tmp_cols) > length(cols)){ // while rows is not full yet, or cols is not full yet rows = tmp_rows; cols = tmp_cols; tmp_rows = all rows that contain 1 in any column i tmp_cols; tmp_cols = all columns that contain 1 in any row i tmp_rows; } blocks(1) = struct('rows', rows, 'cols', cols); // the first block is the one found above m(rows,cols) = 0; // equivalent to: mi,j = 0 for all i rows, j cols blocks(2, 3, 4, …) = FindFirstLevelBlocks(m); // find the rest of the blocks }​
הבעיות מתחילות כאשר יש לי X ים כדוגמת 13,28 ו 9,28 הם הורסים לי את הבלוקים היפים והופכים (באלגוריתם שהצגתי) את המלבן התחום 6,7 40,37 לבלוק היררכי אחד כאשר למעשה הבלוקים 2,3,4 שמצאתי בלעדיהם נעלמו. אני מחפש דרך לזהות Xים בודדים כאלו כרעש במטריצה. כל רעיון, כיוון, LINK לדברים דומים שנעשו פעם, יתקבלו בברכה.
 

cpdebugger

New member
מישהו? רעיון?

פרסים יקרי ערך יוגרלו בין המגיבים, מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ מקפיץ
 

vinney

Well-known member
האלגוריתם שלך לא קריא כל כך

או שתכתוב אותו בעברית (הכי טוב) או שלפחות תיישר את הקוד...
 

cpdebugger

New member
הסברים

קל לזהות בעין כי קיימים במטריצה שבתמונה ארבעה בלוקים בלתי תלויים על האלכסון של המטריצה (בהתעלם מזוג הקורדינטות הבעייתיות). הרעיון הוא פשוט. אני בוחר שורה ומוצא שורות שיש להן Xים באחד מהטורים של השורה שמכיל X. כל שורה כזו שמצאתי גוררת חיפוש נוסף לגבי עצמה. הסבר: כדי למצוא אותם ואת התחומים שלהם אני מחפש שורה בעלת מספר ה-Xים הגדול ביותר (אפשר להתחיל מכל שורה אחרת ועדיין האלגוריתם יעבוד). נקרא לה row_ind אני מוצא את כל הטורים של row_ind המכילים X. – ומאפסן בוקטור tmp_cols אני מוצא את כל השורות במטריצה המכילות X באחד הטורים שמצאתי – ומאפסן בוקטור tmp_rows אני מחפש את כל הטורים במטריצה המכילים X באחת מן השורות בוקטור tmp_rows ומאפסן ב tmp_cols וחוזר חלילה. כאשר נמצאו כל השורות והטורים השייכים לבלוק, קוראים שוב לאלגוריתם עם תת המטריצה שלא כוללת את הבלוק הבלתי תלוי שנמצא. הבעיות מתחילות כאשר המטריצה לא מסודרת בצורה כל כך יפה ויש לי רעשים כדוגמת זוג ה Xים שיושבים בתמונה מחוץ לבלוקים. הם גורמים לאלגוריתם לזהות את הבלוקים שיושבים על האלכסון כבלוק גדול אחד מאחר והם יוצרים תלות בין הבלוקים. האלגוריתם עובד, אבל חלוקה לבלוקים גדולים לא טובה לי, ולא נכנס לסיבות המסובכות לכך. לו יכולתי לזהות את זוג הXים הבודדים כרעש הייתי פשוט מסיר את השורה בה הם יושבים. הבעייה שלי היא בזיהוי של שורות כשורות רעש. כלומר שורות שבלעדיהם יקטנו התלויות במטריצה בין הבלוקים.
 

vinney

Well-known member
האלגוריתם שלך לא נכון, זה הכל

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

cpdebugger

New member
הוא נכון, רק לא מספק

הוא בהחלט מוצא בלוקים בלתי תלויים בלי קשר לסידורם במטריצה. המטריצה שהבאתי לדוגמא מסודרת יפה לעין רק כדי שיהיה לי קל להסביר את עניין הבלוקים הבלתי תלויים. שים לב שהרעש 13,28 למשל, יוצר תלות בין הבלוקים : בלוק שלישי (המלא) תחום ע"י 12,12-19,17 בלוק רביעי תחום ע"י 20,18-40,37 הרעש יוצר X משותף לשני הבלוקים והופך אותם לתלויים אחד בשני. האלגוריתם יזהה אותם כבלוק אחד וזה נכון. מה שאני רוצה להשיג הוא זיהוי של 13,28 כרעש שההסרה של השורה שלו למשל תוריד את התלות בין הבלוקים ותיצור לי זוג בלוקים בלתי תלויים כשמקודם היה לי רק אחד. אולי אני צריך להחליף את אלגוריתם זיהוי הבלוקים במשהו אחר, אולי אני צריך אלגוריתם לזיהוי רעש. הבעייה שאין לי קצה חוט של מושג לגבי פתרון.
 

vinney

Well-known member
נתחיל מזה ש

אתה לא מגדיר את המושג "בלוקים בלתי תלויים". מה שנראה לך בעין, זה טוב ויפה, אבל למחשב אין עיניים.
 

cpdebugger

New member
מהתחלה

נתונה מטריצה בינארית (ערכים 1 ו 0) nXm שורה X במטריצה בינארית (ערכים 1 ו 0) תלוייה בשורה Y במטריצה אם קיים לפחות תא אחד בטור Mi בשורה X שערכו 1, כך שגם בשורה Y קיים תא בטור Mi שערכו 1. האלגוריתם למציאת תליוית בוחר שורה ובודק מי הן הטורים והשורות התלויות בה, ולכל שורה כזו שנמצאה בודק שוב, מי תלוי בה וכן הלאה עד שלא נמצאים יותר תלויות. השורות והטורים שנמצאו מאופסנים במבנה נתונים ומגדירים בלוק בלתי תלוי במטריצה. בשלב הבא לוקחים את התת מטריצה שאינה כוללת את הטורים והשורות בבלוק שמצאנו ומחפשים שוב. האלגוריתם עובד יופי. גם בהרצה יבשה וגם בקוד (מטלב ). הוא מסוגל לזהות את הבלוקים שאתה רואה בעיניך בתמונה הרבה יותר מהר ממך. הבעייה שלי היא זיהוי רעשים, מציאת נקודות בעיתיות כמו הנקודה הבודדת שאפשר לראות בעין בתמונה. נקודה כזו מגדילה את התלויות בין השורות והטורים ומקטינה את מספר הבלוקים שנמצאים על חשבון הגודל שלהם. אני מחפש דרך לגלות נקודות בעיתיות כאלו.
 

vinney

Well-known member
לפי ההגדרה שלך, האלגוריתם פועל יופי

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

cpdebugger

New member
עלית על הנקודה

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