Re: Algorithm Request

new topic     » goto parent     » topic index » view thread      » older message » newer message

On Mon, 7 Apr 2003 16:01:45 -0500, "C. K. Lester" <cklester at yahoo.com>
wrote:

Over ten years ago I wrote a best fit algorithm in COBOL, no less,
without recursion (and plenty of goto statements). I've wanted to
recode it in Euphoria for ages, and now I have.


--
-- Optimised best-fit algorithm
-- Pete Lomax 7th April 2003
--
include sort.e

integer required

sequence sizes
	sizes=3D{377,378,384,387,388,391,396,422,424,425,488,505}

sequence includeset

integer lowbest, lowlevel, highbest, highlevel, worktot, level, item
sequence lowset, highset

procedure display(sequence dtext, integer dtot, sequence dset, integer
dlevel)
integer ib
	printf(1,"%s %d\n",{dtext,dtot})
	for b=3D1 to dlevel do
		ib=3Ddset[b]
		printf(1,"%d  %d\n",{ib,sizes[ib]})
	end for
	if getc(0) then end if
end procedure

procedure find_combination()
--
-- This section tries to find a set of sizes which add up to the
-- required amount exactly.
--
	level=3D1
	lowbest=3D0
	highbest=3D999999999
	item=3Dlength(sizes)
	includeset=3Drepeat(0,item)
	worktot=3D0
	while 1 do
		includeset[level]=3Ditem
		worktot+=3Dsizes[item]
		if worktot=3Drequired then -- Found exact fit
			lowbest=3Dworktot
			lowlevel=3Dlevel
			lowset=3Dincludeset
			return
		end if
		if worktot<required and worktot > lowbest then
			lowbest=3Dworktot
			lowlevel=3Dlevel
			lowset=3Dincludeset
		end if
		if item > 1 -- More to be tested
		and worktot<required then
			item-=3D1
			level+=3D1 -- Leave item in table;
		else
			if worktot>required and worktot < highbest then
				highbest=3Dworktot
				highlevel=3Dlevel
				highset=3Dincludeset
			end if
			while 1 do
				--
				-- Now we need to backtrack;  remove item from running
				-- total and look at the next instead.
				--
				worktot-=3Dsizes[item]
				if item > 1 then -- More to be tested
					item-=3D1 -- Look at next (overwrite item in table)
					exit
				end if
				--
				-- We have exhausted all possibilities at this level;=20
				-- backtrack to a previous level.
				--
				includeset[level]=3D0
				level-=3D1
				if level=3D0 then return end if -- All done
				item=3Dincludeset[level]
			end while
		end if
	end while
end procedure

procedure main()
	required=3D0

	for i=3D1 to length(sizes) do
		required+=3Dsizes[i]
	end for
	required=3Dfloor(required/2)
	printf(1,"Required: %d\n",{required})

	sizes=3Dsort(sizes)
	find_combination()
	if lowbest=3Drequired then
		display("Exact fit",lowbest,lowset,lowlevel)
	else
		display("Lower figure",lowbest,lowset,lowlevel)
		display("Higher figure",highbest,highset,highlevel)
	end if
end procedure

	main()

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu