Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
50
Task/Knapsack-problem-0-1/LSL/knapsack-problem-0-1-1.lsl
Normal file
50
Task/Knapsack-problem-0-1/LSL/knapsack-problem-0-1-1.lsl
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
string sNOTECARD = "Knapsack_Problem_0_1_Data.txt";
|
||||
integer iMAX_WEIGHT = 400;
|
||||
integer iSTRIDE = 4;
|
||||
list lList = [];
|
||||
default {
|
||||
integer iNotecardLine = 0;
|
||||
state_entry() {
|
||||
llOwnerSay("Reading '"+sNOTECARD+"'");
|
||||
llGetNotecardLine(sNOTECARD, iNotecardLine);
|
||||
}
|
||||
dataserver(key kRequestId, string sData) {
|
||||
if(sData==EOF) {
|
||||
//llOwnerSay("EOF");
|
||||
lList = llListSort(lList, iSTRIDE, FALSE);
|
||||
integer iTotalWeight = 0;
|
||||
integer iTotalValue = 0;
|
||||
list lKnapsack = [];
|
||||
integer x = 0;
|
||||
while(x*iSTRIDE<llGetListLength(lList)) {
|
||||
float fValueWeight = (float)llList2String(lList, x*iSTRIDE);
|
||||
string sItem = (string)llList2String(lList, x*iSTRIDE+1);
|
||||
integer iWeight = (integer)llList2String(lList, x*iSTRIDE+2);
|
||||
integer iValue = (integer)llList2String(lList, x*iSTRIDE+3);
|
||||
if(iTotalWeight+iWeight<iMAX_WEIGHT) {
|
||||
iTotalWeight += iWeight;
|
||||
iTotalValue += iValue;
|
||||
lKnapsack += [sItem, iWeight, iValue, fValueWeight];
|
||||
}
|
||||
x++;
|
||||
}
|
||||
for(x=0 ; x*iSTRIDE<llGetListLength(lKnapsack) ; x++) {
|
||||
llOwnerSay((string)x+": "+llList2String(lList, x*iSTRIDE+1)+", "+llList2String(lList, x*iSTRIDE+2)+", "+llList2String(lList, x*iSTRIDE+3));
|
||||
|
||||
}
|
||||
llOwnerSay("iTotalWeight="+(string)iTotalWeight);
|
||||
llOwnerSay("iTotalValue="+(string)iTotalValue);
|
||||
} else {
|
||||
//llOwnerSay((string)iNotecardLine+": "+sData);
|
||||
if(llStringTrim(sData, STRING_TRIM)!="") {
|
||||
list lParsed = llParseString2List(sData, [","], []);
|
||||
string sItem = llStringTrim(llList2String(lParsed, 0), STRING_TRIM);
|
||||
integer iWeight = (integer)llStringTrim(llList2String(lParsed, 1), STRING_TRIM);
|
||||
integer iValue = (integer)llStringTrim(llList2String(lParsed, 2), STRING_TRIM);
|
||||
float fValueWeight = (1.0*iValue)/iWeight;
|
||||
lList += [fValueWeight, sItem, iWeight, iValue];
|
||||
}
|
||||
llGetNotecardLine(sNOTECARD, ++iNotecardLine);
|
||||
}
|
||||
}
|
||||
}
|
||||
85
Task/Knapsack-problem-0-1/LSL/knapsack-problem-0-1-2.lsl
Normal file
85
Task/Knapsack-problem-0-1/LSL/knapsack-problem-0-1-2.lsl
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
items = {
|
||||
{"map", 9, 150},
|
||||
{"compass", 13, 35},
|
||||
{"water", 153, 200},
|
||||
{"sandwich", 50, 160},
|
||||
{"glucose", 15, 60},
|
||||
{"tin", 68, 45},
|
||||
{"banana", 27, 60},
|
||||
{"apple", 39, 40},
|
||||
{"cheese", 23, 30},
|
||||
{"beer", 52, 10},
|
||||
{"suntan cream", 11, 70},
|
||||
{"camera", 32, 30},
|
||||
{"t-shirt", 24, 15},
|
||||
{"trousers", 48, 10},
|
||||
{"umbrella", 73, 40},
|
||||
{"waterproof trousers", 42, 70},
|
||||
{"waterproof overclothes", 43, 75},
|
||||
{"note-case", 22, 80},
|
||||
{"sunglasses", 7, 20},
|
||||
{"towel", 18, 12},
|
||||
{"socks", 4, 50},
|
||||
{"book", 30, 10},
|
||||
}
|
||||
|
||||
local unpack = table.unpack
|
||||
|
||||
function m(i, w)
|
||||
if i<1 or w==0 then
|
||||
return 0, {}
|
||||
else
|
||||
local _, wi, vi = unpack(items[i])
|
||||
if wi > w then
|
||||
return mm(i - 1, w)
|
||||
else
|
||||
local vn, ln = mm(i - 1, w)
|
||||
local vy, ly = mm(i - 1, w - wi)
|
||||
if vy + vi > vn then
|
||||
return vy + vi, { i, ly }
|
||||
else
|
||||
return vn, ln
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local memo, mm_calls = {}, 0
|
||||
function mm(i, w) -- memoization function for m
|
||||
mm_calls = mm_calls + 1
|
||||
local key = 10000*i + w
|
||||
local result = memo[key]
|
||||
if not result then
|
||||
result = { m(i, w) }
|
||||
memo[key] = result
|
||||
end
|
||||
return unpack(result)
|
||||
end
|
||||
|
||||
local total_value, index_list = m(#items, 400)
|
||||
|
||||
function list_items(head) -- makes linked list iterator function
|
||||
return function()
|
||||
local item, rest = unpack(head)
|
||||
head = rest
|
||||
return item
|
||||
end
|
||||
end
|
||||
|
||||
local names = {}
|
||||
local total_weight = 0
|
||||
for i in list_items(index_list) do
|
||||
local name, weight = unpack(items[i])
|
||||
table.insert(names, 1, name)
|
||||
total_weight = total_weight + weight
|
||||
end
|
||||
|
||||
local function printf(fmt, ...) print(string.format(fmt, ...)) end
|
||||
printf("items to pack: %s", table.concat(names, ", "))
|
||||
printf("total value: %d", total_value)
|
||||
printf("total weight: %d", total_weight)
|
||||
|
||||
-- out of curiosity
|
||||
local count = 0
|
||||
for k,v in pairs(memo) do count = count + 1 end
|
||||
printf("\n(memo count: %d; mm call count: %d)", count, mm_calls)
|
||||
Loading…
Add table
Add a link
Reference in a new issue