sorting failed error
monarch_dodra
monarchdodra at gmail.com
Mon Jul 30 12:33:15 PDT 2012
On Monday, 30 July 2012 at 12:36:21 UTC, maarten van damme wrote:
> For fun I started implementing a program that uses genetics
> algorithm's to solve the travelling salesman problem. I want to
> sort
> an array of chromosome structures according to their fitness. I
> now
> get the error:
>
> core.exception.AssertError at C:\D\dmd2\windows\bin\..\..\src\phobos\std\algorithm.
> d(6714): Failed to sort range of type chromosome[]. Actual
> result is: [chromosom
> e([city(20, 0), city(25, 25), city(10, 65), city(50, 50),
> city(75, 30), city(0,
> 10)]), chromosome([city(10, 65), city(50, 50), city(25, 25),
> city(75, 30), city(
> ...
>
> I have no idea what is wrong with my code and the error is not
> very informative.
> Does anyone have any idea as to what the problem could be?
>
> (full code is at
> https://dl.dropbox.com/u/15024434/travelling_salesman.d , If
> it's not
> something obvious then I'm going to try to reduce it to
> something as
> small as possible)
>
> Maarten
Just saw your code. Intriguing.
I'll have to stick with my gut feeling that sorting values by
calculating a floating point value on the fly is not optimal.
BTW: This:
workers=array(sort!(fitnessCompare)(workers));
is equivalent to:
workers.sort!fitnessCompare();
The point of sort's return value is that it is typed as sorted,
but you don't need to array->reassign.
Now, if instead of defining fitnessCompare, you use
"schwartzSort", a sort made to sort things depending on the
result of a function, calling the function one (AND ONLY ONCE)
for each value:
Replace
workers.sort!fitnessCompare();
with
workers.schwartzSort!(fitness,"a > b")();
Then the sort works correctly. And schwartzSort ALSO validates
the resulting sort.
Sorry I can't *certify* what the problem is, but at least you
have a workaround ;)
More information about the Digitalmars-d-learn
mailing list