Как я могу построить результат смешанной целочисленной задачи? - PullRequest
0 голосов
/ 01 мая 2019

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

list=[([0.0; 583000.0], 0), ([190670.0; 149600.0], 0), ([69686.0, 385000.0], 1), ([33296.0, 484000.0], 1), ([136554.0, 2.38075e5], 1), ([24556.0, 503800.0], 0), ([47462.0, 437800.0], 1), ([129686.0, 253000.0], 1), ([164278.0, 178200.0], 1)]

В этом списке третья точка ([69686.0, 385000.0], 1) второй элемент 1 определяет, что эта точка, соединенная линией с предыдущей точкой ([190670.0; 149600.0], 0), связана со второй точкой линией.

Я кодировал это следующим образом:

using  JuMP,Plots

list=[([0.0, 583000.0], 0), ([24556.0, 503800.0], 0), ([33296.0, 484000.0],1), ([47462.0, 437800.0], 1), ([69686.0, 385000.0], 1), ([129686.0, 253000.0], 1), ([136554.0, 23805.0], 1), ([164278.0, 178200.0], 1), ([190670.0, 149600.0], 0)]

x=zeros(1,1)
for i=1:size(list,1)
    x=[x;list[i][1][1]]
end
row=1
x = x[setdiff(1:end, row), :]

y=zeros(1,1)
for i=1:size(list,1)
    y=[y;list[i][1][2]]
end
row=1
y = y[setdiff(1:end, row), :]

for i=2:size(list,1)
    if list[i][2]==0
        plot(Int(x[i]),Int(y[i]),seriestype=:scatter)
        plot(Int(x[i+1]),Int(y[i+1]),seriestype=:scatter)
    end
    if list[i][2]==1
        plot(Int(x[i]),Int(y[i]))
        plot(Int(x[i+1]),Int(y[i+1]))
    end
end

, но это не сработало.не могли бы вы помочь мне.спасибо

1 Ответ

1 голос
/ 01 мая 2019

Вы можете просто отправить значения x и y каждого сегмента линии в два отдельных массива, x и y в приведенном ниже коде. После значений каждого сегмента линии (то есть x1 и x2 или y1 и y2) поместите NaN в массивы. Это предотвратит подключение линейного сегмента к следующему, если не должно быть соединения. (например, в случае, если вы видите 1, а затем 0). И наконец plot(x, y).

Следующий фрагмент кода делает это. Обратите внимание, что allx и ally используются для хранения всех точек независимо от состояния соединения. Вы можете исключить связанные точки из них. x и y содержат соединенные отрезки.

using Plots
x, y, allx, ally = Float64[], Float64[], Float64[], Float64[]

# iterate through list
for i = 1:length(list)-1
    if list[i+1][2] == 1
        # push x1 from the first point, x2 from the second and a `NaN`
        push!(x, list[i][1][1], list[i+1][1][1], NaN)
        # push y1, y2, `NaN`
        push!(y, list[i][1][2], list[i+1][1][2], NaN)
    end
    push!(allx, list[i][1][1])
    push!(ally, list[i][1][2])
end
push!(allx, list[end][1][1])
push!(ally, list[end][1][2])
# scatter all points
scatter(allx, ally)
# plot connections with markers
plot!(x, y, linewidth=2, color=:red, marker=:circle)

Надеемся, это даст вам сюжет, который вы хотели.


Если вам случится использовать Gadfly.jl вместо Plots.jl, вы можете получить аналогичный сюжет с помощью

using Gadfly
connectedpoints = layer(x=x, y=y, Geom.path, Geom.point, Theme(default_color="red"))
allpoints = layer(x=allx, y=ally, Geom.point)

plot(connectedpoints, allpoints)

В качестве примечания, если вы планируете наносить еще одну серию поверх уже созданного объекта, вам следует использовать plot! вместо plot.

...