Skocz do zawartości

Problem Komiwojazera


Fervi_

Rekomendowane odpowiedzi

Witajcie!

 

Muszę na sieci neuronowe rozwiązać "Problem Komiwojażera" - nie ważne w czym ;P Więc chcę użyć GM'a

 

Na razie mam problem (z GM6 i Enigma) z obliczeniem dystansu do obiektu

Najłatwiej byłoby obliczyć dystans z obiektu 0 do obiektu 1 (obj_0 i obj_1), ale nie wiem czy dobrze kombinuję (i tak coś nie działa)

 

GML
score=obj_1.distance_to_object(obj_2)

 

Kod nie działa pod GM6 (wywołuje błąd), pod Enigmą się kompiluje, ale zwraca 0 (może funkcja distance_to_object nie działa poprawnie); anyway - jak wy byście zmierzyli Dystans między objektem 1, a 2 (lub 0 i 1, obojętne)

 

Fervi

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

nie możesz funkcji wywoływać z kropki w gamemakerze

 

with( obj1 ) global.distance = distance_to_object( obj2 );

 

 

 

//edit: opcjonalnie point_distance( obj1.x,obj1.y,obj2.x,obj2.y ); jak napisal threef

miałem kartę długo otwartą i się nie skapnąłem, że ktoś już zdążył

Odnośnik do komentarza
Udostępnij na innych stronach

Wasz znienawidzony Fervi, którego macie dość, potrzebuje jeszcze się coś dopytać

 

1) Czy istnieje zagadnienie "permutacji" w GM (chodzi mi o to, by GM przeanalizował wszystkie możliwe kombinacje cyfr od 0 do 7 (np. 01234567, 01234576) itd.

 

Czasowo nie mam pytań

 

Fervi

Odnośnik do komentarza
Udostępnij na innych stronach

To teraz najciekawsze i najgłupsze pytanie ever xD

 

Mam plik o rozmiarze 362.9KB :D Z każdą możliwą możliwością

 

01234567

01234576

01234657

 

W takiej formie leci

 

Jak zrobić, żeby (przykładowo na szybko)

Każdy element był wyświetlany w jakiejś funkcji

Ogólnie funkcja to distance_point(obj_0.x, obj_0.y,obj_1.x, obj_1.y) + distance_point(obj_1.x, obj_1.y,obj_2.x, obj_2.y) + itd.

 

Chodzi o to, by pod obj_XYZ podkładać po kolei cyfry :D (w miejsce XYZ)

 

Oj, czuję, że mój procesor eksploduje o ile ktoś pomoże z taką funkcją :D

 

Fervi

Odnośnik do komentarza
Udostępnij na innych stronach

Istnieje takie pojęcie?

 

Mogę zmienić np. nazwę obiektu z obj_XYZ na XYZ

Tylko czy to ma jakiś głębszy sens

 

Ewentualnie oszukam przeznaczenie i jakoś to będzie (na ograniczonej liczbie obiektów, nie 8, a np. 4 - 6)

 

Fervi

Odnośnik do komentarza
Udostępnij na innych stronach

No to nie operuj na nazwach, tylko na id tworzonych obiektów, wsadź je do najprostszej tablicy i zamiast XYZ w nazwie używaj indeksów tablicy.

 

GML
obj[0]=instance_create();

obj[1]=instance_create();

(...)

 

point_distance(obj[0].x, obj[0].y,obj[1].x, obj[1].y) + point_distance(obj[1].x, obj[1].y,obj[2].x, obj[2].y)+(...)

 

Możesz użyć prostej pętli żeby to wszystko dodać.

Odnośnik do komentarza
Udostępnij na innych stronach

Inne pytanie

 

funkcja min zwraca minimalne liczby (np. 0, 1, 2 da 0)

 

Czy da się podając jako argument (ab, ac) wyciągnąć, który argument jest mniejszy (przykładowo ac)?

 

Fervi

Jeśli chodzi Ci o zwykłą funkcje min. to w GM'ie będzie to wyglądało chyba tak:

GML
a = argument0;

b = argument1;

 

if( a > b )

return b;

else

return a;

Dawno nie pisałem nic w GM'ie, ale jeśli mnie pamięc nie myli, to robiło się coś w tym stylu. Rzecz jasna tworzysz sobie skrypt, i wklepujesz do niego powyższy kod.

Potem zwykłe wywołanie skryptu w kodzie, gdzie Ci tam to potrzebne:

GML
zmienna = nazwa_skryptu( liczba, liczba ); // I oto do zmiennej zostanie zapisana ta mniejsza liczba.</span>
Odnośnik do komentarza
Udostępnij na innych stronach

Opiszę o co chodzi (z nowym przykładem)

 

To jest przykład

 

Ogólnie na dzień dzisiejszy kod wygląda tak, że jest skrypt, który przyjmuje 8 argumentów, oblicza point distance i wyciąga minimum (np. 3000)

Jednak mając 5000 danych do porównania dość ciężko wiedzieć, który jest minimum

 

I chodzi o to, by wiedzieć, który jest minimum i jakie ma argumenty (argument0 itd.), by potem do draw_line wykorzystać

 

Fervi

Odnośnik do komentarza
Udostępnij na innych stronach

Prawdopodobnie ostatnie pytanie :D

 

w Scripts -> Liczykon mam

GML
score=point_distance(argument0.x, argument0.y, argument1.x, argument1.y)+point_distance(argument1.x, argument1.y, argument2.x, argument2.y)+point_distance(argument2.x, argument2.y, argument3.x, argument3.y)+point_distance(argument3.x, argument3.y, argument4.x, argument4.y)+point_distance(argument4.x, argument4.y, argument5.x, argument5.y)+point_distance(argument5.x, argument5.y, argument6.x, argument6.y)+point_distance(argument6.x, argument6.y, argument7.x, argument7.y)+point_distance(argument7.x, argument7.y, argument0.x, argument0.y);

 

if(score<lives)

{

return(min(lives, score));

global.a=argument0

global.b=argument1

global.c=argument2

global.d=argument3

global.e=argument4

global.f=argument5

global.g=argument6

global.h=argument7

}

 

W obj_controller zrobiłem tester (Draw)

GML
draw_text(10, 10, score);

draw_text(20, 10, a);

draw_text(30, 10, b);

draw_text(40, 10, c);

draw_text(50, 10, d);

draw_text(60, 10, e);

draw_text(70, 10, f);

draw_text(80, 10, g);

draw_text(90, 10, h);

I zwracany jest tylko score. Zakładam, że muszę zreturnować każdą ze zmiennych? Tylko jak to zrobić (nie ma chyba funkcji, która zwraca dwie wartości)

 

Fervi

Odnośnik do komentarza
Udostępnij na innych stronach

Zrobiłem tak jak napisałeś (wstawiając wszędzie global) i nic

 

Za to jeśli pod jedną ze zmiennych podstawiłem "health" - zadziałało

 

D A F U Q

 

Fervi

 

PS.

Globalvar (a, b, c, d, e, f, g, h);

CHYBA DZIAŁA, CZEKAĆ

Niestety, nie działa :|

?

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...