衣服浸染系統(tǒng)的調(diào)度算法
1000元
生產(chǎn)管理軟件開發(fā)
需求類型
一、問題背景:
1.有一批衣服需要依次浸染在一系列的染缸中來完成染色工作
2.通過控制夾爪帶動衣服在不同的染缸中浸染,夾爪的數(shù)量為n,不同夾爪之間運(yùn)動互不干涉
3.組成染色計(jì)劃的一系列步驟是提前確認(rèn)好的,每一步由"浸染染缸列表、浸染時間、最大可超時時間"組成,浸染染缸列表表示為了完成該步驟,可以選擇去往的染缸列表(可能為1個可能為多個),浸染時間表示該步驟需要衣服在染缸中浸染的時間,當(dāng)衣服在染缸中完成浸染時間后,最多還能停留"最大可超時時間",之后就必須立刻將衣服運(yùn)送至下一步驟指示的染缸(從原染缸中取出并運(yùn)送至下一步驟的染缸),如果某件衣服在染缸中浸染超過了浸染時間+最大可超時時間,則視為染色失敗,不允許有此類情況發(fā)生,一個染色計(jì)劃中的最大可超時時間會有三種,一種為0表示不可超時,一種為N表示可超時N秒,一種為null表示可無限期超時
4.染缸的數(shù)量有限,染缸的位置假設(shè)由(x,y)表示,(x,y)可以看做二維坐標(biāo)系上的一個點(diǎn),假設(shè)夾爪從染缸(a,b)移動到染缸(i,j)所需要的時間為"a-i"和"b-j"中絕對值較大的那一個,單位為秒,假設(shè)夾爪從染缸中提起衣服、放下衣服到染缸中不需要時間
5.當(dāng)一件衣服Y處于A染缸中時,其他衣服不能進(jìn)入該染缸,由于夾爪的運(yùn)動需要時間,如果夾爪不在A染缸上方,那么當(dāng)衣服Y快要結(jié)束浸染時,夾爪要提前開始運(yùn)動,保證在浸染完成前的一刻夾爪到達(dá)染缸A上方
6.需要染色的衣服數(shù)量為不確定的正整數(shù),每一件衣服使用相同的染色計(jì)劃,一個染缸中一次只能放置一件衣服進(jìn)行染色
7.染缸分為三種,一種為進(jìn)缸,用于存放外界放入系統(tǒng)中待染色的衣服,一種為浸染缸,用于進(jìn)行染色工作,一種為出缸,用于存放系統(tǒng)中已經(jīng)完成了染色工作的衣服,無論是哪種染缸,都只能存放一件衣服,進(jìn)缸和出缸的數(shù)量是有限的,但是假設(shè)一件已經(jīng)完成染色工作的衣服被送到出缸后,外界會立刻將其拿出(確保有限個數(shù)的出缸不會發(fā)生擁堵)
8.每一件衣服進(jìn)入系統(tǒng)的時間是不確定的,當(dāng)它被放置在進(jìn)缸后就表示其進(jìn)入了系統(tǒng)內(nèi),當(dāng)一件衣服進(jìn)入系統(tǒng)后需要由夾爪將其夾起進(jìn)行l(wèi)ogo識別(這會持續(xù)占用該夾爪),識別的時間為固定值N秒,識別成功后才能由系統(tǒng)決定是否開始該衣服的染色,可以選擇只進(jìn)行l(wèi)ogo識別,識別完成后再放回原進(jìn)缸內(nèi),也可以選擇識別完成后立刻開始對其進(jìn)行染色
9.如果開始某件衣服的染色工作會導(dǎo)致系統(tǒng)中衣服發(fā)生染色失敗的情況,則不能開始這件衣服的染色工作
二、問題:
隨機(jī)生成系統(tǒng)中的夾爪數(shù)量、染缸組成、染色計(jì)劃、衣服列表,當(dāng)以上條件都確定時,輸出一份夾爪的運(yùn)行軌跡計(jì)劃,使得所有衣服在最短的時間內(nèi)成功完成染色
三、C#語言建模:
/// <summary>
/// 代表一個染色步驟
/// </summary>
public class StepModel
{
/// <summary>
/// 代表該步驟的順序號
/// </summary>
public int StepID { get; set; }
/// <summary>
/// 該步驟的浸染時間
/// </summary>
public TimeSpan SoakTime { get; set; }
/// <summary>
/// 該步驟可接受的最大超時時間
/// </summary>
public TimeSpan MaxTimeOut { get; set; }
/// <summary>
/// 為了完成該步驟,可以選擇去往的染缸列表
/// </summary>
public List<DyeVatModel> AvailableDyeVat { get; set; }
public StepModel Clone()
{
return new StepModel()
{
StepID = StepID,
SoakTime = SoakTime,
MaxTimeOut = MaxTimeOut,
AvailableDyeVat = AvailableDyeVat
};
}
}
/// <summary>
/// 代表一個染色計(jì)劃
/// </summary>
public class DyePlanModel
{
/// <summary>
/// 代表組成該染色計(jì)劃的一系列染色步驟
/// </summary>
public List<StepModel> StepList { get; set; }
public DyePlanModel Clone()
{
var clone = new DyePlanModel() { StepList = new List<StepModel>() };
foreach (var item in this.StepList)
{
clone.StepList.Add(item);
}
return clone;
}
}
/// <summary>
/// 代表一個染缸
/// </summary>
public class DyeVatModel
{
/// <summary>
/// 該染缸的X坐標(biāo)
/// </summary>
public int X { get; set; }
/// <summary>
/// 該染缸的Y坐標(biāo)
/// </summary>
public int Y { get; set; }
/// <summary>
/// 該染缸中的正在進(jìn)行染色的衣服 null表示該染缸處于空閑狀態(tài)
/// </summary>
public ClothModel Cloth { get; set; }
/// <summary>
/// 計(jì)算夾爪從當(dāng)前染缸運(yùn)行到另一個染缸需要的時間
/// </summary>
/// <param name="otherDyeVat">另一個染缸</param>
/// <returns>運(yùn)動需要的時間</returns>
public TimeSpan GetRunTime(DyeVatModel otherDyeVat)
{
return new TimeSpan(0, 0, Math.Max(Math.Abs(this.X - otherDyeVat.X), Math.Abs(this.Y - otherDyeVat.Y)));
}
}
/// <summary>
/// 代表一件需要進(jìn)行染色的衣服
/// </summary>
public class ClothModel
{
/// <summary>
/// 該件衣服使用的染色計(jì)劃
/// </summary>
public DyePlanModel DyePlan { get; set; }
/// <summary>
/// 該件衣服當(dāng)前所處的染色步驟
/// </summary>
public StepModel CurrentStep { get; set; }
}
定制開發(fā)源碼交付其他不限
進(jìn)行中 2024-10-11發(fā)布
招標(biāo)-按項(xiàng)目付費(fèi)