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