الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ارجو المساعدة- كود لحساب معادلة

بدأه aliwaw1 في 4 فبراير 2014 · 7 رد · 650 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اخواني الاعزاء

لدي معادلة التالية

 

 

  sum=x(n)+y(m)+z(c

المطلوب ايجاد اقرب 5  قيم  يمكن الحصول عليها من المعادلة مقاربة لقيمة Sum

اذا كان  قيمة Sum  معروفة

وقيمة X=12

قيمة y=3

قيمة z=2

 

استخدمت loop  لحل المشكلة  لكن

كلما زادت قيمة (n,m,c) فان التنفيذ يأخذ ساعات   (مثلا  n=100,m=100,c=80)

سؤالي : ما هو الأفضل استخدامه لحل المعادلة  ؟ بحيث احصل على النتائج  مع سرعة في التنفيذ

تم تعديل هذه المشاركة بواسطة aliwaw1 في 4 فبراير 2014 في 12:29

#2

استخدمي loop ولكن حددي المجال المطلوب

أي : بداية الحلقة عند 0 ونهايتها عند 1000 (وليس أكثر )

أو : البداية عند -500 والنهاية عند 500

(طبعاً انت بحاجة إلى 3 حلقات متداخلة)

#3

شكرا اخي مصطفى قمت بذلك لكن التنفيذ بطي جدا  -  مع حاجتي لاضافة اكثر من حد للمعادلة

 

For n = 0 To 100
 xx = Val(X) * n
    For m = 0 To 100
    yy = Val(y) * m
        For c = 0 To 100
        zz = Val(z) * X
          ..
           ....
         
               f = xx + yy + zz


              If (f < Sum + 5 And f > Sum - 5) Then
                ...
              End If
           
      
        Next c
    Next m
   

Next n

تم تعديل هذه المشاركة بواسطة aliwaw1 في 4 فبراير 2014 في 13:32

#4

هناك طريقة لا بأس بها تعتمد على البحث الثنائي وهي سريعة جداً .

لنعتبر جميع المتحولات قيمتها 0

ونبدأ بمتحول واحد ..

ثم نستخدم خوارزمية binarySearch  للعثور على أقرب قيمة للمتحول n بحيث n*x  هو الأقرب لـ sum

ثم ننتقل للمتحول m ونطبق نفس الخوارزمية السابقة بحيث يكون m*y+n*x هو الأقرب لـ sum  ( حيث n*x هو الذي عثرنا عليه سابقاً لذلك فهو ثابت )

وهكذا حتى نمر على جميع المتحولات

______________________

ملاحظة : يمكننا تطبيق الطريقة السابقة بدون binary search فقط بحث عادي

حلقة للعثور على أفضل قيمة لـn في حال باقي المتحولات صفر

ثم حلقة للعثور على أفضل قيمة لـm في حال n هي التي عثرنا عليها سابقاً والباقي صفر

وهكذا ...

 

________________

ملاحظة : الجواب لن يكون مثالياً بل تقريبياً

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 5 فبراير 2014 في 15:19 — السبب: lg -- لا

#5

الاخ مصطفى ما رايك بهذا الكود

' the desired value is 180

car = "12.00000000"
hy = "1.00782500"
ni = "14.00307400"
ox = "15.99491500"

For i = 0 To 10
    c = Val(car) * i   
    arr1(i) = c
Next i
'---------------------
p_i = arr1(0)
For i = 0 To 10
    If arr1(i) >= p_i Then
        p_i = i
    End If
Next i

 
For j = 0 To 10
    h = p_i * Val(car) + Val(hy) * j
    arr2(j) = h
Next j

p_j = arr2(0)
For j = 0 To 10
    If arr2(j) >= p_j Then
        p_j = j
    End If
Next j

 
 '------------------------------------------
 
For x = 0 To 10
    n = p_i * Val(car) + Val(hy) * j + Val(ni) * x
    arr3(x) = n
Next x

p_X = arr3(0)
For x = 0 To 10
    If arr3(x) >= p_X Then
        p_X = x
        x_v = arr3(x)
    End If
Next x

 '-----------------------------
           
For y = 0 To 10
    o = p_i * Val(car) + Val(hy) * p_j + Val(ni) * p_X + Val(ox) * y
    arr4(y) = o
Next y

p_y = arr4(0)
For y = 0 To 10
    If arr4(y) >= p_y Then
        p_y = y
    End If
Next y

  f = p_i * Val(car) + Val(hy) * p_j + Val(ni) * p_X + Val(ox) * p_y

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 5 فبراير 2014 في 13:23 — السبب: تنسيق الكود

#6

الكود خاطئ وهناك عدة ملاحظات :

p_i = arr1(0)
For i = 0 To 10
    If arr1(i) >= p_i Then
        p_i = i
    End If
Next i

واضح أنك استعملت p_i ليحفظ أكبر قيمة في المصفوفة ولكن العملية

    If arr1(i) >= p_i Then        p_i = i    End If

ستحفظ الـindex وهي غير صحيحة بالمجمل فأنت تقارن index مع أحد العناصر

على كل حال , أظن أنك تقصد كتابة :

p_i = arr1(0)
For i = 0 To 10
    If arr1(i) >= p_i Then
        p_i = arr1(i)
    End If
Next i

=========================================

الملاحظة الثانية :

لاداعي لاستخدام المصفوفة , قم بالمقارنة مباشرة كما يلي

فبدلاً من

        For i = 0 To 10
            c = Val(car) * i
            arr1(i) = c
        Next i
        '---------------------
        p_i = arr1(0)
        For i = 0 To 10
            If arr1(i) >= p_i Then
                p_i = arr1(i)
            End If
        Next i

 

يمكنك كتابة

p_i = 0
        For i = 0 To 10
            c = Val(car) * i
            If c >= p_i Then
                p_i = c
            End If
        Next i

 

==========================

ولكن العملية التي قمت بها لا تقوم بالمطلوب إطلاقاً . فبالطبع سيكون أكبر عدد في المصفوفة هو المضروب بـ 10 ولكننا أصلاً لا نبحث عن أكبر عدد , بل عن "أفضل" عدد أي الذي يحقق أقل فرق ممكن مع الجواب المنتظر ( 180 في حالة الكود الخاص بك )

وبذلك يجب أن نكتب ما يلي :

If Math.Abs(180 - c) < tolerance Then
                p_i = c
            End If

هذا مثال فقط بما يجب أن تتابع عليه الكود ..

في كل مرحلة نختبر  : ((ما سبق + الجديد )ونطرحه من الناتج الذي نريد الوصول إليه) ونحاول الوصول إلى أصغر فرق ممكن

#7

شكرا اخي العزيز مصطفى على اهتمامك

 

لكن كيف اعرف قيمة tolerance

ساقوم باجراء التعديلات وفقا لشرحك

 

جزاك الله كل خير

تم تعديل هذه المشاركة بواسطة aliwaw1 في 6 فبراير 2014 في 15:01

#8

شكرا اخي مصطفى

 

تم اتباع شرحك ومثل ما ذكرت فان النتيجة تكون قريبة جدا

 

 

جزاك الله كل خير

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…