حل مسأله کوله پشتی کسری:
فرض کنید شما یک کوله پشتی در اختیار دارید که مانند هر کوله پشتی دیگری می تواند وزن معینی از بار را تحمل کند که در این مسأله maxweight مشخص شده است. مجموعه ای از اشیا دارید که هر کدام دارای وزن و ارزش مشخصی هستند و تمام اشیاء موجود در این مجموعه به گونه ای هستند که می توان نه تنها تمام آن شئ را برداشت بلکه می توان شئ را خرد کرده و بخش کمتری از شئ را برداشت که میزان نسبت ارزش به وزن آن شئ حفظ شود و آن بخش کمتر نیز به همان میزان ارزش داشته باشد.
ورودی های این مسأله عبارتند از :
متغیرهای الگوریتم عبارتند از:
private string RunKnapsack(values as array of double, weights as array of double, maxweight as double)
strout as string <-- string.Empty;
sum as double <-- 0.0
ratio as array of double <-- new array of double[Length of values]
pickedItems as array of double <-- new array of double [Length of values]
wtemp as double <-- 0.0
ic as integer <-- 0
best as integer <-- 0
if Length of values <> Length of weights then
show messageBox "Invalid input"
return strout
ic <-- 0
while ic < Length of values do
ratio[ic] <-- values[ic] / weights[ic]
pickedItems[ic] <-- 0
ic <-- ic + 1
while wtemp < maxweight do
best <-- 0
ic <-- 0
while ic < Length of values do
if (pickedItems[ic] == 0) and (ratio[best] < ratio[ic]) then
best <-- ic
ic <-- ic + 1
if (wtemp + weight[best]) <= maxweight then
strout.AppendNewLine("W(" + ToString(best) + ") and P("
+ ToString(best) + ") Has been picked completely")
sum <-- sum + values[best]
wtemp <-- wtemp + weights[best]
pickedItems[best] <-- 1
ratio[best] <-- -1
else
pickedItems[best] <-- values[best] * (maxweight - wtemp) / weights[best]
strout.AppendNewLine("W(" + ToString(best) + ") and P(" + ToString(best) +
") Has been picked with %" + ToString(pickedItems[best] / values[best] * 100)
sum <-- sum + values[best] * (maxweight - wtemp) /weights[best]
wtemp <-- maxweight
strout <-- "Sum of picked values = " + ToString(sum) + NewLine + strout
strout as string <-- string.Empty;
sum as double <-- 0.0
ratio as array of double <-- new array of double[Length of values]
pickedItems as array of double <-- new array of double [Length of values]
wtemp as double <-- 0.0
ic as integer <-- 0
best as integer <-- 0
strout را از نوع رشته ای تعریف کرده و یک رشته ی خالی به نسبت می دهد.
sum را از نوع اعشاری تعریف کرده و مقدار صفر را به آن نسبت می دهد.
ratio را از نوع آرایه ای از اعداد اعشاری تعریف کرده و یک آرایه از نوع اعداد اعشاری با تعداد اعضای معادل طول پارامتر values به آن نسبت می دهد.
pickedItems نیز دقیقا مانند ratio تعریف می شود.
wtemp یک متغیر از نوع اعشاری است و مقدار اولیه صفر را به آن نسبت می دهیم.
ic و best نیز هر کدام یک متغیر از نوع عدد صحیح هستند و مقدار اولیه صفر به هرکدام نسبت می دهیم که البته در ابتدا می توانیم هیچ مقداری به آنها نسبت ندهیم.
if Length of values <> Length of weights then
show messageBox "Invalid input"
return strout
اگر طول آرایه values با طول آرایه weights برابر نبود آنگاه یک پیغام نشان داده شود که ورودی اشتباه است و strout که در اینجا یک متن خالی است را به عنوان خروجی تابع برگرداند. عدم برابری طول دو آرایه مذکور به معنی این است که برای یک یا چند شئ وزن تعریف کردیم ولی برایش ارزش تعریف نکرده ایم یا بر عکس. و این یعنی وزن ها ممکن است معادل ارزش هم ردیف خود در آرایه دیگر نباشند.
ic <-- 0
while ic < Length of values do
ratio[ic] <-- values[ic] / weights[ic]
pickedItems[ic] <-- 0
ic <-- ic + 1
در اینجا حتما باید به متغیر ic مقدار صفر دهیم چون در حلقه بعدی به عنوان شمارنده ی حلقه از ابتدای آرایه مورد استفاده بگیرد.
تا زمانیکه ic کوچکتر از طول آرایه values است انجام بده:
خانه ی شماره ic را از آرایه values تقسیم بر خانه ی معادل خود در آرایه weights کن و حاصل را درون خانه ی شماره ic از آرایه ratio قرار بده.
مقدار 0 را به خانه شماره ic از آرایه pickedItems نسبت بده.
یک واحد به شمارنده حلقه اضافه کن.
تا زمانیکه مقدار ic کمتر از طول آرایه values است دستورات زیر را انجام بده: