Поиск Коммивояжера с открытым исходным кодом функционирует / библиотека в c / C++? [закрытый]

Я только что взглянул на спецификацию металла сейчас. Я не буду пытаться полностью ответить на ваш последний вопрос. Но я думаю, что на вопросы синтаксиса можно ответить концептуально, просто имея дело с различными компонентами и следуя арифметическим правилам, определенным металлом.

он также не любит float2 (a, -b). Это выдает ошибку «нет подходящего конструктора для преобразования между float и float2». Как создать векторный литерал?

blockquote>

Используйте для этой цели функции, определенные в заголовочном файле vector_functions.h (или .hpp). (см. пример ниже). Векторные типы, определенные для CUDA в vector_types.h, не имеют конструкторов.

Первое, что ему не нравится, это x.yx. В Metal это меняет порядок содержимого float2. Как изменить или изменить порядок доступа к вектору в Cuda?

blockquote>

В CUDA нет встроенной функции обработки / перемещения нескольких векторных элементов. Просто выполните операцию над элементами, используя типы элементов.

metal:  return float2(a, -b)*x.yx;

CUDA:   #include 
        ...
        return make_float2(a*x.y, -b*x.x);

Последнее, на что он жалуется, это отсутствие оператора * для float и float2 для строки dt f (x [i]). Если я удаляю dt и просто устанавливаю его на x [i] + = f (x [i]), он жалуется, что для float2 и float2 нет оператора + =. Как мне выполнить операции над этими типами и можно ли умножить векторы и скаляры?

blockquote>

Как и выше, вам нужно будет построить эквивалентную арифметику поэлементно.

metal:  x[i] += dt*f(x[i]);

CUDA:   float2 temp1 = x[i];
        float2 temp2 = f(temp1);
        temp1.x += dt*temp2.x;
        temp1.y += dt*temp2.y;
        x[i] = temp1;

Должна быть возможность определить собственный набор векторных типов, чтобы соответствовать большинству возможностей металла, если вы хотите это сделать. То, что я здесь описываю, использует то, что является «встроенным», и может быть моделью, если вы хотите создать свои собственные типы с помощью конструкторов, арифметических операторов и т. Д.

Что касается вашего последнего вопроса, CUDA не всегда JIT во время выполнения, как вы описываете для металла. Вероятно, ближе всего к тому, что вы описываете, может быть что-то, использующее шаблонирование C ++, которое поддерживается CUDA. В общем, если вы можете преобразовывать операции с металлом в эквивалентные операции C ++, вы должны иметь возможность напрямую реализовывать их в CUDA.

6
задан Glorfindel 3 February 2019 в 10:23
поделиться

3 ответа

Эти хорошие взгляды.

Я знаю, что это не большой ответ, но если Вы открыты для изменяющейся технологии затем scipy, имеет набор алгоритмов оптимизации, которые очень хороши

1
ответ дан 17 December 2019 в 07:10
поделиться

В целом Фракталы Заполнения Пространства дадут Вам некоторые лучшие результаты по самым низким ценам.

В частности, я рекомендовал бы кривую Sierpiński.

Вот демонстрационная реализация, которая использует его:

(defvar *grid-width* 100000)
(defvar *grid-heigth* 100000)
(defvar *max-number-of-points* 1000)
(defvar *search-area-width* (* 2 *grid-width*))
(defvar *search-area-heigth* (* 2 *grid-heigth*))

(defun make-random-point (max-x max-y)
    "makes a point in a random position of the grid"
    (complex
        (/ (random (* max-x 1000)) 1000)
        (/ (random (* max-y 1000)) 1000)))


(defun make-random-point-list (max-len)
    "makes a list of random points up to max-len length"
     (let   ((value ()))    ; Make a set of random points
         (dotimes (n (random max-len) value)
            (setq value
                (cons (make-random-point *grid-width* *grid-heigth*) value)))))

(defun get-printable-point-position (point)
    "Gets a rounded-off point that can be used to make a dot on a visual grid"
    (complex
        (round (realpart point))
        (round (imagpart point))))

(defun euclid (point-a point-b)
    "calculates the euclidean distance in between two points"
    (let*   ((p (- point-a point-b)))
        (sqrt
            (+  (expt (realpart p) 2)
                (expt (imagpart p) 2)))))

(defstruct triangle
    "A triangle consists of 3 points.
    Complex numbers are used to construct the points,
    the real part signifying the X axis,
    and the imaginary part signifying the Y axis."
    a b c)

(defun avg (&rest numbers)
    "Gets the average of the numbers provided"
    (if
        (null numbers)
        1   ; prevents divide by 0
        (/ (apply #'+ numbers) (length numbers)))) ;/

(defun get-triangle-centre (triangle)
    "Gets the centre of a triangle"
    (avg (triangle-a triangle)
         (triangle-b triangle)
         (triangle-c triangle)))

(defstruct (triangle-list
        (:include triangle))
    point-list)

(defun triangle-split (triangle)
    "Splits a triangle in two according to the rule:
    { a0->c1; b0->a1,c2; c0->a2; avg(c0,a0)->b1,b2 }"
    (let*  ((old-a-point (triangle-a triangle))
            (old-b-point (triangle-b triangle))
            (old-c-point (triangle-c triangle))
            (new-b-point (avg old-a-point old-c-point)))
        (list
            (make-triangle-list :a old-b-point :b new-b-point :c old-a-point)
            (make-triangle-list :a old-c-point :b new-b-point :c old-b-point))))

(defun triangle-list-split (triangle-list)
    "Split a triangle list and acomodate all the points in their right places"
    (let*  ((triangles  (triangle-split triangle-list))
            (triangle-a (car triangles))
            (triangle-b (cadr triangles))
            (centre-a   (get-triangle-centre triangle-a))
            (centre-b   (get-triangle-centre triangle-b)))
        (dolist (point (triangle-list-point-list triangle-list))
            (if (< (euclid point centre-a) (euclid point centre-b))
                (setf (triangle-list-point-list triangle-a)
                    (cons point (triangle-list-point-list triangle-a)))
                (setf (triangle-list-point-list triangle-b)
                    (cons point (triangle-list-point-list triangle-b)))))
        (let   ((list-a (triangle-list-point-list triangle-a))
                (list-b (triangle-list-point-list triangle-b)))
            (if (= 1 (length list-a))
                (setf (triangle-list-point-list triangle-a) (car list-a)))
            (if (= 1 (length list-b))
                (setf (triangle-list-point-list triangle-b) (car list-b))))
        (list triangle-a triangle-b)))

(defun print-point (out point &rest args)
    "Utility function - Pretty-prints a point"
    (format out "(X:~F, Y:~F)"
        (realpart point)
        (imagpart point))
    args)

(defun pprint-triangle-list (out triangle-list &rest args)
    "Utility function - Pretty-prints a triangle-list object"
    (format out "   TRIANGLE{
        A:~/print-point/
        B:~/print-point/
        C:~/print-point/
        CENTRE:~/print-point/
        POINTS:{~{~/print-point/~^,~%                ~}}~&    }"
        (triangle-a triangle-list)
        (triangle-b triangle-list)
        (triangle-c triangle-list)
        (get-triangle-centre triangle-list)
        (let   ((points (triangle-list-point-list triangle-list)))
            (cond
                ((null points)  ())
                ((listp points) points)
                (t (list points)))))
    args)

(defun print-list-of-triangle-list (lst)
    "Pretty-prints a list of triangle-list objects"
    (format t "(~{~/pprint-triangle-list/~^,~% ~}~&)" lst))

(defun explode (lst)
    "explodes a triangle-list list and gets all
    the points in the order they should be"
    (let ((l (flatten lst)))
        (cond
            ((null l) ())
            ((triangle-list-p l) (explode (triangle-list-split l)))
            ((null (triangle-list-point-list (car l)))
                (explode (cdr l)))
            ((atom (triangle-list-point-list (car l)))
                (cons (car l) (explode (cdr l))))
            (t  (explode (append (triangle-list-split (car l)) (cdr l)))))))


(defun flatten (lst)
    "Flattens a list (removes nesting and nulls)"
    (cond
        ((atom lst) lst)
        ((listp (car lst))
            (append (flatten (car lst)) (flatten (cdr lst))))
        (t  (append (list (car lst)) (flatten (cdr lst))))))

(let   ((triangle (make-triangle-list
                :a          (complex 0 *search-area-heigth*)
                :b          0
                :c          *search-area-width*
                :point-list (make-random-point-list *max-number-of-points*))))
    (print-list-of-triangle-list (explode triangle)))

У меня также была версия с помощью GA (что один в C), но он живет в неисправном жестком диске.

3
ответ дан 17 December 2019 в 07:10
поделиться

Вы не обязательно должны бросать, вы можете просто лечить дату SQL, как если бы это было дата мнимания:

java.sql.Date sqlDate = new java.sql.Date(whenever);
java.util.Date utilDate = sqlDate;

компилирует и работает просто нормально.

-121--3518760-

Вот один здесь , который точно решает TSP, но это в Паскале. В текущей форме расстояния являются целыми числами, хотя. Не следует слишком сильно переписать в C ++.

0
ответ дан 17 December 2019 в 07:10
поделиться